<?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>Best Google Forms Alternatives in 2026 (Free &amp; Paid)</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Sun, 19 Apr 2026 17:49:37 +0000</pubDate>
      <link>https://forem.com/allenarduino/the-best-google-forms-alternatives-in-2026-free-and-paid-jnp</link>
      <guid>https://forem.com/allenarduino/the-best-google-forms-alternatives-in-2026-free-and-paid-jnp</guid>
      <description>&lt;p&gt;If you have been using Google Forms and hit a wall, you are not alone.&lt;/p&gt;

&lt;p&gt;Google Forms is free, and it works for basic surveys and internal data collection. But the moment you need custom branding, a professional-looking page, file uploads without a Google account, or a form that actually looks like your business, Google Forms starts showing its limits.&lt;/p&gt;

&lt;p&gt;In this article, I will walk through the best Google &lt;br&gt;
Forms alternatives in 2026, covering price, features, and which one is right for your use case.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why People Look for Google Forms Alternatives
&lt;/h2&gt;

&lt;p&gt;Here are the most common reasons people switch:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No custom branding.&lt;/strong&gt; Every Google Form looks like &lt;br&gt;
a Google Form. There is no way to make it look like your business, your event, or your brand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File uploads require a Google account.&lt;/strong&gt; If you add a file upload question to Google Forms, every respondent must sign in with a Google account to upload. &lt;br&gt;
No Google account means no upload. For customers, event participants, and external contacts, that is a real problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No shareable landing page.&lt;/strong&gt; Google Forms gives you a bare form on a white page. There is no hero section, no event details, no schedule, no photos. &lt;br&gt;
It does not look like something worth filling in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No HTML form backend.&lt;/strong&gt; If you have a static site or a custom HTML form, you cannot point it at Google Forms. You are stuck using their builder only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No instant email notifications.&lt;/strong&gt; Google Forms sends submissions to a Google Sheet. You have to check the sheet to see new responses. There is no instant email notification to your inbox by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No self-hosting or open source option.&lt;/strong&gt; Your data lives on Google's servers. If data ownership or GDPR compliance matters to you, Google Forms gives you no alternative.&lt;/p&gt;

&lt;p&gt;If any of those hit home, keep reading.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Best Google Forms Alternatives in 2026
&lt;/h2&gt;


&lt;h3&gt;
  
  
  1. Formgrid: Form Builder, Landing Page Templates,
&lt;/h3&gt;

&lt;p&gt;and Form Backend in One Place&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Event organizers, small businesses, and developers who want a form that looks professional and works without a backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it different:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most form tools pick a lane. Either a drag-and-drop form builder or a form backend for developers. &lt;br&gt;
Formgrid does both. And it adds something neither Google Forms nor most alternatives offer: world-class landing page templates that wrap your form in a complete branded page.&lt;/p&gt;

&lt;p&gt;Here is how it works:&lt;/p&gt;


&lt;h4&gt;
  
  
  Option A: Build a Form With a Landing Page Template
&lt;/h4&gt;

&lt;p&gt;This is the most powerful thing Formgrid does that &lt;br&gt;
Google Forms cannot.&lt;/p&gt;

&lt;p&gt;Instead of getting a bare form on a white page, you choose a professionally designed landing page template, and your form is embedded inside it. The result is a complete branded page that you are proud to share anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Sign Up and Create a Form&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Head to &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; and &lt;br&gt;
sign up with Google or your email address. &lt;br&gt;
No credit card required.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayfulytj8845e34vriww.png" alt=" " width="800" height="444"&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%2Fdbt8i4w6l2l6qt2x20d0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbt8i4w6l2l6qt2x20d0.png" alt=" " width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once logged in, you land on your dashboard. &lt;br&gt;
Click &lt;strong&gt;New Form&lt;/strong&gt; to get started.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.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;p&gt;&lt;strong&gt;Step 2: Open the Form Builder&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After creating your form, you will be taken to the form details page. Click &lt;strong&gt;Open Builder&lt;/strong&gt; to enter the form builder.&lt;/p&gt;

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



&lt;p&gt;&lt;strong&gt;Step 3: Choose a Landing Page Template&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where Formgrid goes beyond every other form tool on this list.&lt;/p&gt;

&lt;p&gt;At the top of the builder, click &lt;strong&gt;Choose Template&lt;/strong&gt;. &lt;br&gt;
A template gallery opens, showing professionally designed landing page templates for different industries and use cases.&lt;/p&gt;

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

&lt;p&gt;Templates available include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Horse Ride Registration&lt;/li&gt;
&lt;li&gt;Event Registration&lt;/li&gt;
&lt;li&gt;Wedding RSVP&lt;/li&gt;
&lt;li&gt;Photography Booking&lt;/li&gt;
&lt;li&gt;Cleaning Service Booking&lt;/li&gt;
&lt;li&gt;Personal Trainer Enquiry&lt;/li&gt;
&lt;li&gt;Real Estate Enquiry&lt;/li&gt;
&lt;li&gt;Plumbing Quote Request&lt;/li&gt;
&lt;li&gt;Job Application&lt;/li&gt;
&lt;li&gt;Blank Form&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Select the template that matches your use case, and Formgrid immediately loads a complete, beautiful landing page with your form embedded inside it.&lt;/p&gt;

&lt;p&gt;This is not a basic form on a white page. It is a full landing page that looks like a real business website.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Edit the Template Inline&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every piece of text on the page is editable. &lt;br&gt;
Click directly on any text element, and it becomes editable in place. Just like editing a document.&lt;/p&gt;

&lt;p&gt;Click on the headline and change it to your event name. &lt;br&gt;
Click on the date and update it. Click on the description and write something about your specific event or business.&lt;/p&gt;

&lt;p&gt;Change the primary color using the color picker on the right panel and the button, accents, and highlights across the entire page update instantly to match your brand.&lt;/p&gt;

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



&lt;p&gt;&lt;strong&gt;Step 5: Customize Your Form Fields&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Switch to the &lt;strong&gt;Form Fields&lt;/strong&gt; tab to add, remove, and reorder the fields in your form. Drag fields from the left sidebar onto the canvas. Every field is fully customizable with labels, placeholder text, required status, and validation rules.&lt;/p&gt;

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



&lt;p&gt;&lt;strong&gt;Step 6: Share Your Form Link&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you are happy with the page, click &lt;strong&gt;Save Changes&lt;/strong&gt;. &lt;br&gt;
Go back to the form details page and copy your unique shareable link.&lt;/p&gt;

&lt;p&gt;That link is a real, live landing page. Share it &lt;br&gt;
anywhere: WhatsApp groups, email newsletters, Instagram bio, Facebook events, or embed it on your website.&lt;/p&gt;

&lt;p&gt;Your participants or customers visit the link and see a complete branded page. Not a Google 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%2Fzdumqqbfjd11ehmkjhlp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzdumqqbfjd11ehmkjhlp.png" alt=" " 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%2Fmo5tvlct2kq6q1f5tn65.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmo5tvlct2kq6q1f5tn65.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Step 7: Receive Instant Email Notifications&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The moment someone submits the form, you receive an instant email notification with all their details formatted cleanly:&lt;/p&gt;

&lt;p&gt;New Registration: Blue Ridge Endurance&lt;br&gt;
Classic 2026&lt;br&gt;
Rider Name: Sarah Johnson&lt;br&gt;
Email: &lt;a href="mailto:sarah@email.com"&gt;sarah@email.com&lt;/a&gt;&lt;br&gt;
Phone: (555) 123-4567&lt;br&gt;
Horse Name: Midnight Storm&lt;br&gt;
Division: 50 Mile&lt;br&gt;
Experience: Advanced&lt;/p&gt;

&lt;p&gt;No checking a spreadsheet. No logging into a &lt;br&gt;
dashboard. Every submission arrives in your inbox the moment it happens.&lt;/p&gt;



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



&lt;p&gt;&lt;strong&gt;Step 8: View and Export Submissions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All submissions are stored in your Formgrid dashboard. Go to the &lt;strong&gt;Submissions&lt;/strong&gt; tab to view, search, filter, and export your complete &lt;br&gt;
list as a CSV file.&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%2F7r4slrdvxn387ncx2tv9.png" alt=" " width="800" height="444"&gt;
&lt;/h2&gt;
&lt;h4&gt;
  
  
  Option B: Use Your Existing HTML Form
&lt;/h4&gt;

&lt;p&gt;If you already have an HTML form on your website, just point it at your Formgrid endpoint URL. &lt;br&gt;
No other changes needed:&lt;br&gt;
&lt;/p&gt;

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

  &lt;span class="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;Formgrid handles receiving submissions, sending email notifications, and storing the data. Your form stays exactly as it is.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;World-class landing page templates for different 
industries&lt;/li&gt;
&lt;li&gt;Inline text editing directly on the template&lt;/li&gt;
&lt;li&gt;Drag and drop form builder with shareable link&lt;/li&gt;
&lt;li&gt;HTML form endpoint for static sites&lt;/li&gt;
&lt;li&gt;File uploads from anyone without a Google account&lt;/li&gt;
&lt;li&gt;Instant email notifications&lt;/li&gt;
&lt;li&gt;Submissions dashboard with CSV export&lt;/li&gt;
&lt;li&gt;Spam protection with honeypot and rate limiting&lt;/li&gt;
&lt;li&gt;Color picker for brand matching&lt;/li&gt;
&lt;li&gt;Auto-responder emails on Business plan&lt;/li&gt;
&lt;li&gt;Google Sheets native integration on Business plan&lt;/li&gt;
&lt;li&gt;Webhooks on Business plan&lt;/li&gt;
&lt;li&gt;Self-hostable with Docker&lt;/li&gt;
&lt;li&gt;100% open source under MIT license&lt;/li&gt;
&lt;li&gt;GDPR friendly with no tracking&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Submissions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0/month&lt;/td&gt;
&lt;td&gt;25/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium&lt;/td&gt;
&lt;td&gt;$8/month&lt;/td&gt;
&lt;td&gt;1,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;td&gt;15,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The bottom line:&lt;/strong&gt; Google Forms is free but it &lt;br&gt;
gives you a bare form that looks nothing like your &lt;br&gt;
brand. Formgrid gives you a complete branded &lt;br&gt;
landing page with your form embedded inside it, &lt;br&gt;
instant email notifications, and a submissions &lt;br&gt;
dashboard starting at $8 per month.&lt;/p&gt;

&lt;p&gt;A horse riding club manager in San Diego found Formgrid through one of our blog posts. She was collecting ride registrations by email and manually scanning each one for rider and horse details. &lt;br&gt;
She set up a Formgrid registration page, shared the link with her 200 riders, and now every registration arrives in her inbox formatted and &lt;br&gt;
ready to act on. She upgraded to the Business plan at $29 per month without hesitation.&lt;/p&gt;

&lt;p&gt;That is the difference between a Google Form and &lt;br&gt;
a Formgrid landing page.&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. Tally: Clean Free Form Builder
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Non-technical users who want a clean, minimal form experience at no cost.&lt;/p&gt;

&lt;p&gt;Tally is a popular alternative with a simple interface. Their free plan is genuinely useful, with unlimited forms and unlimited responses, though some features are locked behind the paid plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unlimited forms and responses on the free plan&lt;/li&gt;
&lt;li&gt;Conditional logic&lt;/li&gt;
&lt;li&gt;File uploads on paid plan&lt;/li&gt;
&lt;li&gt;Notion integration&lt;/li&gt;
&lt;li&gt;Embeddable forms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free plan available. Paid plan at &lt;br&gt;
$29/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; No landing page templates. No HTML &lt;br&gt;
form backend. No self-hosting. No instant email &lt;br&gt;
notifications by default. No open source. Forms look like Tally forms, not like your brand.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Typeform: Best for Conversational Forms
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Marketers who want a beautiful conversational form experience for surveys and lead generation.&lt;/p&gt;

&lt;p&gt;Typeform pioneered the one question at a time conversational format. It produces high completion rates for surveys and research forms, and the design is genuinely beautiful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conversational one question at a time format&lt;/li&gt;
&lt;li&gt;Beautiful design templates&lt;/li&gt;
&lt;li&gt;Logic jumps and conditional branching&lt;/li&gt;
&lt;li&gt;Payment integrations&lt;/li&gt;
&lt;li&gt;Data analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free plan limited to 10 responses &lt;br&gt;
per month. Paid plans start at $25/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; Extremely limited free plan. No HTML &lt;br&gt;
form backend. No landing page templates. No &lt;br&gt;
self-hosting. No open source. Overkill and &lt;br&gt;
overpriced for simple contact forms or event &lt;br&gt;
registrations.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Jotform: Most Feature Rich
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Businesses that need advanced form logic, payment integrations, and a full form management suite.&lt;/p&gt;

&lt;p&gt;Jotform is the most feature-rich form builder on this list. Hundreds of templates, payment integrations, conditional logic, and approval &lt;br&gt;
workflows, PDF generation, and e-signatures. &lt;br&gt;
If you need advanced functionality, Jotform has it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10,000+ templates&lt;/li&gt;
&lt;li&gt;Payment integrations&lt;/li&gt;
&lt;li&gt;Conditional logic&lt;/li&gt;
&lt;li&gt;PDF generation&lt;/li&gt;
&lt;li&gt;E-signatures&lt;/li&gt;
&lt;li&gt;Approval workflows&lt;/li&gt;
&lt;li&gt;150+ integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free plan available with 100 monthly &lt;br&gt;
responses. Paid plans start at $34/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; Expensive. No HTML form backend. No &lt;br&gt;
self-hosting. No open source. Significant overkill &lt;br&gt;
for most small businesses and event organizers' &lt;br&gt;
use cases.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Web3Forms: Lightweight Form Backend
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who just need a simple form endpoint for their static site with no frills.&lt;/p&gt;

&lt;p&gt;Web3Forms is a lightweight form backend service. &lt;br&gt;
No form builder. No landing page templates. &lt;br&gt;
Just an endpoint URL you point your HTML form at.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple HTML form endpoint&lt;/li&gt;
&lt;li&gt;Email notifications&lt;/li&gt;
&lt;li&gt;Spam protection&lt;/li&gt;
&lt;li&gt;Free plan available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free plan available. Pro plan at &lt;br&gt;
$18/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; No form builder. No landing page &lt;br&gt;
templates. No submission dashboard on the free &lt;br&gt;
plan. No self-hosting. No file upload support &lt;br&gt;
at a reasonable price.&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;Google Forms&lt;/th&gt;
&lt;th&gt;Formgrid&lt;/th&gt;
&lt;th&gt;Tally&lt;/th&gt;
&lt;th&gt;Typeform&lt;/th&gt;
&lt;th&gt;Jotform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Form builder&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Landing page templates&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inline page editing&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML 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;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File upload (no Google account)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instant 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;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hostable&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom branding&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free submissions&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;25/month&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;10/month&lt;/td&gt;
&lt;td&gt;100/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starting price&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$8/month&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;td&gt;$25/month&lt;/td&gt;
&lt;td&gt;$34/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GDPR friendly&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

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

&lt;p&gt;You want a form that looks like a real business page, not a Google Form.&lt;/p&gt;

&lt;p&gt;You are an event organizer, photographer, cleaning service, or small business owner who shares form links with customers or participants.&lt;/p&gt;

&lt;p&gt;You need file uploads from people without a Google account.&lt;/p&gt;

&lt;p&gt;You want instant email notifications when someone submits.&lt;/p&gt;

&lt;p&gt;You need a form backend for your existing HTML site.&lt;/p&gt;

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

&lt;p&gt;GDPR compliance matters to you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Google Forms if:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need something completely free with unlimited responses.&lt;/p&gt;

&lt;p&gt;Branding and design do not matter.&lt;/p&gt;

&lt;p&gt;You are collecting internal data or running simple surveys within your organization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Tally if:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You want a clean, minimal form builder for free.&lt;/p&gt;

&lt;p&gt;You are a Notion user.&lt;/p&gt;

&lt;p&gt;You do not need landing page templates or &lt;br&gt;
an HTML form backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Typeform if:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need a conversational one-question-at-a-time &lt;br&gt;
time experience.&lt;/p&gt;

&lt;p&gt;You are running surveys or research forms where completion rate matters most.&lt;/p&gt;

&lt;p&gt;Visual design is your top priority, and budget is not a constraint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Jotform if:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need advanced logic, payments, approval workflows, and PDF generation.&lt;/p&gt;

&lt;p&gt;Budget is not a constraint.&lt;/p&gt;

&lt;p&gt;You are building complex enterprise forms.&lt;/p&gt;




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

&lt;p&gt;Google Forms is genuinely useful for basic internal surveys and simple data collection. &lt;br&gt;
If that is all you need, it is hard to argue against free.&lt;/p&gt;

&lt;p&gt;But the moment you need your form to look professional, collect file uploads from anyone without a Google account, and send you an instant email when someone submits, or give participants a page that reflects your brand and event, Google Forms falls short.&lt;/p&gt;

&lt;p&gt;Formgrid is the only tool on this list that combines world-class landing page templates, inline editing, an HTML form backend, and instant email notifications, and a submissions dashboard starting at $8 per month.&lt;/p&gt;

&lt;p&gt;You can try it 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. 25 submissions per month on the free plan to test your full setup.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full disclosure: I built Formgrid. I wrote &lt;br&gt;
this comparison as honestly as I could. If &lt;br&gt;
anything looks inaccurate, let me know in &lt;br&gt;
the comments.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>google</category>
      <category>productivity</category>
      <category>resources</category>
      <category>saas</category>
    </item>
    <item>
      <title>How to Build a Professional Quote Request Form With File Upload for Your Small Business</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Sat, 18 Apr 2026 15:34:47 +0000</pubDate>
      <link>https://forem.com/allenarduino/how-to-build-a-professional-quote-request-form-with-file-upload-for-your-small-business-3j25</link>
      <guid>https://forem.com/allenarduino/how-to-build-a-professional-quote-request-form-with-file-upload-for-your-small-business-3j25</guid>
      <description>&lt;p&gt;Your customer wants a quote.&lt;/p&gt;

&lt;p&gt;They visit your website, fill in your contact form, &lt;br&gt;
and hit send. You get an email with their name and &lt;br&gt;
a vague description of what they need.&lt;/p&gt;

&lt;p&gt;But where is the logo file? Where is the artwork? &lt;br&gt;
Where is the reference photo of the job they want done?&lt;/p&gt;

&lt;p&gt;It is not there. So you reply, asking them to send it. &lt;br&gt;
They send it in a separate email. Now the details are in one thread, and the file is in another. You are manually piecing together a quote before you have even started the actual work.&lt;/p&gt;

&lt;p&gt;This guide shows you how to fix that in under 20 minutes using a free HTML template and Formgrid as the form backend. &lt;br&gt;
No coding experience required. &lt;br&gt;
No monthly fees to get started. No backend to build.&lt;/p&gt;


&lt;h2&gt;
  
  
  What You Will End Up With
&lt;/h2&gt;

&lt;p&gt;By the end of this guide, you will have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A professional multi-section quote request page 
deployed live on the internet&lt;/li&gt;
&lt;li&gt;A file upload field that accepts artwork, logos, 
photos, and design files from customers&lt;/li&gt;
&lt;li&gt;An instant email notification every time someone 
submits a quote request with all their details 
and their uploaded file&lt;/li&gt;
&lt;li&gt;A submissions dashboard where you can view and 
manage every quote request in one place&lt;/li&gt;
&lt;li&gt;A live pricing estimate that updates as the 
customer fills in the form&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is what the finished quote request page &lt;br&gt;
looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://allenarduino.github.io/formgrid-examples/industries/quote-request-form/" rel="noopener noreferrer"&gt;Link to Demo&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%2Fyav706l5zpak6yw0lukv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyav706l5zpak6yw0lukv.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The template includes a branded hero panel with trust points and stats, a five-section quote form with file upload, a live pricing estimate panel, and a slim footer with your contact details. &lt;br&gt;
All in one self-contained HTML file.&lt;/p&gt;


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

&lt;p&gt;This guide is for small business owners who need &lt;br&gt;
customers to submit files alongside a quote request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom apparel and print shops collecting 
artwork files for t-shirts, hats, and hoodies&lt;/li&gt;
&lt;li&gt;Photographers asking clients to upload 
reference images before a shoot&lt;/li&gt;
&lt;li&gt;Graphic designers collecting client logos 
and brand assets&lt;/li&gt;
&lt;li&gt;Contractors asking customers to upload 
photos of the job site&lt;/li&gt;
&lt;li&gt;Embroidery shops receiving design files 
from customers&lt;/li&gt;
&lt;li&gt;Any business where customers need to send 
you a file before you can give them a price&lt;/li&gt;
&lt;/ul&gt;


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

&lt;ul&gt;
&lt;li&gt;A free Formgrid account at 
&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A free Netlify account at 
&lt;a href="https://netlify.com" rel="noopener noreferrer"&gt;netlify.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A text editor (VS Code, Sublime Text, or 
even Notepad works fine)&lt;/li&gt;
&lt;li&gt;About 20 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No Node.js. No build tools. No command line required.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 1: Get the Template From GitHub
&lt;/h2&gt;

&lt;p&gt;Go to the Formgrid examples repository:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/allenarduino/formgrid-examples" rel="noopener noreferrer"&gt;github.com/allenarduino/formgrid-examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will see a collection of free HTML templates built for different industries. &lt;br&gt;
Find the &lt;strong&gt;Quote Request&lt;/strong&gt; template. You will see&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;quote-request-form:&lt;/strong&gt; A clean, focused version with just the brand panel, form, and live estimate. &lt;br&gt;
Best for businesses that want to embed or share a standalone quote page.&lt;/p&gt;

&lt;p&gt;You have two options to get the files:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A: Clone with Git&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you have Git installed, open your terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/allenarduino/formgrid-examples.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then navigate to the quote request template folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option B: Download as ZIP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click the green &lt;strong&gt;Code&lt;/strong&gt; button on the GitHub page &lt;br&gt;
and select &lt;strong&gt;Download ZIP&lt;/strong&gt;. Extract the folder to your desktop.&lt;/p&gt;

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

&lt;p&gt;Open the folder, and you will find either &lt;br&gt;
&lt;strong&gt;quote-request-form/index.html&lt;/strong&gt; or &lt;/p&gt;

&lt;p&gt;Open it in your browser right now by double-clicking it. You will see the full professional quote request page working locally on your computer. The only thing missing is a real form endpoint so submissions go somewhere.&lt;/p&gt;

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


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

&lt;p&gt;Go to &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; and &lt;br&gt;
sign up with Google or your email address.&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%2Fayfulytj8845e34vriww.png" alt=" " width="800" height="444"&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%2Fdbt8i4w6l2l6qt2x20d0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbt8i4w6l2l6qt2x20d0.png" alt=" " width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No credit card required. The free plan gives you 25 submissions per month, which is enough to test your entire setup before you go live.&lt;/p&gt;

&lt;p&gt;Once you sign up, you land on the Formgrid dashboard.&lt;/p&gt;

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


&lt;h2&gt;
  
  
  Step 3: Create a New Form
&lt;/h2&gt;

&lt;p&gt;From the dashboard click &lt;strong&gt;New Form&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Give it a name that reflects your business. &lt;br&gt;
Something like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apex Studio: Quote Requests&lt;/li&gt;
&lt;li&gt;LP Custom Tees: Quote Form&lt;/li&gt;
&lt;li&gt;Studio Quote Requests 2026&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%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;p&gt;Click &lt;strong&gt;Create Form&lt;/strong&gt; and you will be taken &lt;br&gt;
to the form details page.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4: Copy Your Endpoint URL
&lt;/h2&gt;

&lt;p&gt;On the form details page, you will see a section called &lt;strong&gt;Endpoint Information&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your endpoint URL looks 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;Click &lt;strong&gt;Copy&lt;/strong&gt; next to the endpoint URL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%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;p&gt;This URL is your form backend. When a customer fills in the quote request form and uploads their artwork file, everything is sent to this URL. Formgrid receives it, stores it in your dashboard, and sends you an instant email notification with all the details and a link to download the file.&lt;/p&gt;

&lt;p&gt;Keep this URL copied. You need it in the next step.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 5: Enable File Uploads
&lt;/h2&gt;

&lt;p&gt;File uploads are available on the Premium plan &lt;br&gt;
at $8 per month.&lt;/p&gt;

&lt;p&gt;Go to your billing page at &lt;br&gt;
&lt;a href="https://formgrid.dev/app/dashboard/billing" rel="noopener noreferrer"&gt;formgrid.dev/app/dashboard/billing&lt;/a&gt; &lt;br&gt;
and upgrade to Premium.&lt;/p&gt;

&lt;p&gt;Once you are on Premium, your form will accept file uploads, and the files will be delivered to your inbox alongside the submission details.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 6: Add Your Endpoint URL to the Template
&lt;/h2&gt;

&lt;p&gt;Open the HTML file in your text editor.&lt;/p&gt;

&lt;p&gt;Use the Find function (Ctrl+F or Cmd+F) &lt;br&gt;
and search for:&lt;br&gt;
YOUR_FORMGRID_ENDPOINT_URL&lt;/p&gt;

&lt;p&gt;You will find it in the JavaScript section &lt;br&gt;
near the bottom of the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_FORMGRID_ENDPOINT_URL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;strong&gt;YOUR_FORMGRID_ENDPOINT_URL&lt;/strong&gt; with your &lt;br&gt;
actual Formgrid endpoint URL. It should look like &lt;br&gt;
this after the change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;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="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="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="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;Save the file.&lt;/p&gt;

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

&lt;p&gt;That one change connects your quote request page to Formgrid. Every submission, including the uploaded file, now goes directly to your inbox &lt;br&gt;
and your dashboard.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 7: Customize the Template for Your Business
&lt;/h2&gt;

&lt;p&gt;Now open the file in your text editor and make the template your own.&lt;/p&gt;

&lt;p&gt;Here are the key things to update:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The page title&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find this near the top of the file:&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;title&amp;gt;&lt;/span&gt;Get a Quote — Apex Studio&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change it to your business name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The business name in the nav&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the nav logo section:&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;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"nav-name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Apex Studio&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change this to your business name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The phone number&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the nav phone link:&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;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"tel:+16304415244"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"nav-phone"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  (630) 441-5244
&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace with your actual phone number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hero headline&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the h1 in the brand panel:&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;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"brand-h1 anim-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  GET YOUR&lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;em&amp;gt;&lt;/span&gt;FREE&lt;span class="nt"&gt;&amp;lt;/em&amp;gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  QUOTE
&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can leave this as is or change it to something more specific to your business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The trust points&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the three trust items and update the text to reflect your actual business promises:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"trust-text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Response within 24 hours&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;
  We review your artwork and send a final 
  itemized quote.
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The stats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the three stat boxes and update them to reflect your business:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bstat-num"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;600&lt;span class="nt"&gt;&amp;lt;em&amp;gt;&lt;/span&gt;+&lt;span class="nt"&gt;&amp;lt;/em&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bstat-label"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Orders Completed&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The product dropdown&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the product selector and update the options to match what your business actually offers:&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;select&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"product"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"product"&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;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Select a product&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;option&amp;gt;&lt;/span&gt;Standard T-Shirt (Heat Print / DTF)&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;option&amp;gt;&lt;/span&gt;Standard T-Shirt (Screen Printed)&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- Add your own products here --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The pricing data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the PRICING object in the JavaScript section and update the price ranges to match your actual pricing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PRICING&lt;/span&gt; &lt;span class="o"&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;Standard T-Shirt (Heat Print / DTF)&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;base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;8.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;14.00&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;minQty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&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;Update the min and max values for each product to reflect what you actually charge. The live estimate panel updates automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The footer contact details&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the footer and update the email, phone, and address:&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;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"mailto:hello@apexstudio.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  hello@apexstudio.com
&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The colors&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At the top of the file in the CSS variables section, you will find:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--amber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#e8a020&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--black&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0a0a08&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--cream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f5f2ea&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;Change the amber accent color to match your brand. &lt;br&gt;
Every button, highlight, and accent across the page 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%2F9ey51t2tm7jmxjs0j1os.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ey51t2tm7jmxjs0j1os.png" alt=" " width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Test Your Form Locally
&lt;/h2&gt;

&lt;p&gt;Before you deploy, test that the form submission and file upload work correctly.&lt;/p&gt;

&lt;p&gt;Open the HTML file in your browser by double-clicking it. Fill in all the fields, attach a test file, and hit submit.&lt;/p&gt;

&lt;p&gt;Check two things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your Formgrid submissions dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to your form on &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; &lt;br&gt;
and click the &lt;strong&gt;Submissions&lt;/strong&gt; tab. Your test submission should include all fields and a download link for the uploaded file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.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;&lt;strong&gt;Your email inbox&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You should have received an instant notification with all the quote details formatted cleanly and a link to download the attached file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh940c5xzw0c1b8bu27gm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh940c5xzw0c1b8bu27gm.png" alt=" " width="800" height="497"&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%2F8lsw7ku8dxk5fg6ozeid.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8lsw7ku8dxk5fg6ozeid.png" alt=" " width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If both of those worked, your template is connected and ready to deploy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9: Deploy to Netlify
&lt;/h2&gt;

&lt;p&gt;Netlify is the simplest way to get a static HTML file live on the internet for free.&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://netlify.com" rel="noopener noreferrer"&gt;netlify.com&lt;/a&gt; and create a free account if you do not have one already.&lt;/p&gt;

&lt;p&gt;Once you are logged in to the Netlify dashboard, you will see a large drag-and-drop area that says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Want to deploy a new site without connecting &lt;br&gt;
to Git? Drag and drop your site output folder here."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Take the folder containing your HTML file and drag it directly onto that area.&lt;/p&gt;

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

&lt;p&gt;Netlify uploads your file and gives you a live &lt;br&gt;
URL in about 30 seconds. It looks something like:&lt;br&gt;
&lt;a href="https://random-name-abc123.netlify.app" rel="noopener noreferrer"&gt;https://random-name-abc123.netlify.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the URL, and your quote request page is &lt;br&gt;
live on the internet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 10: Give Your Site a Better URL
&lt;/h2&gt;

&lt;p&gt;The random Netlify URL works, but it is not what you want to put on your business cards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A: Custom Netlify subdomain (free)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In your Netlify site settings, go to &lt;br&gt;
&lt;strong&gt;Site Configuration&lt;/strong&gt; then &lt;strong&gt;Change site name&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can change it to something like:&lt;br&gt;
apex-studio-quote.netlify.app&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option B: Your own domain (if you have one)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you already own a domain, you can point it to Netlify in the &lt;strong&gt;Domain Management&lt;/strong&gt; section of your site settings. Netlify handles the SSL certificate automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Arrives in Your Inbox
&lt;/h2&gt;

&lt;p&gt;Every time a customer submits a quote request, you receive an email that looks like this:&lt;br&gt;
New Quote Request&lt;br&gt;
First Name: Sarah&lt;br&gt;
Last Name: Thompson&lt;br&gt;
Company: Lakewood Community Center&lt;br&gt;
Email: &lt;a href="mailto:sarah@lakewoodcc.org"&gt;sarah@lakewoodcc.org&lt;/a&gt;&lt;br&gt;
Phone: (555) 234-5678&lt;br&gt;
Project Type: New Design / First Order&lt;br&gt;
Product: Standard T-Shirt (Heat Print / DTF)&lt;br&gt;
Quantity: 150&lt;br&gt;
Decoration Method: Heat Print / DTF&lt;br&gt;
Placement: Full Front, Left Chest&lt;br&gt;
Need By Date: May 30, 2026&lt;br&gt;
Artwork: community-event-logo.pdf&lt;br&gt;
[Download File]&lt;br&gt;
Additional Instructions:&lt;br&gt;
Navy blue shirts. Logo on the left chest.&lt;br&gt;
Need them for our annual fundraiser gala.&lt;br&gt;
Open to color recommendations.&lt;/p&gt;

&lt;p&gt;Everything in one email. Name, contact details, what they need, how many, when they need it, and the artwork file ready to download.&lt;/p&gt;

&lt;p&gt;No back and forth asking for missing information. &lt;br&gt;
No hunting through two separate email threads. &lt;br&gt;
Just a complete quote request you can act on &lt;br&gt;
immediately.&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%2F3z3ib6wirkvc9mtjizys.png" alt=" " width="800" height="691"&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%2Fdn6h5k4acek8j0dsp5d3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdn6h5k4acek8j0dsp5d3.png" alt=" " width="800" height="674"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Managing Your Quote Requests
&lt;/h2&gt;

&lt;p&gt;Go to the &lt;strong&gt;Submissions&lt;/strong&gt; tab on your form details page on formgrid.dev to see every quote request in one place.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search for a specific customer by name or email&lt;/li&gt;
&lt;li&gt;View the full details of any submission&lt;/li&gt;
&lt;li&gt;Download attached files&lt;/li&gt;
&lt;li&gt;Export all quote requests as a CSV spreadsheet&lt;/li&gt;
&lt;li&gt;Mark submissions as read or responded to&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The CSV export is useful at the end of each month if you want to review your quote volume or track which products are most requested.&lt;/p&gt;




&lt;h2&gt;
  
  
  Upgrading When You Go Live
&lt;/h2&gt;

&lt;p&gt;The free plan gives you 25 submissions per month, which is enough to test your setup.&lt;/p&gt;

&lt;p&gt;When you go live, and quote requests start coming &lt;br&gt;
in you will want to upgrade:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Premium at $8 per month&lt;/strong&gt; gives you 1,000 &lt;br&gt;
submissions per month with file uploads included. &lt;br&gt;
This is the plan you need to accept artwork files from customers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business at $29 per month&lt;/strong&gt; gives you 15,000 &lt;br&gt;
submissions per month, plus auto-responder emails so every customer automatically receives a confirmation the moment they submit their quote request. Something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi Sarah, we have received your quote request &lt;br&gt;
for 150 t-shirts and will review your artwork &lt;br&gt;
and get back to you within one business day. &lt;br&gt;
Questions? Call us at (555) 000-1234.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That one automated email eliminates a significant number of follow-up calls from customers asking whether their request came through.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Beats Every Alternative
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Over a basic contact form&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Standard contact forms do not support file uploads. &lt;br&gt;
Your customer fills in their name and hits send. &lt;br&gt;
The artwork arrives in a separate email. You spend &lt;br&gt;
time matching the two. Formgrid receives everything &lt;br&gt;
together in one submission.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Over Google Forms&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google Forms cannot accept file uploads unless &lt;br&gt;
the submitter has a Google account. Formgrid &lt;br&gt;
accepts files from anyone with no account &lt;br&gt;
required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overbuilding your own backend&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building a file upload backend from scratch requires server configuration, file storage setup, security handling, and ongoing maintenance. Formgrid handles all of that so you can focus &lt;br&gt;
on your actual business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Over-expensive form tools&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jotform charges $49 per month. Typeform charges &lt;br&gt;
$29 to $99 per month. Formgrid is $8 per month &lt;br&gt;
for 1,000 submissions with file uploads included.&lt;/p&gt;




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

&lt;p&gt;Jose Pineda runs LP Custom Tees, a custom apparel shop in Aurora, Illinois. He was using a basic contact form, but it could not accept artwork files.&lt;/p&gt;

&lt;p&gt;He used AI to build a more advanced quote form and then searched for a form backend that could receive file uploads. He found Formgrid, added his endpoint URL, upgraded to Premium, and his new quote form was live the same day.&lt;/p&gt;

&lt;p&gt;Now every customer who requests a quote submits their artwork alongside their order details in one submission. Jose gets everything he needs to prepare an accurate quote in a single email.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get the Template
&lt;/h2&gt;

&lt;p&gt;The quote request templates and all other &lt;br&gt;
Formgrid HTML templates are available for &lt;br&gt;
free on GitHub:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/allenarduino/formgrid-examples" rel="noopener noreferrer"&gt;github.com/allenarduino/formgrid-examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Star the repo to stay updated as new templates are added.&lt;/p&gt;

&lt;p&gt;Templates currently available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quote Request with Live Estimate (this guide)&lt;/li&gt;
&lt;li&gt;Event Registration&lt;/li&gt;
&lt;li&gt;Horse Ride Registration&lt;/li&gt;
&lt;li&gt;Wedding RSVP&lt;/li&gt;
&lt;li&gt;Photography Booking&lt;/li&gt;
&lt;li&gt;Cleaning Service Booking&lt;/li&gt;
&lt;li&gt;Personal Trainer Enquiry&lt;/li&gt;
&lt;li&gt;Real Estate Enquiry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each template follows the same pattern. Clone it, add your Formgrid endpoint URL, customize the text and colors, and deploy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Start Collecting Quote Requests Today
&lt;/h2&gt;

&lt;p&gt;Your customers are sending you files in separate emails right now. Or they are filling in a bare contact form, and you are chasing them for their artwork afterward.&lt;/p&gt;

&lt;p&gt;This template fixes both of those problems in under 20 minutes.&lt;/p&gt;

&lt;p&gt;Clone the template. Sign up for Formgrid. Deploy &lt;br&gt;
to Netlify. Share the link.&lt;/p&gt;

&lt;p&gt;Your customers get a professional quote request experience that makes your business look established. You get complete quote requests in your inbox, artwork file included, ready to respond immediately.&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 to test your setup. Upgrade to Premium at $8 per month when you are ready to go live &lt;br&gt;
with file uploads.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about the template or the &lt;br&gt;
Formgrid setup? Email &lt;a href="mailto:allen@formgrid.dev"&gt;allen@formgrid.dev&lt;/a&gt; &lt;br&gt;
and I will help you get it working for &lt;br&gt;
your specific business.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Free Event Registration Page Template You Can Deploy in 20 Minutes</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Fri, 17 Apr 2026 23:11:50 +0000</pubDate>
      <link>https://forem.com/allenarduino/free-event-registration-page-template-you-can-deploy-in-20-minutes-3k06</link>
      <guid>https://forem.com/allenarduino/free-event-registration-page-template-you-can-deploy-in-20-minutes-3k06</guid>
      <description>&lt;p&gt;You have an event coming up, and you need a registration page.&lt;/p&gt;

&lt;p&gt;Not a Google Form. Not an Eventbrite listing that takes a cut of every ticket. A real, beautiful, branded registration page that &lt;br&gt;
looks like your event deserves to be attended.&lt;/p&gt;

&lt;p&gt;This guide shows you how to deploy a world-class event registration page using a free HTML template and Formgrid as the &lt;br&gt;
form backend. No coding experience required. &lt;br&gt;
No monthly fees to get started. No backend to build.&lt;/p&gt;

&lt;p&gt;You will be live in under 20 minutes.&lt;/p&gt;


&lt;h2&gt;
  
  
  What You Will End Up With
&lt;/h2&gt;

&lt;p&gt;By the end of this guide, you will have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A complete event registration landing page 
deployed live on the internet&lt;/li&gt;
&lt;li&gt;A working form that collects attendee details 
and sends them directly to your inbox&lt;/li&gt;
&lt;li&gt;A submissions dashboard where you can view 
and export all your registrations as CSV&lt;/li&gt;
&lt;li&gt;A professional page you are proud to share 
in WhatsApp groups, emails, and social media&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is what the finished page looks like:&lt;/p&gt;

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

&lt;p&gt;The template includes a hero section with your event name and stats, an animated ticker bar, a photo strip, an about section, event &lt;br&gt;
highlights, a full schedule timeline, and guest reviews, a how it works section, a CTA band, and a complete footer. &lt;br&gt;
All in one self-contained HTML file.&lt;/p&gt;


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

&lt;ul&gt;
&lt;li&gt;A free Formgrid account at 
&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A free Netlify account at 
&lt;a href="https://netlify.com" rel="noopener noreferrer"&gt;netlify.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A text editor (VS Code, Sublime Text, or 
even Notepad works fine)&lt;/li&gt;
&lt;li&gt;About 20 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is it. No Node.js. No build tools. No command line required.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 1: Get the Template From GitHub
&lt;/h2&gt;

&lt;p&gt;Go to the Formgrid examples repository:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/allenarduino/formgrid-examples" rel="noopener noreferrer"&gt;github.com/allenarduino/formgrid-examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will see a collection of free HTML templates &lt;br&gt;
built for different industries. Find the &lt;br&gt;
&lt;strong&gt;Event Registration&lt;/strong&gt; template.&lt;/p&gt;

&lt;p&gt;You have two options to get the files:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A: Clone with Git&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you have Git installed, open your terminal &lt;br&gt;
and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/allenarduino/formgrid-examples.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then navigate to the event registration &lt;br&gt;
template folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option B: Download as ZIP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click the green &lt;strong&gt;Code&lt;/strong&gt; button on the GitHub page and select &lt;strong&gt;Download ZIP&lt;/strong&gt;. &lt;br&gt;
Extract the folder to your desktop.&lt;/p&gt;

&lt;p&gt;Open the folder and you will find a single another folder called event-registration, in that folder you will find a file called &lt;br&gt;
file: &lt;strong&gt;index.html&lt;/strong&gt;&lt;br&gt;
If you want to copy the code directly, you can visit this link:&lt;br&gt;
&lt;a href="https://github.com/allenarduino/formgrid-examples/blob/main/industries/event-registration/index.html" rel="noopener noreferrer"&gt;https://github.com/allenarduino/formgrid-examples/blob/main/industries/event-registration/index.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open it in your browser right now by double-clicking it. You will see the full, beautiful registration page working locally on your computer. &lt;br&gt;
The only thing missing is a real form endpoint, so submissions &lt;br&gt;
go somewhere.&lt;/p&gt;

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


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

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

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

&lt;p&gt;No credit card required. The free plan gives you 25 submissions per month, which is enough to test the whole setup and run a small event.&lt;/p&gt;

&lt;p&gt;Once you sign up, you land on the Formgrid dashboard.&lt;/p&gt;

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


&lt;h2&gt;
  
  
  Step 3: Create a New Form
&lt;/h2&gt;

&lt;p&gt;From the dashboard click &lt;strong&gt;New Form&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Give your form a name that matches your event. &lt;br&gt;
Something like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Westside Community Gala 2026&lt;/li&gt;
&lt;li&gt;Annual Members Meetup: Summer Edition&lt;/li&gt;
&lt;li&gt;Blue Ridge Photography Workshop 2026&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Click &lt;strong&gt;Create Form&lt;/strong&gt;. You will be taken to the form details page.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4: Copy Your Endpoint URL
&lt;/h2&gt;

&lt;p&gt;On the form details page you will see a section called &lt;strong&gt;Endpoint Information&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your endpoint URL looks like this:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Click &lt;strong&gt;Copy&lt;/strong&gt; next to the endpoint URL.&lt;/p&gt;

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

&lt;p&gt;This URL is your form backend. When someone fills in the registration form on your page and hits submit, their details are sent to &lt;br&gt;
this URL. Formgrid receives the submission, stores it in your dashboard, and sends you an instant email notification.&lt;/p&gt;

&lt;p&gt;Keep this URL copied. You need it in the next step.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 5: Add Your Endpoint URL to the Template
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;event-registration-template.html&lt;/strong&gt; in your text editor.&lt;/p&gt;

&lt;p&gt;Use the Find function (Ctrl+F or Cmd+F) &lt;br&gt;
and search for:&lt;br&gt;
YOUR_FORMGRID_ENDPOINT_URL&lt;/p&gt;

&lt;p&gt;You will find it in the JavaScript section near the bottom of the file inside the form submit handler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_FORMGRID_ENDPOINT_URL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;strong&gt;YOUR_FORMGRID_ENDPOINT_URL&lt;/strong&gt; with your actual Formgrid endpoint URL. It should look like this after the change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;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="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="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="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;Save the file.&lt;/p&gt;

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

&lt;p&gt;That one change connects your beautiful registration page to Formgrid. Every submission now goes directly to your inbox and your dashboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Customize the Template for Your Event
&lt;/h2&gt;

&lt;p&gt;Now open the file in your text editor and make the template your own. Everything is clearly labeled in the HTML comments.&lt;/p&gt;

&lt;p&gt;Here are the key things to update:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The page title&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find this near the top of the file:&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;title&amp;gt;&lt;/span&gt;Westside Gala 2026 — Register Now&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change it to your event name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hero headline&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the hero section and update the h1:&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;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"anim-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  An evening worth&lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;em&amp;gt;&lt;/span&gt;remembering.&lt;span class="nt"&gt;&amp;lt;/em&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change this to something that captures your event. For a photography workshop, it might be:&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;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"anim-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Two days of learning&lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;em&amp;gt;&lt;/span&gt;and creating together.&lt;span class="nt"&gt;&amp;lt;/em&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The event description&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the hero description paragraph and replace the placeholder text with a sentence about your actual event.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The event stats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the three stat boxes in the hero and update the numbers and labels to match your event:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"stat-num"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;400&lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;+&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"stat-label"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Expected Guests&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change 400 to your expected attendance and update all three stats to reflect your event.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ticker bar&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the ticker section and update the &lt;br&gt;
items to match your event details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"ticker-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"ticker-dot"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  Saturday June 14, 2026
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update the date, venue name, dress code, and other details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The schedule timeline&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the timeline section and replace the placeholder schedule with your actual event schedule. Each timeline item follows this pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"timeline-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"timeline-time"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    6:30 PM
    &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;Saturday&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"timeline-content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h4&amp;gt;&lt;/span&gt;Doors Open and Welcome Reception&lt;span class="nt"&gt;&amp;lt;/h4&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Your description here.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"timeline-tag"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Your Tag&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The footer contact details&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find the footer and update the email address and phone number:&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;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"mailto:hello@westsidegala.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  hello@westsidegala.com
&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The colors&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At the top of the file in the CSS variables section, you will find:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--forest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1b3a2d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--gold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#c9973a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--cream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#faf6ee&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;Change these to match your event branding. &lt;br&gt;
The entire page updates automatically because every color reference in the file points back to these variables.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  Step 7: Test Your Form Locally
&lt;/h2&gt;

&lt;p&gt;Before you deploy, test that the form &lt;br&gt;
submission works.&lt;/p&gt;

&lt;p&gt;Open the HTML file in your browser by double-clicking it. Fill in the form with your own details and hit submit.&lt;/p&gt;

&lt;p&gt;Check two things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your Formgrid inbox&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to your form details page on &lt;br&gt;
&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; &lt;br&gt;
and click the &lt;strong&gt;Submissions&lt;/strong&gt; tab. &lt;br&gt;
You should see your test submission appear there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your email&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check the email address you signed up with. &lt;br&gt;
You should have received an instant notification with all the &lt;br&gt;
details you submitted.&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%2F6tq79p196ko6xzd1gt1c.png" alt=" " width="800" height="442"&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%2Fx5066v91xm2idkzsd9qi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx5066v91xm2idkzsd9qi.png" alt=" " width="800" height="488"&gt;&lt;/a&gt;&lt;br&gt;
If both of those worked, your template is connected and ready to deploy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Deploy to Netlify
&lt;/h2&gt;

&lt;p&gt;Netlify is the simplest way to get a static HTML file live on the internet for free.&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://netlify.com" rel="noopener noreferrer"&gt;netlify.com&lt;/a&gt; and create a free account if you do not have one already.&lt;/p&gt;

&lt;p&gt;Once you are logged in to the Netlify dashboard, you will see a large drag and drop area that says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Want to deploy a new site without &lt;br&gt;
connecting to Git? Drag and drop your &lt;br&gt;
site output folder here."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Take the folder containing your &lt;br&gt;
&lt;strong&gt;event-registration-template.html&lt;/strong&gt; &lt;br&gt;
file and drag it directly onto that area.&lt;/p&gt;

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

&lt;p&gt;Netlify uploads your file and gives you &lt;br&gt;
a live URL in about 30 seconds. It looks &lt;br&gt;
something like:&lt;br&gt;
&lt;a href="https://random-name-abc123.netlify.app" rel="noopener noreferrer"&gt;https://random-name-abc123.netlify.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the URL, and your event registration page is live on the internet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9: Give Your Site a Better URL
&lt;/h2&gt;

&lt;p&gt;The random Netlify URL works but it is not the kind of link you want to share in a WhatsApp group with 200 riders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A: Custom Netlify subdomain (free)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In your Netlify site settings go to &lt;br&gt;
&lt;strong&gt;Site Configuration&lt;/strong&gt; then &lt;strong&gt;Change site name&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can change it to something like:&lt;br&gt;
westside-gala-2026.netlify.app&lt;/p&gt;

&lt;p&gt;That is a much cleaner link to share.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option B: Your own domain (if you have one)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you already own a domain you can point it to Netlify in the &lt;strong&gt;Domain Management&lt;/strong&gt; section of your site settings. &lt;br&gt;
Netlify handles the SSL certificate &lt;br&gt;
automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happens When Someone Registers
&lt;/h2&gt;

&lt;p&gt;The moment an attendee submits the form &lt;br&gt;
on your live page two things happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You receive an instant email notification:&lt;/strong&gt;&lt;br&gt;
New Registration: Westside Gala 2026&lt;br&gt;
Name: Allen Jones&lt;br&gt;
Email: &lt;a href="mailto:allen@gmail.com"&gt;allen@gmail.com&lt;/a&gt;&lt;br&gt;
Phone: (555) 234-5678&lt;br&gt;
Ticket Type: VIP&lt;br&gt;
Number of Guests: 2&lt;br&gt;
Dietary Requirements: Vegetarian&lt;br&gt;
Notes: Looking forward to the evening!&lt;/p&gt;

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

&lt;p&gt;No inbox archaeology. No reply threads to dig through. Every registration arrives formatted and ready to read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The submission is saved to your dashboard:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to your form on formgrid.dev and click the &lt;strong&gt;Submissions&lt;/strong&gt; tab to see every registration. Search by name, view individual submissions, and export the complete attendee list as a CSV file with one 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%2Fapapml4dvz19zckll42k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapapml4dvz19zckll42k.png" alt=" " width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Upgrading When Your Registrations Open
&lt;/h2&gt;

&lt;p&gt;The free plan gives you 25 submissions &lt;br&gt;
per month, which is enough for testing and small events.&lt;/p&gt;

&lt;p&gt;When your registrations open, you will &lt;br&gt;
want to upgrade:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Premium at $8 per month&lt;/strong&gt; gives you &lt;br&gt;
1,000 submissions per month. Enough &lt;br&gt;
for most community events and workshops.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business at $29 per month&lt;/strong&gt; gives you &lt;br&gt;
15,000 submissions per month, plus auto-responder emails so every registrant automatically receives a confirmation message from you.&lt;/p&gt;

&lt;p&gt;The auto-responder is worth the upgrade &lt;br&gt;
on its own. Instead of manually replying to every registration confirmation request, every attendee gets an instant email the moment they submit:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Thank you for registering for the &lt;br&gt;
Westside Gala 2026. We have received &lt;br&gt;
your registration for 2 guests on &lt;br&gt;
the VIP plan. Doors open at 6:30 PM &lt;br&gt;
on Saturday June 14 at the Grand &lt;br&gt;
Westside Ballroom. We look forward &lt;br&gt;
to seeing you on the night.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One automated email. Zero inbox clutter.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Approach Beats Every Alternative
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Eventbrite&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eventbrite charges a service fee per &lt;br&gt;
ticket plus a payment processing fee. &lt;br&gt;
For a free community event, you still pay Eventbrite to host your page. &lt;br&gt;
For a paid event, they take a percentage of every ticket you sell.&lt;/p&gt;

&lt;p&gt;With this approach, you pay nothing to Eventbrite. Your registrations &lt;br&gt;
go directly to your inbox and dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Forms&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google Forms is free and functional, but it gives you a bare form on a &lt;br&gt;
white page with Google branding. &lt;br&gt;
There is no hero section, no event details, no schedule, no photos, &lt;br&gt;
and no customization that makes the page look like your event.&lt;/p&gt;

&lt;p&gt;This template gives you a complete event website in a single HTML file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building from scratch&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building a registration page from scratch takes days or weeks. &lt;br&gt;
This template is ready in 20 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get the Template
&lt;/h2&gt;

&lt;p&gt;The event registration template and all other Formgrid HTML templates are available for free on GitHub:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/allenarduino/formgrid-examples" rel="noopener noreferrer"&gt;github.com/allenarduino/formgrid-examples&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Star the repo to stay updated as new templates are added.&lt;/p&gt;

&lt;p&gt;Templates currently available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event Registration (this guide)&lt;/li&gt;
&lt;li&gt;Horse Ride Registration&lt;/li&gt;
&lt;li&gt;Wedding RSVP&lt;/li&gt;
&lt;li&gt;Photography Booking&lt;/li&gt;
&lt;li&gt;Cleaning Service Booking&lt;/li&gt;
&lt;li&gt;Personal Trainer Enquiry&lt;/li&gt;
&lt;li&gt;Real Estate Enquiry&lt;/li&gt;
&lt;li&gt;Plumbing Quote Request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each template follows the same pattern. &lt;br&gt;
Clone it, add your Formgrid endpoint URL, and customize the text &lt;br&gt;
and colors, and deploy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Start Your Registration Page Today
&lt;/h2&gt;

&lt;p&gt;Your event deserves a registration page that matches the effort you &lt;br&gt;
have put into organizing it.&lt;/p&gt;

&lt;p&gt;Clone the template. Sign up for Formgrid. Deploy to Netlify. &lt;br&gt;
Share the link.&lt;/p&gt;

&lt;p&gt;Your attendees get a registration experience that looks and feels &lt;br&gt;
professional. &lt;br&gt;
You get a clean attendee list in your inbox and dashboard. No chasing reply-all email threads to find out who is coming.&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. Upgrade when your &lt;br&gt;
registrations open.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about the template &lt;br&gt;
or the Formgrid setup? 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 live before your &lt;br&gt;
event opens.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>eventregistration</category>
      <category>forms</category>
    </item>
    <item>
      <title>The Simplest Way to Create a Horse Show Registration Form Online</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Fri, 17 Apr 2026 13:19:33 +0000</pubDate>
      <link>https://forem.com/allenarduino/the-simplest-way-to-create-a-horse-show-registration-form-online-34h5</link>
      <guid>https://forem.com/allenarduino/the-simplest-way-to-create-a-horse-show-registration-form-online-34h5</guid>
      <description>&lt;p&gt;If you are organizing an endurance ride, a horse show, or any equestrian event, you already know the problem.&lt;br&gt;
Entries come in by email. Some people forget to include their horse's name. Others send the wrong division.&lt;br&gt;
You spend hours chasing information that should have been on a form in the first place.&lt;/p&gt;

&lt;p&gt;The traditional fix is expensive event management software that charges per-entry fees, takes a cut of your registration fees, or locks you into a platform your participants have never heard of.&lt;/p&gt;

&lt;p&gt;There is a simpler way. This guide shows you how to build a professional horse show registration page in under 10 minutes using Formgrid, no coding, no expensive software, no per-entry fees.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Will End Up With
&lt;/h2&gt;

&lt;p&gt;By the end of this guide, you will have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A beautiful, branded registration page for your
participants can visit on any device&lt;/li&gt;
&lt;li&gt;A form that collects exactly the information
you need from each rider and horse&lt;/li&gt;
&lt;li&gt;An instant email notification every time
someone registers&lt;/li&gt;
&lt;li&gt;A submissions dashboard where you can view,
search, and export all your entries as a CSV&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is what the finished registration page&lt;br&gt;
looks like:&lt;/p&gt;

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




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

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

&lt;p&gt;No credit card required. The free plan gives you&lt;br&gt;
25 submissions per month, which is enough to test&lt;br&gt;
the whole setup before your entries 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%2F2td5782bmcfjpa30ew0l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2td5782bmcfjpa30ew0l.png" alt=" " width="800" height="444"&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%2F9zvxnjgjfol38b0u4ot3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9zvxnjgjfol38b0u4ot3.png" alt=" " width="800" height="633"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you sign up, you land on your dashboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Create a New Form
&lt;/h2&gt;

&lt;p&gt;From the dashboard click &lt;strong&gt;New Form&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Give your form a name that makes sense for your&lt;br&gt;
event. Something like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Descanso Endurance Ride 2026&lt;/li&gt;
&lt;li&gt;Spring Horse Show Entries&lt;/li&gt;
&lt;li&gt;Club Championship Registration&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Click &lt;strong&gt;Create Form&lt;/strong&gt; and you will be taken to&lt;br&gt;
the form details page.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Open the Form Builder
&lt;/h2&gt;

&lt;p&gt;On the form details page, you will see the&lt;br&gt;
&lt;strong&gt;Form Builder&lt;/strong&gt; section. Click &lt;strong&gt;Open Builder&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;This takes you into the Formgrid builder, where&lt;br&gt;
everything happens.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  Step 4: Choose the Horse Riding Template
&lt;/h2&gt;

&lt;p&gt;When the builder opens you will see a&lt;br&gt;
&lt;strong&gt;Choose Template&lt;/strong&gt; button at the top of the page.&lt;/p&gt;

&lt;p&gt;Click it. A template gallery appears, showing&lt;br&gt;
all the available landing page templates.&lt;/p&gt;

&lt;p&gt;Find the &lt;strong&gt;Horse Ride Registration&lt;/strong&gt; template&lt;br&gt;
and click &lt;strong&gt;Use This Template&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;The builder immediately loads a complete,&lt;br&gt;
professional horse ride registration page with a hero section, event details, registration form, and footer, all ready for you to customize.&lt;/p&gt;

&lt;p&gt;This is not a basic form on a white page. It is&lt;br&gt;
a full landing page that looks like a real event website.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Customize the Template to Match Your Event
&lt;/h2&gt;

&lt;p&gt;This is where it gets interesting. Every piece&lt;br&gt;
of text on the page is editable. You do not need&lt;br&gt;
to know any code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Switch to Page View
&lt;/h3&gt;

&lt;p&gt;At the top of the builder, you will see two buttons:&lt;br&gt;
&lt;strong&gt;Form Fields&lt;/strong&gt; and &lt;strong&gt;Page View&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Page View&lt;/strong&gt; to see and edit your&lt;br&gt;
landing 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%2Fav9tmem9m05tssxnievs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fav9tmem9m05tssxnievs.png" alt=" " width="800" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Edit Text by Clicking Directly on It
&lt;/h3&gt;

&lt;p&gt;Click any text element on the page to make it editable instantly. Just like editing a document.&lt;/p&gt;

&lt;p&gt;Click on the headline that says&lt;br&gt;
&lt;strong&gt;"Ride Registration 2026"&lt;/strong&gt; and change it to&lt;br&gt;
your actual ride name:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Blue Ridge Endurance Classic 2026&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Click on the date and change it to your event date.&lt;br&gt;
Click on the location and add your venue.&lt;br&gt;
Click on the description and write something that captures what makes your ride special.&lt;/p&gt;

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

&lt;p&gt;Every click saves you a support email from a&lt;br&gt;
confused participant who could not find the date.&lt;/p&gt;

&lt;h3&gt;
  
  
  Change the Colors to Match Your Brand
&lt;/h3&gt;

&lt;p&gt;On the right side panel, you will see a&lt;br&gt;
&lt;strong&gt;Primary Color&lt;/strong&gt; picker.&lt;/p&gt;

&lt;p&gt;Click it and choose a color that matches your&lt;br&gt;
club or event branding. The button, the accents,&lt;br&gt;
and the highlights across the entire page update&lt;br&gt;
instantly to match.&lt;/p&gt;

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

&lt;p&gt;You can also change the background color to&lt;br&gt;
give the page a completely different feel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Update Your Contact Details
&lt;/h3&gt;

&lt;p&gt;Scroll to the footer section of the template&lt;br&gt;
editor panel on the right. Update:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your club or organization name&lt;/li&gt;
&lt;li&gt;Your contact email address&lt;/li&gt;
&lt;li&gt;Your phone number&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These appear in the footer of your registration&lt;br&gt;
page so participants can reach you if they have&lt;br&gt;
questions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Customize Your Registration Form Fields
&lt;/h2&gt;

&lt;p&gt;Now switch back to &lt;strong&gt;Form Fields&lt;/strong&gt; by clicking&lt;br&gt;
the Form Fields button at the top.&lt;/p&gt;

&lt;p&gt;The horse ride template comes pre-loaded with the most common fields for an equestrian event.&lt;br&gt;
registration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rider Full Name&lt;/li&gt;
&lt;li&gt;Email Address&lt;/li&gt;
&lt;li&gt;Phone Number&lt;/li&gt;
&lt;li&gt;Horse Name&lt;/li&gt;
&lt;li&gt;Breed&lt;/li&gt;
&lt;li&gt;Division (50 Mile, 25 Mile, 12 Mile Intro,
Limited Distance)&lt;/li&gt;
&lt;li&gt;Experience Level&lt;/li&gt;
&lt;li&gt;Emergency Contact&lt;/li&gt;
&lt;li&gt;Additional Notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need to add more fields, like a waiver&lt;br&gt;
acknowledgment, a vet card number, or a&lt;br&gt;
t-shirt size, click &lt;strong&gt;Add Field&lt;/strong&gt; from the&lt;br&gt;
left sidebar and drag it into position on&lt;br&gt;
the canvas.&lt;/p&gt;

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

&lt;p&gt;You can make any field required or optional,&lt;br&gt;
change the label, add placeholder text, and&lt;br&gt;
reorder fields by dragging them up or down.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Preview Your Registration Page
&lt;/h2&gt;

&lt;p&gt;Want to see exactly what your participants&lt;br&gt;
will see before you share it?&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Page View&lt;/strong&gt; again to see the live&lt;br&gt;
preview of your complete registration page&lt;br&gt;
with all your customizations applied.&lt;/p&gt;

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

&lt;p&gt;Take a moment to read through it as if you were a participant. Is the date clear? Is the division selector labeled correctly? Does the page reflect your event's personality?&lt;/p&gt;

&lt;p&gt;Make any final adjustments by clicking directly&lt;br&gt;
on the text or updating the panel on the right.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Save Your Form
&lt;/h2&gt;

&lt;p&gt;When you are happy with everything, click&lt;br&gt;
&lt;strong&gt;Save Changes&lt;/strong&gt; at the top of the builder.&lt;/p&gt;

&lt;p&gt;Formgrid saves your template design, your&lt;br&gt;
form fields, and all your customizations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9: Share Your Registration Link
&lt;/h2&gt;

&lt;p&gt;Go back to the form details page. You will see&lt;br&gt;
your unique registration link.&lt;/p&gt;

&lt;p&gt;It looks something like this:&lt;/p&gt;

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

&lt;p&gt;This is a real, working landing page. Share&lt;br&gt;
it anywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Post it in your WhatsApp group&lt;/li&gt;
&lt;li&gt;Add it to your club website or Facebook page&lt;/li&gt;
&lt;li&gt;Put it in your event announcement email&lt;/li&gt;
&lt;li&gt;Share it in equestrian Facebook groups&lt;/li&gt;
&lt;li&gt;Add it to your Instagram bio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Participants visit the link, see your branded&lt;br&gt;
registration page, fill in the form, and hit&lt;br&gt;
submit. That is it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happens When Someone Registers
&lt;/h2&gt;

&lt;p&gt;The moment a participant submits the form, two things happen simultaneously.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;You receive an instant email notification&lt;/strong&gt;&lt;br&gt;
with all their details formatted cleanly:&lt;br&gt;
Blue Ridge Endurance Classic 2026&lt;/p&gt;

&lt;p&gt;Rider Name: Sarah Johnson&lt;br&gt;
Email: &lt;a href="mailto:sarah@email.com"&gt;sarah@email.com&lt;/a&gt;&lt;br&gt;
Phone: (555) 123-4567&lt;br&gt;
Horse Name: Midnight Storm&lt;br&gt;
Breed: Arabian&lt;br&gt;
Division: 50 Mile&lt;br&gt;
Experience Level: Advanced&lt;br&gt;
Additional Notes: First 50 at this ride.&lt;br&gt;
Looking forward 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%2Fpc4l42ixk2nzqc7bbypv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpc4l42ixk2nzqc7bbypv.png" alt=" " width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No more digging through a chain of reply-all emails trying to find someone's horse's name. Every registration arrives in your inbox in the same format, ready to read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The submission is also saved to your dashboard&lt;/strong&gt;&lt;br&gt;
where you can view every entry, search by name, filter by division, and export the complete list as a CSV file for your records or to share with your ride manager.&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%2F7r4slrdvxn387ncx2tv9.png" alt=" " width="800" height="444"&gt;
&lt;/h2&gt;

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

&lt;p&gt;Go to the &lt;strong&gt;Submissions&lt;/strong&gt; tab on your form&lt;br&gt;
details page to see everything in one place.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search for a specific rider by name&lt;/li&gt;
&lt;li&gt;See every detail they submitted&lt;/li&gt;
&lt;li&gt;Export all entries as a CSV spreadsheet&lt;/li&gt;
&lt;li&gt;Mark entries as read or responded&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are on the Business plan you can set up&lt;br&gt;
an auto-responder email that goes to every&lt;br&gt;
participant automatically when they register.&lt;br&gt;
Something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Thank you for entering the Descanso 50 Mile&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We have received your registration for
[Horse Name] in the [Division] division.
You will receive your ride packet information
and camp details approximately two weeks
before the ride. See you at the start line.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;That one automated email eliminates a week of&lt;br&gt;
answering the same question from 200 riders.&lt;/p&gt;




&lt;h2&gt;
  
  
  Upgrading When Your Entries Open
&lt;/h2&gt;

&lt;p&gt;The free plan gives you 25 submissions per month&lt;br&gt;
which is useful for testing and small events.&lt;/p&gt;

&lt;p&gt;When your entries open and registrations start coming in, you will want to upgrade to Premium at $8 per month for 1,000 submissions or&lt;br&gt;
Business at $29 per month for 15,000 submissions with the auto-responder and custom email templates included.&lt;/p&gt;

&lt;p&gt;For context, Annie, who manages the San Diego Endurance Riders events, use the Business plan for her ride registrations. At $29 per month it is a fraction of what dedicated event management software costs, and there are no per-entry fees.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Event Organizers Choose Formgrid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No per-entry fees.&lt;/strong&gt; Eventbrite and similar&lt;br&gt;
platforms charge a percentage of each registration. Formgrid charges a flat monthly fee regardless of how many entries you collect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your participants do not need an account.&lt;/strong&gt;&lt;br&gt;
They just visit the link, fill in the form, and submit. No login required. No app to download.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Works on any device.&lt;/strong&gt; The registration page&lt;br&gt;
looks great on a phone, tablet, or desktop.&lt;br&gt;
Most of your participants will register on their phones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You own your data.&lt;/strong&gt; Every submission is yours.&lt;br&gt;
Export it anytime as a CSV. No lock-in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instant notifications.&lt;/strong&gt; You know the moment&lt;br&gt;
someone registers. No logging into a platform&lt;br&gt;
to check. It arrives in your email inbox just&lt;br&gt;
like any other message.&lt;/p&gt;




&lt;h2&gt;
  
  
  Start Your Registration Page Today
&lt;/h2&gt;

&lt;p&gt;Setting up your horse show or endurance ride registration page takes less than 10 minutes.&lt;/p&gt;

&lt;p&gt;The template does the heavy lifting. You just&lt;br&gt;
fill in your event details, pick your colors, and share the link.&lt;/p&gt;

&lt;p&gt;Your participants get a professional registration experience. &lt;br&gt;
You get clean, organized entries&lt;br&gt;
in your inbox and dashboard. Nobody has to chase anyone by email.&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;
Upgrade when your entries open.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about setting up your registration&lt;br&gt;
form? Email &lt;a href="mailto:allen@formgrid.dev"&gt;allen@formgrid.dev&lt;/a&gt; and I will help&lt;br&gt;
you get it live before your entries open.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Build a Waitlist Page for Your Startup in 2026</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Sat, 11 Apr 2026 11:00:39 +0000</pubDate>
      <link>https://forem.com/allenarduino/how-to-build-a-waitlist-page-for-your-startup-in-2026-21ag</link>
      <guid>https://forem.com/allenarduino/how-to-build-a-waitlist-page-for-your-startup-in-2026-21ag</guid>
      <description>&lt;p&gt;You have an idea. Maybe you are still building it. Maybe &lt;br&gt;
it is ready, but you want to build an audience before you &lt;br&gt;
launch. Either way, the worst thing you can do is wait until launch day to start collecting emails.&lt;/p&gt;

&lt;p&gt;A waitlist page solves that problem. It lets you validate &lt;br&gt;
demand, build excitement, and collect real email addresses &lt;br&gt;
from genuinely interested people  before you write a single line of production code or spend a dollar &lt;br&gt;
on ads.&lt;/p&gt;

&lt;p&gt;In this guide, you will build a complete, working waitlist &lt;br&gt;
page from scratch using plain HTML and CSS, with a form &lt;br&gt;
backend powered by &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid.dev&lt;/a&gt;. &lt;br&gt;
Every email collected goes straight to your inbox and your dashboard. No backend. No server. No complex setup.&lt;/p&gt;

&lt;p&gt;By the end, you will have a live waitlist page you can &lt;br&gt;
deploy on GitHub Pages, Netlify, Cloudflare Pages, or &lt;br&gt;
any static host for free.&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%2Fbv9rw4o31ax7jjjupqjk.png" alt=" " width="800" height="443"&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Why a Waitlist Page Matters Before You Launch
&lt;/h2&gt;

&lt;p&gt;Most founders make the same mistake. They build for &lt;br&gt;
months, launch to the public, and discover nobody is &lt;br&gt;
waiting. The problem was not the product. It was the &lt;br&gt;
absence of a pre-launch audience.&lt;/p&gt;

&lt;p&gt;A waitlist page does three things at once:&lt;/p&gt;

&lt;p&gt;It validates demand. If people will not give you their &lt;br&gt;
email address, they will not give you their money either. &lt;br&gt;
A hundred signups before launch is proof that real humans &lt;br&gt;
care about what you are building.&lt;/p&gt;

&lt;p&gt;It gives you a launch list. When you are ready to go &lt;br&gt;
live, you have a warm audience to email. That first wave &lt;br&gt;
of users does not come from cold outreach. It comes from &lt;br&gt;
people who already said yes.&lt;/p&gt;

&lt;p&gt;It creates momentum. Showing "1,200 people on the &lt;br&gt;
waitlist" on your landing page is social proof that &lt;br&gt;
compounds. Every new visitor sees it and thinks, &lt;br&gt;
"maybe I should sign up too."&lt;/p&gt;

&lt;p&gt;The good news: you do not need a fancy tool or a &lt;br&gt;
monthly subscription to build one. You need HTML, &lt;br&gt;
CSS, and a form backend.&lt;/p&gt;


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

&lt;p&gt;A clean, professional waitlist page with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A compelling hero section with your headline 
and value proposition&lt;/li&gt;
&lt;li&gt;A working email capture form&lt;/li&gt;
&lt;li&gt;A success message after submission&lt;/li&gt;
&lt;li&gt;Spam protection built in&lt;/li&gt;
&lt;li&gt;Email notification to your inbox on every signup&lt;/li&gt;
&lt;li&gt;A submission dashboard to track all your signups&lt;/li&gt;
&lt;/ul&gt;


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

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

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

&lt;p&gt;No credit card required. The free plan gives you &lt;br&gt;
50 submissions per month, which is more than enough &lt;br&gt;
to validate your idea before you launch.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 2: Create a New Form
&lt;/h2&gt;

&lt;p&gt;Once logged in, click &lt;strong&gt;New Form&lt;/strong&gt; from your dashboard.&lt;/p&gt;

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

&lt;p&gt;Name your form something descriptive, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Waitlist Signups"&lt;/li&gt;
&lt;li&gt;"Early Access"&lt;/li&gt;
&lt;li&gt;"Pre-Launch Leads"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click &lt;strong&gt;Create Form&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 3: Copy Your Endpoint URL
&lt;/h2&gt;

&lt;p&gt;Go to the &lt;strong&gt;Overview&lt;/strong&gt; tab of your new form and &lt;br&gt;
copy your unique endpoint URL.&lt;/p&gt;

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

&lt;p&gt;It looks 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;This is the URL your waitlist form will submit &lt;br&gt;
data to. Keep it handy for the next step.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4: Build Your Waitlist Page
&lt;/h2&gt;

&lt;p&gt;Create a new file called &lt;code&gt;index.html&lt;/code&gt; and paste &lt;br&gt;
this complete waitlist page. Replace &lt;br&gt;
&lt;code&gt;YOUR_FORMGRID_ENDPOINT_URL&lt;/code&gt; with the endpoint &lt;br&gt;
you copied in Step 3, and update the headline, &lt;br&gt;
description, and colours to match your product.&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="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; 
        &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, 
                 initial-scale=1.0"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Join the Waitlist&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preconnect"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://fonts.googleapis.com"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preconnect"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://fonts.gstatic.com"&lt;/span&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt;
    &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://fonts.googleapis.com/css2?family=Outfit:wght@600;700;800&amp;amp;family=Plus+Jakarta+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400&amp;amp;display=swap"&lt;/span&gt;
    &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt;
  &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;*,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nd"&gt;::before&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;box-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="py"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1d4f3d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;--brand-light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#e8f3ee&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;--text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#111827&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;--muted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#6b7280&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;--border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#e5e7eb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;--bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f9fafb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;--font-sans&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Plus Jakarta Sans"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;-apple-system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BlinkMacSystemFont&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;"Segoe UI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;--font-display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Outfit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;"Plus Jakarta Sans"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--font-sans&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--bg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;min-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100vh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;-webkit-font-smoothing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;antialiased&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;-moz-osx-font-smoothing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grayscale&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;/* NAV */&lt;/span&gt;
    &lt;span class="nc"&gt;.site-nav&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sticky&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;z-index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.92&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="py"&gt;backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;-webkit-backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;border-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;229&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;231&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;235&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;inset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt; &lt;span class="m"&gt;-4px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;39&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.06&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.site-nav-inner&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1100px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;94vw&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1.25rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4vw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;space-between&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.logo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--font-sans&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.65rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;800&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;letter-spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-0.02em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt; &lt;span class="m"&gt;0.2s&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.logo&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.logo-mark&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="m"&gt;145deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="m"&gt;#163d30&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;79&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;flex-shrink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.logo-mark&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;inset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.35&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.logo-text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex-start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.logo-name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.15&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.logo-kicker&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.65rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;letter-spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.12em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;text-transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;uppercase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--muted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.nav-cta&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.875rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;999px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;79&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand-light&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="m"&gt;0.2s&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;border-color&lt;/span&gt; &lt;span class="m"&gt;0.2s&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;white-space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;nowrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.nav-cta&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#dceee5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;79&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.35&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;480px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nc"&gt;.logo-kicker&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nc"&gt;.logo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nc"&gt;.logo-mark&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="nc"&gt;.nav-cta&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.8125rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.45rem&lt;/span&gt; &lt;span class="m"&gt;0.75rem&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="c"&gt;/* HERO — wide column, large type */&lt;/span&gt;
    &lt;span class="nc"&gt;.hero&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;8vw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;6rem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1.25rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4vw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1100px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;94vw&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.badge&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand-light&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--font-sans&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.8125rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;letter-spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.14em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;text-transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;uppercase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;999px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1.25rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3.5vw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.hero&lt;/span&gt; &lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--font-display&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3.125rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;9vw&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="m"&gt;0.75rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5.75rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;800&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;letter-spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-0.035em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.02&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1.25rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3vw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.hero&lt;/span&gt; &lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="nc"&gt;.hero-accent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;800&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;@supports&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;-webkit-background-clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;or&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;background-clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nc"&gt;.hero&lt;/span&gt; &lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="nc"&gt;.hero-accent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="m"&gt;120deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="m"&gt;#2d7a5c&lt;/span&gt; &lt;span class="m"&gt;45%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="m"&gt;#1a5c46&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nl"&gt;-webkit-background-clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;background-clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&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="nc"&gt;.subtitle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--font-sans&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1.35rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2.8vw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1.75rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;letter-spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-0.015em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--muted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;48rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4vw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;/* FORM */&lt;/span&gt;
    &lt;span class="nf"&gt;#waitlist-form&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="py"&gt;scroll-margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.form-wrap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;640px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.form-row&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.form-row&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"email"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.0625rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--border&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-color&lt;/span&gt; &lt;span class="m"&gt;0.2s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.form-row&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"email"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.form-row&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt; &lt;span class="m"&gt;28px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.0625rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;white-space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;nowrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt; &lt;span class="m"&gt;0.2s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.form-row&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.form-row&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:disabled&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;not-allowed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.form-hint&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.82rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--muted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;/* SUCCESS STATE */&lt;/span&gt;
    &lt;span class="nc"&gt;.success&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand-light&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#cde3d8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.success&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.success&lt;/span&gt; &lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--muted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.95rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;/* SOCIAL PROOF */&lt;/span&gt;
    &lt;span class="nc"&gt;.proof&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5vw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0.95rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1.5vw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1.05rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--muted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;52rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.proof-dot&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;/* FEATURES */&lt;/span&gt;
    &lt;span class="nc"&gt;.features&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;64px&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;960px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.features&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--font-display&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1.5rem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3vw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1.85rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;800&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;letter-spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-0.03em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;40px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.features-grid&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;auto-fit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;240px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.feature-card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--border&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.feature-icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;40px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;40px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand-light&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.feature-icon&lt;/span&gt; &lt;span class="nt"&gt;svg&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="py"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;stroke-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;stroke-linecap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="py"&gt;stroke-linejoin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.feature-card&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;.feature-card&lt;/span&gt; &lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.9rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--muted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;/* FOOTER */&lt;/span&gt;
    &lt;span class="nt"&gt;footer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.85rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--muted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nl"&gt;border-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--border&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;560px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nc"&gt;.form-row&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"site-nav"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"banner"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"site-nav-inner"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logo"&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"YourProduct home"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logo-mark"&lt;/span&gt; &lt;span class="na"&gt;aria-hidden=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logo-text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logo-name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;YourProduct&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logo-kicker"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Waitlist&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#waitlist-form"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"nav-cta"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Join waitlist&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hero"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"badge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Coming Soon&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;
      The smarter way to&lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hero-accent"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;do the thing you do&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"subtitle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      We are building something that solves 
      your problem better than anything else 
      out there. Join the waitlist and be 
      the first to know when we launch.
    &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-wrap"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"waitlist-form"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
          &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; 
          &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_subject"&lt;/span&gt; 
          &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"New Waitlist Signup"&lt;/span&gt; 
        &lt;span class="nt"&gt;/&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;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-row"&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;"Enter your email address"&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;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="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"submit-btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            Join Waitlist
          &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-hint"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          No spam. Unsubscribe anytime.
        &lt;span class="nt"&gt;&amp;lt;/p&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;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"success"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"success-msg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;You are on the list!&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
          We will email you the moment we launch. 
          Thank you for your interest.
        &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"proof"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"proof-dot"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;Join 500+ people already on the waitlist&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"features"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Why people are excited&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"features-grid"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"feature-card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"feature-icon"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 24 24"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;polyline&lt;/span&gt; &lt;span class="na"&gt;points=&lt;/span&gt;&lt;span class="s"&gt;"20 6 9 17 4 12"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/polyline&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Benefit One&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
          Describe the first key benefit of your 
          product in one or two sentences. 
          Be specific and outcome focused.
        &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"feature-card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"feature-icon"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 24 24"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;circle&lt;/span&gt; &lt;span class="na"&gt;cx=&lt;/span&gt;&lt;span class="s"&gt;"12"&lt;/span&gt; &lt;span class="na"&gt;cy=&lt;/span&gt;&lt;span class="s"&gt;"12"&lt;/span&gt; &lt;span class="na"&gt;r=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/circle&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;polyline&lt;/span&gt; &lt;span class="na"&gt;points=&lt;/span&gt;&lt;span class="s"&gt;"12 6 12 12 16 14"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/polyline&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Benefit Two&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
          Describe the second key benefit. 
          What problem does this solve? 
          How does it save time or money?
        &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"feature-card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"feature-icon"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 24 24"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/path&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Benefit Three&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
          Describe the third benefit. 
          What makes your approach different 
          from everything else out there?
        &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
    Built with HTML and 
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://formgrid.dev"&lt;/span&gt; 
       &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: var(--brand);"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      Formgrid
    &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;waitlist-form&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;btn&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;submit-btn&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;successMsg&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;success-msg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Joining...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_FORMGRID_ENDPOINT_URL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&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="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="nx"&gt;successMsg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;block&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Join Waitlist&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Something went wrong. Please try again.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Join Waitlist&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Network error. Please check your connection.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Replace these three things before you deploy:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YourProduct&lt;/strong&gt; with your actual product name&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The headline and subtitle&lt;/strong&gt; with your real value &lt;br&gt;
proposition&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YOUR_FORMGRID_ENDPOINT_URL&lt;/strong&gt; with the endpoint &lt;br&gt;
URL from Step 3&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 5: Email Notifications Are Already Set Up
&lt;/h2&gt;

&lt;p&gt;Good news: you do not need to configure anything. &lt;br&gt;
Formgrid automatically sends every new signup to the &lt;br&gt;
email address you used to create your account.&lt;/p&gt;

&lt;p&gt;The moment someone joins your waitlist, you will &lt;br&gt;
receive an email like this:&lt;/p&gt;

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

&lt;p&gt;If you want signups sent to a different address, go &lt;br&gt;
to your form's &lt;strong&gt;Settings&lt;/strong&gt; tab, find &lt;br&gt;
&lt;strong&gt;Email Notifications&lt;/strong&gt;, and update it there.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 6: Deploy Your Waitlist Page for Free
&lt;/h2&gt;

&lt;p&gt;You have several free options for hosting your &lt;br&gt;
waitlist page. All of them serve static HTML &lt;br&gt;
with no setup required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Pages:&lt;/strong&gt; Push your &lt;code&gt;index.html&lt;/code&gt; to a &lt;br&gt;
GitHub repo and enable Pages in the repository &lt;br&gt;
settings. Your page goes live at &lt;br&gt;
&lt;code&gt;username.github.io/repo-name&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Netlify:&lt;/strong&gt; Drag and drop your &lt;code&gt;index.html&lt;/code&gt; file &lt;br&gt;
onto &lt;a href="https://app.netlify.com/drop" rel="noopener noreferrer"&gt;netlify.com/drop&lt;/a&gt; &lt;br&gt;
and it goes live instantly at a random Netlify URL. &lt;br&gt;
Connect a custom domain in settings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloudflare Pages:&lt;/strong&gt; Connect your GitHub repo and &lt;br&gt;
Cloudflare deploys on every push. Fast, free, and &lt;br&gt;
global CDN included.&lt;/p&gt;

&lt;p&gt;All three options are completely free for a static &lt;br&gt;
HTML page. Pick whichever you are most comfortable &lt;br&gt;
with.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 7: View and Manage Your Signups
&lt;/h2&gt;

&lt;p&gt;Every signup is stored automatically in your &lt;br&gt;
Formgrid dashboard. Go to the &lt;strong&gt;Submissions&lt;/strong&gt; tab &lt;br&gt;
to see everyone who has joined your waitlist.&lt;/p&gt;

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

&lt;p&gt;You can search, filter, and export all your &lt;br&gt;
signups as a CSV file at any time. When you are &lt;br&gt;
ready to launch, export the list, and import it &lt;br&gt;
into your email tool of choice to send your &lt;br&gt;
launch announcement.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Makes a Waitlist Page Convert
&lt;/h2&gt;

&lt;p&gt;Based on the research behind this guide, here are &lt;br&gt;
the elements that separate high-converting waitlist &lt;br&gt;
pages from ones that collect zero signups:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A specific headline.&lt;/strong&gt; "The future of productivity." &lt;br&gt;
converts nobody. "The form backend for developers &lt;br&gt;
who hate maintaining servers" converts the right &lt;br&gt;
people. Be specific about who it is for and what &lt;br&gt;
it does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One clear action.&lt;/strong&gt; Your only CTA should be the &lt;br&gt;
email field. No navigation links, no secondary &lt;br&gt;
buttons, no distractions. One page. One goal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Social proof near the form.&lt;/strong&gt; "Join 500 people &lt;br&gt;
already on the waitlist" creates FOMO and builds &lt;br&gt;
trust. Even if you are starting from zero, update &lt;br&gt;
this number as you grow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A reason to sign up now.&lt;/strong&gt; "Early access" or &lt;br&gt;
"be first to know" gives people a reason to act &lt;br&gt;
today instead of coming back later and forgetting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep the form short.&lt;/strong&gt; Email only for first &lt;br&gt;
contact. You can ask for more information in a &lt;br&gt;
follow-up survey after signing up. Every extra field &lt;br&gt;
reduces conversion.&lt;/p&gt;


&lt;h2&gt;
  
  
  Customising the Page for Your Brand
&lt;/h2&gt;

&lt;p&gt;The template above uses a green brand colour &lt;br&gt;
defined as &lt;code&gt;--brand: #1d4f3d&lt;/code&gt; in the CSS variables &lt;br&gt;
at the top. To match your own brand, just change &lt;br&gt;
that one value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;your-colour-here&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--brand-light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;lighter-version-here&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;Everything else on the page inherits those two &lt;br&gt;
values automatically. No need to hunt through &lt;br&gt;
the CSS changing colours one by one.&lt;/p&gt;




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

&lt;p&gt;A waitlist page is not a nice-to-have. It is the &lt;br&gt;
difference between launching to silence and &lt;br&gt;
launching to a warm, engaged audience.&lt;/p&gt;

&lt;p&gt;The page in this guide takes less than 30 minutes &lt;br&gt;
to set up. It costs nothing to host. And every &lt;br&gt;
signup goes straight to your inbox and your &lt;br&gt;
dashboard the moment it happens.&lt;/p&gt;

&lt;p&gt;Stop waiting to start collecting. Build your &lt;br&gt;
waitlist today.&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid.dev&lt;/a&gt; you get:&lt;/p&gt;

&lt;p&gt;✅ Working form with email capture in minutes&lt;br&gt;&lt;br&gt;
✅ Instant email notification on every signup&lt;br&gt;&lt;br&gt;
✅ Spam protection built in&lt;br&gt;&lt;br&gt;
✅ Submission dashboard to track all signups&lt;br&gt;&lt;br&gt;
✅ CSV export when you are ready to launch&lt;br&gt;&lt;br&gt;
✅ Free to start, no credit card required  &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>startup</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Add an Email Capture Form to Your Landing Page Without a Backend</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Sat, 11 Apr 2026 02:34:55 +0000</pubDate>
      <link>https://forem.com/allenarduino/how-to-add-an-email-capture-form-to-your-landing-page-without-a-backend-28e3</link>
      <guid>https://forem.com/allenarduino/how-to-add-an-email-capture-form-to-your-landing-page-without-a-backend-28e3</guid>
      <description>&lt;p&gt;You built a landing page. It looks great. But when &lt;br&gt;
someone fills out your contact form and clicks submit, nothing happens.&lt;/p&gt;

&lt;p&gt;That is because HTML forms need a server to process &lt;br&gt;
submissions. And setting up a server just to collect &lt;br&gt;
email addresses is overkill for most landing pages.&lt;/p&gt;

&lt;p&gt;In this guide, you will learn exactly how to add a working email capture form to any landing page without writing any backend code, using &lt;br&gt;
&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid.dev&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why HTML Forms Do Not Work on Their Own
&lt;/h2&gt;

&lt;p&gt;When someone submits an HTML form, the browser sends the data to whatever URL is in the &lt;br&gt;
&lt;code&gt;action&lt;/code&gt; attribute:&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;"WHERE_DOES_THIS_GO"&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;On a static site, there is no server listening at that URL. So the data goes nowhere. The visitor gets an error. You get nothing.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Option 1:&lt;/strong&gt; Set up your own server. Node.js, &lt;br&gt;
PHP, Python. Configure email sending. Handle spam. &lt;br&gt;
Maintain it forever. This is weeks of work for &lt;br&gt;
something that should take 10 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2:&lt;/strong&gt; Use a form backend service. Point &lt;br&gt;
your form at their endpoint. They handle everything. &lt;br&gt;
You get submissions in your inbox and dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 3:&lt;/strong&gt; Do nothing. Lose every lead that &lt;br&gt;
tries to contact you.&lt;/p&gt;

&lt;p&gt;Option 2 is the right call for 90% of landing pages.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Solution: Formgrid.dev
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid&lt;/a&gt; is a form backend &lt;br&gt;
that works with any HTML form on any website. Point &lt;br&gt;
your form's &lt;code&gt;action&lt;/code&gt; attribute at your Formgrid &lt;br&gt;
endpoint and it just works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free plan includes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unlimited forms&lt;/li&gt;
&lt;li&gt;50 submissions per month&lt;/li&gt;
&lt;li&gt;Instant email notifications&lt;/li&gt;
&lt;li&gt;Spam protection built in&lt;/li&gt;
&lt;li&gt;Submission dashboard&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Step by Step Setup
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create your Formgrid account&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; and &lt;br&gt;
sign up with Google or Email. No credit card 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%2Fjigvrqx9ko4dex0r3udb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjigvrqx9ko4dex0r3udb.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Create a new form&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;New Form&lt;/strong&gt;, give it a name like &lt;br&gt;
"Landing Page Leads" or Contact Form, and click &lt;strong&gt;Create Form&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 3: Copy your endpoint URL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to the &lt;strong&gt;Overview&lt;/strong&gt; tab and copy your endpoint:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 4: Add the form to your landing page&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is a complete email capture form ready to &lt;br&gt;
drop into any landing page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; 
  &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"lead-form"&lt;/span&gt;
  &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"YOUR_FORMGRID_ENDPOINT_URL"&lt;/span&gt; 
  &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; 
    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_subject"&lt;/span&gt; 
    &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"New Lead Signup"&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;"Enter your email address"&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;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;
    Get Early Access
  &lt;span class="nt"&gt;&amp;lt;/button&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;/form&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"form-status"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lead-form&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;form-status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="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="p"&gt;});&lt;/span&gt;

      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;You are on the list. We will be in touch!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Something went wrong. Please try again.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Network error. Please try again.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;YOUR_FORMGRID_ENDPOINT_URL&lt;/code&gt; with your &lt;br&gt;
actual endpoint from Step 3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Test it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fill out the form yourself and submit. Within &lt;br&gt;
seconds, you should receive a notification email. &lt;/p&gt;

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

&lt;p&gt;Check your Formgrid dashboard, and you will see &lt;br&gt;
the submission logged there too.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9avjnvjdz3vq950iznj8.png" alt=" " width="800" height="443"&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  What If I Want to Capture More Than Just Email
&lt;/h2&gt;

&lt;p&gt;You can add any fields you need. Here is a version &lt;br&gt;
that captures name, email, and company:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; 
  &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"lead-form"&lt;/span&gt;
  &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"YOUR_FORMGRID_ENDPOINT_URL"&lt;/span&gt; 
  &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"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;"Work 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;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;"company"&lt;/span&gt; 
    &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Company name"&lt;/span&gt; 
  &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"role"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Select your role&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"developer"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Developer&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"designer"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Designer&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"founder"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Founder&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"other"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Other&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Honeypot --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_honey"&lt;/span&gt; 
    &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:none"&lt;/span&gt; 
    &lt;span class="na"&gt;tabindex=&lt;/span&gt;&lt;span class="s"&gt;"-1"&lt;/span&gt; 
    &lt;span class="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;
    Request Access
  &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;Every field value appears in your notification &lt;br&gt;
email and your dashboard are automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Spam Protection Included
&lt;/h2&gt;

&lt;p&gt;Formgrid includes two layers of spam protection &lt;br&gt;
out of the box.&lt;/p&gt;

&lt;p&gt;The honeypot field is invisible to real users, but &lt;br&gt;
bots fill it in automatically. Any submission with &lt;br&gt;
that field filled is rejected silently.&lt;/p&gt;

&lt;p&gt;Rate limiting blocks the same IP address from &lt;br&gt;
submitting too many times in a short window. &lt;br&gt;
This stops bot floods before they reach your inbox.&lt;/p&gt;

&lt;p&gt;You never see spam submissions. Only real leads.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deploy Your Landing Page for Free
&lt;/h2&gt;

&lt;p&gt;Once your form is working, deploy your landing &lt;br&gt;
page on any of these free platforms:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Pages:&lt;/strong&gt; Push to a repo and enable &lt;br&gt;
Pages in settings. Free forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Netlify:&lt;/strong&gt; Drag and drop your HTML file at &lt;br&gt;
netlify.com/drop. Goes live instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloudflare Pages:&lt;/strong&gt; Connect your GitHub repo &lt;br&gt;
and deploy on every push.&lt;/p&gt;

&lt;p&gt;Your Formgrid endpoint works regardless of where &lt;br&gt;
you host. No platform lock-in.&lt;/p&gt;




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

&lt;p&gt;Adding a working email capture form to your landing &lt;br&gt;
page does not require a backend. It does not require &lt;br&gt;
a server. It does not require any infrastructure.&lt;/p&gt;

&lt;p&gt;Point your form at Formgrid. Get submissions in &lt;br&gt;
your inbox. Done.&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;&lt;em&gt;Full disclosure: I built Formgrid. This post &lt;br&gt;
shows the exact workflow I recommend to everyone &lt;br&gt;
who asks how to add a form to their landing page.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>html</category>
      <category>serverless</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Jotform Alternatives in 2026: Cheaper, Open Source, and Self-Hostable</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Fri, 10 Apr 2026 18:19:31 +0000</pubDate>
      <link>https://forem.com/allenarduino/jotform-alternatives-in-2026-cheaper-open-source-and-self-hostable-2cac</link>
      <guid>https://forem.com/allenarduino/jotform-alternatives-in-2026-cheaper-open-source-and-self-hostable-2cac</guid>
      <description>&lt;p&gt;If you have been using Jotform and recently looked at your bill, you are not alone. &lt;br&gt;
Jotform's free plan limits you to 100 responses per month and &lt;br&gt;
their paid plans start at $34/month for features that other tools offer for free or at a fraction of the cost.&lt;/p&gt;

&lt;p&gt;For developers, indie hackers, and small businesses that is hard to &lt;br&gt;
justify in 2026.&lt;/p&gt;

&lt;p&gt;In this article, I will walk through the best Jotform alternatives in 2026, covering price, features, self-hosting options, and which one is right for your use case.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Developers and Businesses Look for Jotform Alternatives
&lt;/h2&gt;

&lt;p&gt;Before jumping into the list, here are the most common reasons people switch:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Price:&lt;/strong&gt; Jotform's free plan is limited to 100 responses per month &lt;br&gt;
and 5 forms. Paid plans start at $34/month, which is expensive for &lt;br&gt;
what most people actually need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No HTML form backend:&lt;/strong&gt; Jotform is a hosted form builder only. You cannot point your existing HTML form at a Jotform endpoint. &lt;br&gt;
If you have a static site, you are out of luck.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No self-hosting:&lt;/strong&gt; If you care about &lt;br&gt;
data ownership or GDPR compliance, Jotform gives you no option to run &lt;br&gt;
it on your own infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overkill for simple use cases:&lt;/strong&gt; &lt;br&gt;
Jotform has 10,000 templates, approval workflows, PDF generation, and &lt;br&gt;
e-signatures. If you just need a contact form or event registration &lt;br&gt;
form that is a lot of complexity you will never use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No open source option:&lt;/strong&gt; You are locked in with no transparency and no way to customize the core behavior.&lt;/p&gt;

&lt;p&gt;If any of those hit home, keep reading.&lt;/p&gt;


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


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

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want a form backend AND non-technical users who need a shareable form link. Both in one tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it different:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most form tools pick a lane. Either a form backend for developers or a no-code form builder for everyone else. &lt;br&gt;
Formgrid does both.&lt;/p&gt;

&lt;p&gt;You can point your existing HTML form at a Formgrid endpoint URL just like you would with Formspree. Or you can use the drag and drop form builder, get a shareable link, and send it via WhatsApp or email without touching any code.&lt;/p&gt;

&lt;p&gt;Here is how both workflows look:&lt;/p&gt;


&lt;h4&gt;
  
  
  Option A: Use Your Existing HTML Form
&lt;/h4&gt;

&lt;p&gt;If you already have an HTML form on your static site, just point the action attribute at your Formgrid endpoint. No other changes needed:&lt;br&gt;
&lt;/p&gt;

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

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

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

&lt;/div&gt;



&lt;p&gt;Your form stays exactly as it is. &lt;br&gt;
Formgrid handles receiving submissions, sending email notifications, and storing the data.&lt;/p&gt;




&lt;h4&gt;
  
  
  Option B: Build a Form With the Drag and Drop Builder
&lt;/h4&gt;

&lt;p&gt;If you are non-technical or just want a shareable form link without writing any HTML, Formgrid has a full drag-and-drop form builder built in.&lt;/p&gt;

&lt;p&gt;Here is how it works step by step:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Sign Up and Create a Form&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Head to &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; &lt;br&gt;
and sign up using Google or Email. &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%2Fm1cqi77okjivpv89ffsp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1cqi77okjivpv89ffsp.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once logged in you will land on your &lt;br&gt;
dashboard. Click New Form to get started.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Step 2: Choose Your Path&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After creating your form you will be taken to the form overview page. &lt;br&gt;
You will see two options:&lt;/p&gt;

&lt;p&gt;Build with Form Builder: Opens the &lt;br&gt;
drag and drop editor.&lt;/p&gt;

&lt;p&gt;Use Endpoint URL: Gives you the URL &lt;br&gt;
to point your existing HTML form at.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 3: Build Your Form&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click Build with Form Builder and you will be taken to the builder page. &lt;br&gt;
Drag fields from the left panel onto the canvas: text fields, email fields, dropdowns, checkboxes, file uploads, and more.&lt;/p&gt;

&lt;p&gt;Each field is fully customizable. Click any field to edit its label, &lt;br&gt;
placeholder, required status, and validation rules.&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%2F1nc7en2b8mjlrtqghdhg.png" alt=" " width="800" height="441"&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Customize Your Brand&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Formgrid includes a color picker so you can match the form to your brand or your client's brand. Change the primary color, background, and button style directly in the builder.&lt;/p&gt;

&lt;p&gt;Every form you share looks as if it belongs to your brand. Not like a &lt;br&gt;
generic third-party tool.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Step 5: Preview and Share&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once you are happy with the form, click Preview to see exactly how it &lt;br&gt;
looks to your users. When it is ready, click Share to get your shareable form link.&lt;/p&gt;

&lt;p&gt;You can send that link via:&lt;br&gt;
WhatsApp, Email, SMS, or embed it on any website.&lt;/p&gt;

&lt;p&gt;No code. No hosting. Just a link.&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%2Ft9rg67rirrfoqjhehcm1.png" alt=" " width="800" height="743"&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Configure Settings&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to the Settings tab on your form to:&lt;/p&gt;

&lt;p&gt;Add notification email addresses so you receive an email every time &lt;br&gt;
someone submits.&lt;/p&gt;

&lt;p&gt;Enable spam protection with a honeypot and rate limiting built in.&lt;/p&gt;

&lt;p&gt;Set a custom redirect URL after &lt;br&gt;
submission.&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%2Fe0d8ayuksfp1tmakip36.png" alt=" " width="800" height="441"&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 7: View Submissions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All submissions are stored in your Formgrid dashboard. Go to the &lt;br&gt;
Submissions tab to view, search, filter, and export your data as CSV.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Drag and drop form builder with shareable link.&lt;/p&gt;

&lt;p&gt;HTML form endpoint that works with any static site.&lt;/p&gt;

&lt;p&gt;Spam protection with honeypot and rate limiting.&lt;/p&gt;

&lt;p&gt;Instant email notifications.&lt;/p&gt;

&lt;p&gt;File uploads up to 1GB.&lt;/p&gt;

&lt;p&gt;CSV export.&lt;/p&gt;

&lt;p&gt;Color picker for brand matching.&lt;/p&gt;

&lt;p&gt;Google Sheets sync on Professional &lt;br&gt;
plan at $16/month.&lt;/p&gt;

&lt;p&gt;Self-hostable with Docker.&lt;/p&gt;

&lt;p&gt;100% open source under MIT license.&lt;/p&gt;

&lt;p&gt;GDPR friendly with no tracking &lt;br&gt;
and no data selling.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Submissions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0/month&lt;/td&gt;
&lt;td&gt;50/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium&lt;/td&gt;
&lt;td&gt;$8/month&lt;/td&gt;
&lt;td&gt;5,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Professional&lt;/td&gt;
&lt;td&gt;$16/month&lt;/td&gt;
&lt;td&gt;10,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;td&gt;15,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The bottom line:&lt;/strong&gt; Jotform charges &lt;br&gt;
$34/month for their starter paid plan. &lt;br&gt;
Formgrid gives you a form builder, &lt;br&gt;
a form backend, self-hosting, and &lt;br&gt;
open source code starting at $8/month. &lt;br&gt;
If you are paying for Jotform just to &lt;br&gt;
build and share forms, this is the &lt;br&gt;
obvious switch.&lt;/p&gt;

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




&lt;h3&gt;
  
  
  2. Google Forms: Best Free Option
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Anyone who needs a completely free form builder for &lt;br&gt;
basic use cases.&lt;/p&gt;

&lt;p&gt;Google Forms is completely free with no submission limits. It is the most widely used form of tool in the world for good reason. It works, it is fast, and everyone knows how to use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Completely free.&lt;br&gt;
Unlimited responses.&lt;br&gt;
Google Sheets integration built in.&lt;br&gt;
Conditional logic.&lt;br&gt;
Simple analytics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; No custom branding. &lt;br&gt;
No custom domain. No HTML form &lt;br&gt;
backend. No self-hosting. Forms look &lt;br&gt;
like Google Forms, not like your brand. &lt;br&gt;
Not suitable for professional &lt;br&gt;
client work.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Tally: Clean and Free Form Builder
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Non-technical users who &lt;br&gt;
want a Typeform-like experience at a lower price.&lt;/p&gt;

&lt;p&gt;Tally is a popular alternative with a clean, minimal interface. Their free plan is genuinely useful, with unlimited forms and unlimited responses, though some features are locked behind the paid plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unlimited forms on the free plan.&lt;br&gt;
Unlimited responses.&lt;br&gt;
Conditional logic.&lt;br&gt;
File uploads on paid plan.&lt;br&gt;
Notion integration.&lt;br&gt;
Embeddable forms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free plan available. &lt;br&gt;
Paid plan at $29/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; No HTML form backend. &lt;br&gt;
No self-hosting. No open source. &lt;br&gt;
Heavier than you need for a simple &lt;br&gt;
contact form.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Typeform: Best for Conversational Forms
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Marketers who want a &lt;br&gt;
beautiful conversational form &lt;br&gt;
experience for surveys and lead &lt;br&gt;
generation.&lt;/p&gt;

&lt;p&gt;Typeform pioneered the one question at a time conversational form format. It is visually stunning and produces high completion rates for surveys and research forms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Conversational one question at a time format.&lt;br&gt;
Beautiful design templates.&lt;br&gt;
Logic jumps and conditional branching.&lt;br&gt;
Payment integrations.&lt;br&gt;
Data analysis and insights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free plan limited to &lt;br&gt;
10 responses per month. Paid plans &lt;br&gt;
start at $25/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; Extremely limited free &lt;br&gt;
plan. No HTML form backend. &lt;br&gt;
No self-hosting. No open source. &lt;br&gt;
Expensive compared to alternatives. &lt;br&gt;
Overkill for simple contact forms.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Paperform: Best for Beautiful Landing Page Forms
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Marketers and creators who want visually stunning forms with a strong brand feel.&lt;/p&gt;

&lt;p&gt;Paperform focuses on beautiful landing page-style forms that feel &lt;br&gt;
like a designed experience rather than a generic form. &lt;br&gt;
Strong media embedding, payment support, and good conditional logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Beautiful form design.&lt;br&gt;
Payment integrations.&lt;br&gt;
Conditional logic.&lt;br&gt;
Calculator fields.&lt;br&gt;
Media embedding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Starts at $24/month. &lt;br&gt;
No free plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; No free plan. No HTML &lt;br&gt;
form backend. No self-hosting. &lt;br&gt;
Expensive for what it offers compared &lt;br&gt;
to alternatives.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Web3Forms: Lightweight Form Backend
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who just need a simple form endpoint for &lt;br&gt;
their static site with no frills.&lt;/p&gt;

&lt;p&gt;Web3Forms is a lightweight form backend service. No form builder. &lt;br&gt;
Just an endpoint URL you point your HTML form at. Simple and fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Simple HTML form endpoint.&lt;br&gt;
Email notifications.&lt;br&gt;
Spam protection.&lt;br&gt;
Free plan available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free plan available. &lt;br&gt;
Pro plan at $18/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; No form builder. &lt;br&gt;
No submission dashboard on the free plan. No self-hosting. No Google Sheets integration at a reasonable price.&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;Jotform&lt;/th&gt;
&lt;th&gt;Formgrid&lt;/th&gt;
&lt;th&gt;Google Forms&lt;/th&gt;
&lt;th&gt;Tally&lt;/th&gt;
&lt;th&gt;Typeform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Form builder&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML endpoint&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shareable link&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hostable&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Sheets&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅ $16/mo&lt;/td&gt;
&lt;td&gt;✅ Free&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File uploads&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free responses&lt;/td&gt;
&lt;td&gt;100/month&lt;/td&gt;
&lt;td&gt;50/month&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;10/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starting price&lt;/td&gt;
&lt;td&gt;$34/month&lt;/td&gt;
&lt;td&gt;$8/month&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;td&gt;$25/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GDPR friendly&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

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

&lt;p&gt;You want a form backend AND a form builder in one tool.&lt;/p&gt;

&lt;p&gt;You need to point an existing HTML form at an endpoint.&lt;/p&gt;

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

&lt;p&gt;You are paying too much for Jotform and want to cut costs significantly.&lt;/p&gt;

&lt;p&gt;You need to share a form link with someone non-technical.&lt;/p&gt;

&lt;p&gt;GDPR compliance matters to you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Google Forms if:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need something completely free.&lt;br&gt;
Branding does not matter. You are collecting internal data or running simple surveys.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Tally if:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You want a clean, minimal form builder for free.&lt;br&gt;
You do not need an HTML form backend.&lt;br&gt;
You are a Notion user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Jotform if:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need advanced logic, payments, &lt;br&gt;
approval workflows, and PDF generation.&lt;br&gt;
Budget is not a constraint.&lt;br&gt;
You are building a complex enterprise &lt;br&gt;
forms that require heavy customization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Typeform if:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need a conversational one question at a time experience.&lt;br&gt;
You are running surveys or research forms where completion rate matters. Visual design is your top priority.&lt;/p&gt;




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

&lt;p&gt;Jotform built a genuinely powerful product. But in 2026, it is hard to &lt;br&gt;
justify $34/month for a starter plan when better alternatives exist at a fraction of the cost.&lt;/p&gt;

&lt;p&gt;If you are a developer who needs both a form backend for your static site AND a no-code builder for non-technical clients or teammates, there is no better option than Formgrid. It is the only tool on this list that does both, starting at $8/month.&lt;/p&gt;

&lt;p&gt;If you need something completely free &lt;br&gt;
for basic use cases, Google Forms or Tally will serve you well.&lt;/p&gt;

&lt;p&gt;But if you are paying $34/month or more for Jotform and not using its &lt;br&gt;
advanced approval workflows, PDF generation, or e-signature features you are significantly overpaying.&lt;/p&gt;

&lt;p&gt;You can try Formgrid free at &lt;br&gt;
&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt;. &lt;br&gt;
No credit card required.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full disclosure: I built Formgrid. &lt;br&gt;
I wrote this comparison as honestly &lt;br&gt;
as I could. If anything looks &lt;br&gt;
inaccurate, let me know in the comments.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>forms</category>
      <category>opensource</category>
      <category>api</category>
      <category>nocode</category>
    </item>
    <item>
      <title>How to Use Google Sheets as a CMS for Your Webflow Website (Without Zapier)</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Fri, 10 Apr 2026 15:20:25 +0000</pubDate>
      <link>https://forem.com/allenarduino/how-to-use-google-sheets-as-a-cms-for-your-webflow-website-without-zapier-1pki</link>
      <guid>https://forem.com/allenarduino/how-to-use-google-sheets-as-a-cms-for-your-webflow-website-without-zapier-1pki</guid>
      <description>&lt;p&gt;If you build websites in Webflow for clients, you have probably had &lt;br&gt;
this conversation at least once.&lt;/p&gt;

&lt;p&gt;You finish the site. It looks great. The client is happy. Then they &lt;br&gt;
ask: "How do I update the menu?" or "Can I add a new team member &lt;br&gt;
myself?"&lt;/p&gt;

&lt;p&gt;You explain Webflow CMS. You walk them through it. They nod along. &lt;br&gt;
Then two weeks later, you get a message: "Can you just update it for &lt;br&gt;
me? I can't figure out the CMS."&lt;/p&gt;

&lt;p&gt;This is not a client problem. It is a workflow problem. And the &lt;br&gt;
answer, most Webflow designers reach for syncing Google Sheets to &lt;br&gt;
Webflow CMS via Zapier — turns out to create a different set of &lt;br&gt;
headaches that are arguably worse than the original one.&lt;/p&gt;

&lt;p&gt;This post covers why the Zapier approach breaks down, what the &lt;br&gt;
real pain points are, and how to use Google Sheets as a live CMS &lt;br&gt;
for your Webflow site without touching Zapier at all.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Real Pain Points Webflow Designers Face With Google Sheets and CMS
&lt;/h2&gt;

&lt;p&gt;Before getting to the solution, it is worth naming the problems &lt;br&gt;
clearly because the Webflow forum and Reddit communities are full &lt;br&gt;
of people running into the same walls.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pain Point 1: Clients Simply Will Not Learn Webflow CMS
&lt;/h3&gt;

&lt;p&gt;This is the most common frustration, and it is completely &lt;br&gt;
understandable from the client's side. Most small business owners &lt;br&gt;
already live in Google Sheets. They manage their inventory there, &lt;br&gt;
their staff roster, their menu, and their event list. Asking them to &lt;br&gt;
learn a new interface just to update a row of data is a genuine &lt;br&gt;
barrier that most of them quietly abandon.&lt;/p&gt;

&lt;p&gt;The result is that content goes stale. A menu shows items that &lt;br&gt;
are no longer available. A team page shows people who left the &lt;br&gt;
company. An event listing shows events that have already happened. &lt;br&gt;
And the client either pays you to make every update manually or &lt;br&gt;
just lives with outdated content.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pain Point 2: The Zapier Sync Creates More Problems Than It Solves
&lt;/h3&gt;

&lt;p&gt;The natural workaround Webflow designers reach for is Zapier or &lt;br&gt;
Make. Connect Google Sheets to Webflow CMS, trigger a sync when &lt;br&gt;
a row changes, and the CMS updates automatically.&lt;/p&gt;

&lt;p&gt;In practice, this breaks down in several ways that users report &lt;br&gt;
consistently on the Webflow forum.&lt;/p&gt;

&lt;p&gt;The slug problem is the most common. Webflow CMS requires a slug &lt;br&gt;
for every item and generates it automatically. When Zapier tries &lt;br&gt;
to create or update items, it cannot easily match an existing &lt;br&gt;
Webflow CMS item to a Google Sheets row, which means it often &lt;br&gt;
creates duplicates instead of updating the correct item.&lt;/p&gt;

&lt;p&gt;As one Webflow forum user described it: "I keep running into &lt;br&gt;
issues comparing an existing item on the Webflow database to &lt;br&gt;
update instead of just creating a new one."&lt;/p&gt;

&lt;p&gt;Rate limits add another layer of fragility. Webflow's API allows &lt;br&gt;
60 requests per minute with batches capped at 100 items per call. &lt;br&gt;
For sites with frequent updates or large datasets, this means &lt;br&gt;
delays, failed syncs, and content that is out of date, even when &lt;br&gt;
the workflow is technically working.&lt;/p&gt;

&lt;p&gt;The deprecation of Webflow API v1 in March 2025 also broke many &lt;br&gt;
existing Zapier and Make integrations, leaving designers scrambling &lt;br&gt;
to rebuild workflows that had been running for years.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pain Point 3: The Webflow CMS Item Limits Hit Harder Than Expected
&lt;/h3&gt;

&lt;p&gt;Webflow's CMS plan allows 2,000 items per site. The Business Plan &lt;br&gt;
caps at 10,000 items with the option to purchase up to 20,000. &lt;br&gt;
For a restaurant with a large menu, a directory site, a job board, &lt;br&gt;
or any content-heavy project, these limits become a real constraint &lt;br&gt;
fast.&lt;/p&gt;

&lt;p&gt;Workarounds like splitting content across multiple collections &lt;br&gt;
or setting up reverse proxies works, but add significant complexity &lt;br&gt;
to what should be a simple content management task.&lt;/p&gt;

&lt;p&gt;Google Sheets has none of these limits. A single spreadsheet can &lt;br&gt;
hold hundreds of thousands of rows with no additional cost.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pain Point 4: The Default Google Sheets Embed Is Unusable
&lt;/h3&gt;

&lt;p&gt;The simplest approach using Webflow's Embed element to drop &lt;br&gt;
in a Google Sheets iframe, it produces results that designers &lt;br&gt;
consistently described as broken.&lt;/p&gt;

&lt;p&gt;As one Webflow forum user put it: "I need to embed a Google &lt;br&gt;
Sheet, but after inserting the code, I have no control over the &lt;br&gt;
size. It defaults to a tiny square."&lt;/p&gt;

&lt;p&gt;The native iframe embed shows the full Google Sheets interface, including tabs, header rows, and the Google branding. It is not &lt;br&gt;
responsive, it cannot be styled to match your site design, and &lt;br&gt;
it looks nothing like a purpose-built website element.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pain Point 5: Custom Code Solutions Are Fragile and Hard to Hand Off
&lt;/h3&gt;

&lt;p&gt;Some designers solve the problem with custom JavaScript that calls &lt;br&gt;
the Google Sheets API directly. This works technically, but &lt;br&gt;
introduces a new problem: the client now has a custom-coded &lt;br&gt;
integration that requires an API key, a specific sheet format, &lt;br&gt;
and code that lives somewhere in the Webflow custom code panel.&lt;/p&gt;

&lt;p&gt;When something breaks, which it will, the client calls you. When &lt;br&gt;
you want to hand the project off to another designer, you have &lt;br&gt;
to explain the entire custom integration. The maintenance burden &lt;br&gt;
never goes away.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Better Approach: Skip the CMS Sync and Use a Live Widget Instead
&lt;/h2&gt;

&lt;p&gt;Here is the insight that changes how this problem feels: you do &lt;br&gt;
not need to sync Google Sheets to Webflow CMS at all.&lt;/p&gt;

&lt;p&gt;The reason people try to sync is that Webflow CMS is the only &lt;br&gt;
way to show dynamic content in Webflow, or so it seems. But &lt;br&gt;
there is a simpler path. Instead of pushing your sheet data &lt;br&gt;
into Webflow CMS, you render it directly on the page using &lt;br&gt;
an embeddable widget that pulls live data from the sheet on &lt;br&gt;
every page load.&lt;/p&gt;

&lt;p&gt;No sync. No Zapier. No slug conflicts. No item limits. No &lt;br&gt;
duplicate entries.&lt;/p&gt;

&lt;p&gt;The client updates the Google Sheet. The page reflects the &lt;br&gt;
change immediately. That is it.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to Set This Up With SheetRocket
&lt;/h2&gt;

&lt;p&gt;Sheetrocket is a tool that turns any Google Sheet into a &lt;br&gt;
live REST API and an embeddable widget. The widget is what &lt;br&gt;
matters for the Webflow use case.&lt;/p&gt;

&lt;p&gt;Here is the exact process.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Connect Your Google Sheet
&lt;/h3&gt;

&lt;p&gt;Sign up at (sheetrocket.com)[sheetrocket.com] and sign in with Google. Paste &lt;br&gt;
your Google Sheet URL into the dashboard. Sheetrocket &lt;br&gt;
connects to your sheet via a service account, which means &lt;br&gt;
your sheet stays private, and no OAuth consent screen appears &lt;br&gt;
for your clients.&lt;/p&gt;

&lt;p&gt;Example Google Sheet:&lt;/p&gt;

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

&lt;p&gt;Share it with this service account email and copy your google sheet link&lt;br&gt;
Service account email:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="mailto:sheetrocket-api@sheetrocket-491214.iam.gserviceaccount.com"&gt;sheetrocket-api@sheetrocket-491214.iam.gserviceaccount.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;em&gt;Paste your Google Sheet URL, and Sheetrocket generates your API and widget configuration in seconds.&lt;/em&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%2Fyt9awjpf0oyebc8eep04.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyt9awjpf0oyebc8eep04.png" alt=" " width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Open the Widgets Tab
&lt;/h3&gt;

&lt;p&gt;On the API details page, click the Widgets tab. This is where &lt;br&gt;
you configure what your embedded widget looks like and how &lt;br&gt;
it behaves.&lt;/p&gt;

&lt;p&gt;You will see two layout options: Table and Cards. Choose &lt;br&gt;
Table if you want a traditional rows-and-columns layout. &lt;br&gt;
Choose Cards if you want each row displayed as a visual card.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Widgets tab. Choose between a table or cards layout depending on your content type.&lt;/em&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%2Fx9sfgnhzbx7z8fmfpv72.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx9sfgnhzbx7z8fmfpv72.png" alt=" " width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Choose a Card Template (For Cards View)
&lt;/h3&gt;

&lt;p&gt;If you choose Cards, SheetRocket gives you six card template &lt;br&gt;
designs to choose from:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple:&lt;/strong&gt; Clean stacked fields. Works for any data type. &lt;br&gt;
  Good for staff directories, resource lists, FAQs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compact:&lt;/strong&gt; Two-column field grid. Good for dense datasets &lt;br&gt;
  like price lists or inventory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Profile:&lt;/strong&gt; Large name with avatar image. Good for team &lt;br&gt;
  pages, speaker directories, member rosters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product:&lt;/strong&gt; Full-width image at top with title and price &lt;br&gt;
  below. Good for restaurant menus, product catalogues, &lt;br&gt;
  service offerings. If a row has no image URL the card &lt;br&gt;
  renders cleanly without a broken placeholder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; Color-coded status badge on each card. Green &lt;br&gt;
  for active or available, yellow for pending, red for &lt;br&gt;
  closed or sold, blue for featured. Good for job boards, &lt;br&gt;
  real estate listings, event availability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Horizontal:&lt;/strong&gt; Image left, content right, stacked as a &lt;br&gt;
  list. Good for blog post feeds, news listings, recipes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pick a card design. Each preview shows your actual layout so there are no surprises.&lt;/em&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%2F9vi8j96op0j3u66vnwrw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vi8j96op0j3u66vnwrw.png" alt=" " width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Configure the Widget
&lt;/h3&gt;

&lt;p&gt;After selecting your template, the customization panel gives &lt;br&gt;
you full control over what appears and how it looks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sheet Tab:&lt;/strong&gt; Which tab of your spreadsheet to display.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Row Limit:&lt;/strong&gt; How many rows to show in the widget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Theme:&lt;/strong&gt; Light or dark, to match your Webflow site design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Title:&lt;/strong&gt; An optional heading above the widget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Column Visibility:&lt;/strong&gt; A checkbox list of every column in &lt;br&gt;
  your sheet. This is the feature that matters most for &lt;br&gt;
  client work. If your sheet has internal columns like &lt;br&gt;
  cost price, supplier name, or internal notes, you uncheck &lt;br&gt;
  them here, and they are completely hidden. They are &lt;br&gt;
  filtered server-side before the data ever leaves &lt;br&gt;
  SheetRocket, so there is no risk of a visitor finding &lt;br&gt;
  them by inspecting network requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Row Filter:&lt;/strong&gt; Show only rows that match a condition. &lt;br&gt;
  For a restaurant menu: show only rows where Status &lt;br&gt;
  equals Available. For a job board: show only rows where &lt;br&gt;
  Status equals Open. For an events page: show only rows &lt;br&gt;
  where Date is not empty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typography:&lt;/strong&gt; Customize font size, font weight, color, &lt;br&gt;
  text alignment, and letter spacing for column headers &lt;br&gt;
  and cell values independently. This is how you make &lt;br&gt;
  the widget feels like part of your Webflow design rather &lt;br&gt;
  than a generic embedded element.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Control exactly what appears. Column hiding keeps sensitive data private. Row filtering keeps content relevant.&lt;/em&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%2Ffr0apf30nent1zxvp6os.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffr0apf30nent1zxvp6os.png" alt=" " width="800" height="513"&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%2Fi9xp3d1ylsfff8zf5ew9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi9xp3d1ylsfff8zf5ew9.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 5: Copy the Embed Code
&lt;/h3&gt;

&lt;p&gt;When your widget is configured, SheetRocket generates an &lt;br&gt;
embed code that updates in real time as you adjust settings. &lt;br&gt;
For a restaurant menu, it might look 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;div&lt;/span&gt; &lt;span class="na"&gt;data-sheetrocket=&lt;/span&gt;&lt;span class="s"&gt;"your-sheet-id"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://sheetrocket.com/widget.js"&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy that code. Go to your Webflow project. Add an Embed &lt;br&gt;
element wherever you want the widget to appear. Paste the &lt;br&gt;
code in and publish.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;The embed code updates live as you configure the widget. The preview below shows exactly what visitors will see.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That is the entire setup. There is no Zapier zap to maintain, &lt;br&gt;
no slug to manage, no CMS item count to worry about, and no &lt;br&gt;
Webflow Editor access required for your client.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Show the Client How to Update Content
&lt;/h3&gt;

&lt;p&gt;This is the part that changes client relationships. Open the &lt;br&gt;
Google Sheet with your client. Show them that editing a cell &lt;br&gt;
and saving the sheet is all they need to do. Within seconds, &lt;br&gt;
the live website reflects the change.&lt;/p&gt;

&lt;p&gt;No new software to learn. No login to a separate CMS. No &lt;br&gt;
calls to you asking how to add a row.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;The finished result on a live Webflow site. The client updates the Google Sheet, and the page updates automatically.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Use Cases Where This Works Better Than Webflow CMS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Restaurant and Cafe Menus
&lt;/h3&gt;

&lt;p&gt;A restaurant client changes their menu regularly. Seasonal &lt;br&gt;
items come and go. Prices update. Items sell out mid-service. &lt;br&gt;
With Webflow CMS, they would need to log in, find the right &lt;br&gt;
CMS item, make the change, and publish. With Sheetrocket, &lt;br&gt;
they open their Google Sheet, change Available to Sold Out &lt;br&gt;
in the Status column, and the website updates immediately. &lt;br&gt;
No publish step required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Team and Staff Directories
&lt;/h3&gt;

&lt;p&gt;A company's team page needs to stay current as people join &lt;br&gt;
and leave. The HR team already maintains a staff spreadsheet. &lt;br&gt;
With Sheetrocket, that spreadsheet becomes the team page. &lt;br&gt;
When HR updates the sheet, the website reflects it. The web &lt;br&gt;
designer is not in the loop for every staff change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Event Listings and Schedules
&lt;/h3&gt;

&lt;p&gt;An events page needs to show upcoming events and hide past &lt;br&gt;
ones. Set a row filter for Date is not empty and only filter &lt;br&gt;
by upcoming dates. The client adds new events as rows, and &lt;br&gt;
past events disappear automatically based on the filter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Product Catalogues and Price Lists
&lt;/h3&gt;

&lt;p&gt;A retail client has hundreds of products. Webflow CMS on &lt;br&gt;
the Business plan allows 10,000 items, but that cap starts &lt;br&gt;
to matter for larger catalogues. Google Sheets has no row &lt;br&gt;
limit that a typical small business would ever hit, and &lt;br&gt;
the client already manages their inventory there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Job Boards
&lt;/h3&gt;

&lt;p&gt;A company posts open roles in a Google Sheet with columns &lt;br&gt;
for Title, Department, Location, Type, and Status. Set the &lt;br&gt;
row filter to Status equals Open, and only active listings &lt;br&gt;
appear on the website. When a role is filled, change the &lt;br&gt;
status to Filled, and it disappears from the site instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  How This Compares to the Zapier Approach
&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;SheetRocket Widget&lt;/th&gt;
&lt;th&gt;Zapier to Webflow CMS&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;Under 5 minutes&lt;/td&gt;
&lt;td&gt;30 to 60 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slug conflicts&lt;/td&gt;
&lt;td&gt;Not applicable&lt;/td&gt;
&lt;td&gt;Common problem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate entries&lt;/td&gt;
&lt;td&gt;Not applicable&lt;/td&gt;
&lt;td&gt;Common problem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update speed&lt;/td&gt;
&lt;td&gt;Instant on page load&lt;/td&gt;
&lt;td&gt;Delayed by polling interval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CMS item limits&lt;/td&gt;
&lt;td&gt;Not applicable&lt;/td&gt;
&lt;td&gt;Yes, plan dependent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API deprecation risk&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Webflow API v1 deprecated March 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ongoing maintenance&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Ongoing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client needs Webflow access&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works if Zapier is down&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What SheetRocket Cannot Do
&lt;/h2&gt;

&lt;p&gt;It is worth being direct about the limitations so you can &lt;br&gt;
decide if this is the right fit for your project.&lt;/p&gt;

&lt;p&gt;Sheetrocket widgets are rendered client-side, which means &lt;br&gt;
the data is not indexed by Google. If you need your content &lt;br&gt;
to appear in search results, blog posts, individual product &lt;br&gt;
pages, or SEO-driven directory listings. Webflow CMS is still &lt;br&gt;
the right tool because it renders server-side, and Google &lt;br&gt;
can index it.&lt;/p&gt;

&lt;p&gt;Sheetrocket is the right tool for content that does not &lt;br&gt;
need to be indexed: menus, team directories, event &lt;br&gt;
schedules, price lists, and product catalogues on a page &lt;br&gt;
that is already indexed, and any content that changes &lt;br&gt;
frequently enough that the client cannot realistically &lt;br&gt;
manage it through a CMS.&lt;/p&gt;

&lt;p&gt;If your content needs SEO and your client needs Google &lt;br&gt;
Sheets, those two requirements point toward a more complex &lt;br&gt;
architecture like Webflow DevLink with an external framework. &lt;br&gt;
For most small to medium client projects, that level of &lt;br&gt;
complexity is not warranted.&lt;/p&gt;

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

&lt;p&gt;SheetRocket has a free plan that includes 1,000 API calls &lt;br&gt;
requests per month and 2 embeddable widgets. That is &lt;br&gt;
enough to set up a complete restaurant menu or team &lt;br&gt;
directory and show your client how it works before &lt;br&gt;
committing to anything.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sheetrocket.com" rel="noopener noreferrer"&gt;Try SheetRocket free at sheetrocket.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No credit card required.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Will the widget look good on mobile?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. SheetRocket widgets are responsive by default. The &lt;br&gt;
table view becomes horizontally scrollable on small screens. &lt;br&gt;
The cards view collapses from three columns to one column &lt;br&gt;
on mobile. You can also adjust font sizes and spacing in &lt;br&gt;
the typography customizer to match your site's mobile &lt;br&gt;
design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if my client accidentally deletes a row?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google Sheets keeps a full version history. Your client &lt;br&gt;
can restore any deleted row from the Edit menu by &lt;br&gt;
accessing the version history. This is actually more &lt;br&gt;
reliable than Webflow CMS, which has no native undo &lt;br&gt;
for CMS item deletion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use this on a Webflow site that is already using CMS?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. SheetRocket widgets and Webflow CMS are not mutually &lt;br&gt;
exclusive. You might use Webflow CMS for your blog posts &lt;br&gt;
(which need SEO) and SheetRocket for your menu or team &lt;br&gt;
page (which the client needs to update frequently). They &lt;br&gt;
coexist on the same page without any conflict.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the widget slow down my Webflow site?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The widget script loads asynchronously, which means it &lt;br&gt;
does not block your page from rendering. The data fetch &lt;br&gt;
happens after the page loads. For most use cases, the &lt;br&gt;
widget renders within one to two seconds of page load, &lt;br&gt;
which is acceptable for content like menus, directories, &lt;br&gt;
and product lists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if I want to show different subsets of the same &lt;br&gt;
sheet on different pages?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can create multiple embed codes from the same sheet &lt;br&gt;
with different filters. For example, a food menu page &lt;br&gt;
could show only Food category items and a drinks menu &lt;br&gt;
page could show only the Drinks category items, both pulling &lt;br&gt;
from the same spreadsheet with a different row filter &lt;br&gt;
configurations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can my client see which columns are hidden?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Hidden columns are filtered server-side before the &lt;br&gt;
response is sent to the browser. If a visitor opens &lt;br&gt;
their browser's developer tools and inspects the network &lt;br&gt;
response, they will only see the columns you chose to &lt;br&gt;
display. Internal columns never appear.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Last updated: April 2026&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sheetrocket is built by Allen Jones, a solo founder &lt;br&gt;
based in Ghana, building tools that make the web &lt;br&gt;
more accessible for small businesses and designers &lt;br&gt;
who work with them.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>google</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Best Sheet2API Alternatives in 2026 (One Gives You an API AND a Website Widget)</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Fri, 10 Apr 2026 00:25:30 +0000</pubDate>
      <link>https://forem.com/allenarduino/best-sheet2api-alternatives-in-2026-one-gives-you-an-api-and-a-website-widget-33i6</link>
      <guid>https://forem.com/allenarduino/best-sheet2api-alternatives-in-2026-one-gives-you-an-api-and-a-website-widget-33i6</guid>
      <description>&lt;p&gt;If you have been using Sheet2API or shopping around for a tool that &lt;br&gt;
turns Google Sheets into a usable API, you are in the right place. &lt;br&gt;
Sheet2API does a reasonable job at the core problem. But it has &lt;br&gt;
limitations that push a lot of users to look elsewhere, and there &lt;br&gt;
is now one tool in this category that does something none of the &lt;br&gt;
others have even attempted.&lt;/p&gt;

&lt;p&gt;This guide covers the five best Sheet2API alternatives in 2026. &lt;br&gt;
what makes each one worth considering, and which one is the right one &lt;br&gt;
fit depending on what you actually need.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why People Look for Sheet2API Alternatives
&lt;/h2&gt;

&lt;p&gt;Sheet2API is a legitimate tool. It converts Google Sheets into a &lt;br&gt;
RESTful API quickly supports read and write operations. But &lt;br&gt;
here is what users run into after signing up:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing is steep for what you get.&lt;/strong&gt; The Starter plan costs &lt;br&gt;
around £24.99 per month, billed annually, and limits you to 15 &lt;br&gt;
spreadsheet APIs and only 1,500 rows per sheet. The Pro plan &lt;br&gt;
jumps to £39.99 per month. For a tool built around a free product &lt;br&gt;
like Google Sheets, that price point catches many users off guard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It only speaks to developers.&lt;/strong&gt; Sheet2API gives you a JSON &lt;br&gt;
endpoint. What you do with that endpoint is entirely up to you. &lt;br&gt;
If you are a small business owner, a Webflow designer, or anyone &lt;br&gt;
who does not write code for a living? The tool stops being useful &lt;br&gt;
the moment you get your API URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No visual output.&lt;/strong&gt; You get data. You do not get anything to &lt;br&gt;
show that data on a website without building something custom on &lt;br&gt;
top of it.&lt;/p&gt;

&lt;p&gt;These are not criticisms that make Sheet2API a bad tool. They &lt;br&gt;
are simply gaps that the alternatives below address in different &lt;br&gt;
ways. Let us go through them.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. SheetRocket: Best Overall Alternative (API + Embeddable Widgets)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;sheetrocket.com&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who need a REST API, small businesses &lt;br&gt;
who want to display sheet data on their website, and anyone who &lt;br&gt;
wants both in one product.&lt;/p&gt;

&lt;p&gt;SheetRocket is the most complete tool in this category and the &lt;br&gt;
only one that gives you a REST API and an embeddable website &lt;br&gt;
widget from the same Google Sheet simultaneously. This is not &lt;br&gt;
a minor feature difference. It is a fundamentally different &lt;br&gt;
product vision.&lt;/p&gt;
&lt;h3&gt;
  
  
  How Sheetrocket Works
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Sign up and connect your sheet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You create an account, sign in with Google, and paste your &lt;br&gt;
Google Sheet URL into the dashboard. Sheetrocket connects to &lt;br&gt;
your sheet via a service account, which means no OAuth popups &lt;br&gt;
for your users and no complicated permissions setup.&lt;/p&gt;

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

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

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

&lt;p&gt;&lt;em&gt;The Sheetrocket dashboard. Paste your Google Sheet URL, and your API is created in seconds.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Your API is live immediately&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The moment your sheet is connected, SheetRocket generates a &lt;br&gt;
full REST API endpoint. On the API details page, you will see &lt;br&gt;
the Overview tab first. This is where your API URL lives, along &lt;br&gt;
with HTTP method controls. You can toggle GET, POST, PUT, and &lt;br&gt;
DELETE on or off, depending on what you want to allow. A code &lt;br&gt;
snippet below shows exactly how to start making requests in &lt;br&gt;
JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Overview tab on the API details page. Your endpoint URL is ready to use immediately.&lt;/em&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%2Fjso8mz8mjwgmg7dx9nk7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjso8mz8mjwgmg7dx9nk7.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Move to the Widgets tab&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where SheetRocket separates itself from every other &lt;br&gt;
tool in this list. Click the Widgets tab and you are presented &lt;br&gt;
with two options: a Table widget or a Cards widget.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgftmfj5ia51qr3jm6to.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgftmfj5ia51qr3jm6to.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Widgets tab. Choose between a table layout or a cards layout for your embedded widget.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Choose a card template (if using cards)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you choose the Cards view, SheetRocket offers six distinct &lt;br&gt;
card template designs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple:&lt;/strong&gt; A clean stacked layout that works for any data. Good for contact directories and general content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compact:&lt;/strong&gt; A tighter two-column grid for dense datasets. &lt;br&gt;
  Good for inventory lists and price tables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Profile:&lt;/strong&gt; Title and avatar image prominent. Good for the team &lt;br&gt;
  directories, speaker lists, and member rosters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product:&lt;/strong&gt; Full image at top with title and price below. &lt;br&gt;
  Good for restaurant menus, product catalogues, and service &lt;br&gt;
  listings. If a row has no image URL, the card displays &lt;br&gt;
  cleanly without an image placeholder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; Color-coded status badges for each record. Green &lt;br&gt;
  for active, yellow for pending, red for closed, and blue for &lt;br&gt;
  featured. Good for job boards, property listings, and &lt;br&gt;
  availability tables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Horizontal:&lt;/strong&gt; Image on the left with content on the right, &lt;br&gt;
  stacked as a list. Good for blog post feeds, news listings, &lt;br&gt;
  and recipe directories.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzm2rmvnu7a4jes0olvj1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzm2rmvnu7a4jes0olvj1.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The template picker shows a live visual preview of each design. Pro templates are clearly labeled.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Customize the widget&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After selecting your template, you get full customization &lt;br&gt;
panel:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sheet Tab:&lt;/strong&gt; Choose which tab of your spreadsheet to &lt;br&gt;
  pull data from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Row Limit:&lt;/strong&gt; Control how many rows appear in the widget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Theme:&lt;/strong&gt; Light or dark, matching your website design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Title:&lt;/strong&gt; An optional heading displayed above the widget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Column Visibility:&lt;/strong&gt; A checkbox list of every column in &lt;br&gt;
  your sheet. Uncheck any column to hide it from the widget. &lt;br&gt;
  This is critical for privacy. If your sheet has sensitive &lt;br&gt;
  columns like internal pricing, email addresses, or staff &lt;br&gt;
  notes, you can hide them completely. Hidden columns are &lt;br&gt;
  never sent to the widget at all. They are filtered on &lt;br&gt;
  the server before the response leaves SheetRocket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Row Filtering:&lt;/strong&gt; Show only rows that match a condition. &lt;br&gt;
  For example, only show rows where Status equals Active. &lt;br&gt;
  Supports contains, equals, starts with, and is not empty &lt;br&gt;
  operators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typography and Colors:&lt;/strong&gt; Customize font size, font &lt;br&gt;
  weight, font style, text color, text alignment, text &lt;br&gt;
  transform, and letter spacing for column headers, cell &lt;br&gt;
  values, and the widget title independently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per-Column Styles:&lt;/strong&gt; Apply different typography settings &lt;br&gt;
  to individual columns. Make the Price column bold and green &lt;br&gt;
  while the Description column stays default gray.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7t8cmrwncqs4c3877sd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7t8cmrwncqs4c3877sd.png" alt=" " width="800" height="519"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The customization panel. Column visibility, row filtering, and typography controls all in one place.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Copy and paste the embed code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When your widget is configured, SheetRocket generates an embed &lt;br&gt;
code in real time. It looks 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;div&lt;/span&gt;
  &lt;span class="na"&gt;data-sheetrocket=&lt;/span&gt;&lt;span class="s"&gt;"your-sheet-id"&lt;/span&gt;
&lt;span class="err"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="na"&gt;div&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://sheetrocket.com/widget.js"&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy that snippet and paste it into any website. Webflow users &lt;br&gt;
paste it into an Embed element. WordPress users paste it into a &lt;br&gt;
Custom HTML block. Plain HTML sites just drop it into the body. &lt;br&gt;
The widget renders your live Google Sheet data with your chosen &lt;br&gt;
design and all your customizations applied.&lt;/p&gt;

&lt;p&gt;Your configuration saves automatically. Come back the next day &lt;br&gt;
and everything is exactly where you left 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%2Fkwtvwobh3o2svntxxj6w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwtvwobh3o2svntxxj6w.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The embed code updates in real time as you change settings. The live preview below it shows exactly what visitors will see.&lt;/em&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%2F6d8c8y3cghcvmme6sr12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6d8c8y3cghcvmme6sr12.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A live Sheetrocket widget embedded on an external website. The data comes directly from a Google Sheet.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sheetrocket Pricing
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;API Requests&lt;/th&gt;
&lt;th&gt;Widgets&lt;/th&gt;
&lt;th&gt;Active APIs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0/month&lt;/td&gt;
&lt;td&gt;1,000/month&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$12/month&lt;/td&gt;
&lt;td&gt;50,000/month&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;td&gt;500,000/month&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The free plan includes the "Powered by Sheetrocket" branding on &lt;br&gt;
widgets. The Pro plan removes it, which is the primary upgrade &lt;br&gt;
trigger for anyone using widgets on a professional or client site.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who SheetRocket Is For
&lt;/h3&gt;

&lt;p&gt;Sheetrocket works for two very different people. The first is a &lt;br&gt;
developer who wants a clean REST API to power an app or a &lt;br&gt;
dashboard without setting up a backend. The second is a Webflow &lt;br&gt;
designer, a WordPress site owner, or a small business owner who &lt;br&gt;
has product data or team information in a Google Sheet and wants &lt;br&gt;
it to appear on their website without writing any code.&lt;/p&gt;

&lt;p&gt;No other tool in this category serves both audiences. Most &lt;br&gt;
alternatives stop at the JSON endpoint and expect developers &lt;br&gt;
to do the rest.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Sheetrocket Does Not Do
&lt;/h3&gt;

&lt;p&gt;Sheetrocket is built specifically for Google Sheets. It does not &lt;br&gt;
support Excel Online or other spreadsheet formats. If your data &lt;br&gt;
lives in Excel rather than Google Sheets, look at the other &lt;br&gt;
options below.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Sheety: Free and Fast for Simple Projects
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;sheety.co&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who need a quick read-only API for &lt;br&gt;
personal or prototype projects.&lt;/p&gt;

&lt;p&gt;Sheety has been around since 2019 and remains one of the most &lt;br&gt;
popular tools in this space because of how simple it is. Paste &lt;br&gt;
a Google Sheet URL, click a button, and you have a JSON endpoint. &lt;br&gt;
No account setup required on the free tier.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sheety's dashboard. Clean and minimal with a single focus on generating your API URL.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The free plan is genuinely generous for personal use. For &lt;br&gt;
anything production-facing, the limitations show up quickly. &lt;br&gt;
Write support is restricted on free tiers, request limits are &lt;br&gt;
low, and there is nothing beyond the API itself. No widgets, &lt;br&gt;
no visual output, no customization.&lt;/p&gt;

&lt;p&gt;Sheety is a solid starting point for a proof of concept or a &lt;br&gt;
static site build-time data fetch. It is not the right tool &lt;br&gt;
for anything that needs to display data on a website or handle &lt;br&gt;
meaningful traffic.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best use case:&lt;/strong&gt; Quick prototypes, personal projects, and &lt;br&gt;
read-only API needs where you just need JSON and nothing else.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. SheetDB: Clean API With Strong Documentation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;sheetdb.io&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers building applications who need &lt;br&gt;
well-documented read and write API access.&lt;/p&gt;

&lt;p&gt;SheetDB offers a clean REST API that supports the full range &lt;br&gt;
of CRUD operations: create, read, update, and delete. What stands out compared to other tools in this category is the &lt;br&gt;
quality of its documentation. If you are integrating Google &lt;br&gt;
Sheets data into a custom application, and your team needs clear &lt;br&gt;
reference docs; SheetDB delivers that better than most.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;SheetDB's documentation is detailed and includes code examples for multiple languages.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It supports filtering rows by column value using query &lt;br&gt;
parameters, pagination, and basic authentication. The &lt;br&gt;
dashboard is straightforward and shows request usage clearly.&lt;/p&gt;

&lt;p&gt;Like every other tool on this list except SheetRocket, &lt;br&gt;
SheetDB gives you a JSON endpoint and nothing else. There &lt;br&gt;
is no way to display your data on a website without building &lt;br&gt;
something custom on top of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free tier available with 500 monthly requests. &lt;br&gt;
Paid plans start at approximately $9 per month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best use case:&lt;/strong&gt; Application backends where a developer &lt;br&gt;
needs solid documentation and reliable write support.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. SheetBest: Simple API With a Clean Interface
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;sheet.best&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Users who want a polished dashboard experience &lt;br&gt;
with minimal configuration.&lt;/p&gt;

&lt;p&gt;SheetBest positions itself as the easiest way to turn a Google &lt;br&gt;
Sheet into an API, and the dashboard backs that up. The &lt;br&gt;
interface is clean, the setup flow is short, and you can have &lt;br&gt;
an endpoint ready in under two minutes.&lt;/p&gt;

&lt;p&gt;It supports GET, POST, PUT, PATCH, and DELETE operations and &lt;br&gt;
handles basic filtering well. For straightforward read and &lt;br&gt;
write use cases, it competes well with both Sheet2API and &lt;br&gt;
SheetDB.&lt;/p&gt;

&lt;p&gt;The pricing puts it in a similar bracket to Sheet2API, which &lt;br&gt;
is where it tends to lose users to Sheetrocket. For a similar &lt;br&gt;
price you get more with Sheetrocket, particularly if you need &lt;br&gt;
to display data visually on a website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free tier with limited requests. Paid plans &lt;br&gt;
start at approximately $9 per month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best use case:&lt;/strong&gt; Users who want a polished dashboard and &lt;br&gt;
straightforward API access without needing any visual output &lt;br&gt;
features.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Airtable: When You Need More Than a Spreadsheet
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;airtable.com&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Teams who have outgrown Google Sheets and need &lt;br&gt;
a proper database with API access.&lt;/p&gt;

&lt;p&gt;Airtable is not a direct Sheet2API alternative in the same way &lt;br&gt;
sense as the other tools here. It is a relational database &lt;br&gt;
with a spreadsheet interface and a built-in REST API. If your &lt;br&gt;
frustration with Sheet2API comes from Google Sheets itself &lt;br&gt;
being too limited, with no relationships between tables, slow &lt;br&gt;
performance on large datasets, and limited formula power. &lt;br&gt;
Airtable solves those problems.&lt;/p&gt;

&lt;p&gt;The API is well-documented and supports complex queries that &lt;br&gt;
go beyond what any of the Google Sheets tools can offer. &lt;br&gt;
Airtable also offers views, automations, forms, and &lt;br&gt;
integrations that Google Sheets simply does not have.&lt;/p&gt;

&lt;p&gt;The tradeoff is price and complexity. Airtable is &lt;br&gt;
significantly more expensive than the other tools here and &lt;br&gt;
requires learning a new platform. If your data is already &lt;br&gt;
well-managed in Google Sheets, and you just need to expose it, &lt;br&gt;
Airtable is more than you need.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best use case:&lt;/strong&gt; Teams who need a relational database with &lt;br&gt;
API access and are ready to move off Google Sheets entirely.&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;SheetRocket&lt;/th&gt;
&lt;th&gt;Sheet2API&lt;/th&gt;
&lt;th&gt;Sheety&lt;/th&gt;
&lt;th&gt;SheetDB&lt;/th&gt;
&lt;th&gt;SheetBest&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;REST API&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embeddable widgets&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Card templates&lt;/td&gt;
&lt;td&gt;6 designs&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table widget&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Column visibility control&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Row filtering in widget&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typography customization&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works on any website&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free plan&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Trial only&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starting paid price&lt;/td&gt;
&lt;td&gt;$12/month&lt;/td&gt;
&lt;td&gt;~£25/month&lt;/td&gt;
&lt;td&gt;~$10/month&lt;/td&gt;
&lt;td&gt;~$9/month&lt;/td&gt;
&lt;td&gt;~$9/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Excel Online support&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Which Tool Should You Choose
&lt;/h2&gt;

&lt;p&gt;Here is a direct answer depending on your situation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You are a developer who needs a quick JSON API for a &lt;br&gt;
personal project or prototype, and price is the top concern:&lt;/strong&gt;&lt;br&gt;
Use Sheety. It is free, it is fast, and it requires almost &lt;br&gt;
no setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You are a developer building an application and need solid &lt;br&gt;
documentation and reliable write access:&lt;/strong&gt;&lt;br&gt;
Use SheetDB. The documentation quality justifies the price &lt;br&gt;
for production application backends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You need to display Google Sheet data on a website, and you &lt;br&gt;
do not want to write any code to do it:&lt;/strong&gt;&lt;br&gt;
Use SheetRocket. It is the only tool in this category that &lt;br&gt;
lets you embed your sheet data as a styled, customizable &lt;br&gt;
widget on any website. The other tools on this list give &lt;br&gt;
you a JSON endpoint and leave the display layer entirely &lt;br&gt;
to you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You are a developer who needs the API today and knows you &lt;br&gt;
will eventually need to display that data on a website:&lt;/strong&gt;&lt;br&gt;
Use SheetRocket. You get both from the start without having &lt;br&gt;
to build a custom frontend on top of your API later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You need Excel Online support alongside Google Sheets:&lt;/strong&gt;&lt;br&gt;
Use Sheet2API. It is one of the few tools that handles both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You have outgrown Google Sheets and need relationships &lt;br&gt;
between tables, advanced automations, and a proper database:&lt;/strong&gt;&lt;br&gt;
Use Airtable. You are solving a different problem than the &lt;br&gt;
other tools on this list address.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Verdict on Sheet2API
&lt;/h2&gt;

&lt;p&gt;Sheet2API is a solid tool that has been around long enough to &lt;br&gt;
prove it works. It handles authentication, supports webhooks, &lt;br&gt;
and offers filtering. For a developer who needs a reliable API &lt;br&gt;
with Excel Online support and does not need anything visual, &lt;br&gt;
it remains a legitimate choice.&lt;/p&gt;

&lt;p&gt;The problem is value. At its price point, you are paying for &lt;br&gt;
a pure API tool in a market where a competitor now offers the &lt;br&gt;
same API capability plus six card template designs, an &lt;br&gt;
embeddable table widget, column visibility controls, row &lt;br&gt;
filtering, typography customization, and a free plan with &lt;br&gt;
1,000 monthly requests at a lower starting price.&lt;/p&gt;

&lt;p&gt;For most users discovering this category today, Sheetrocket &lt;br&gt;
is the better place to start.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get Started With Sheetrocket
&lt;/h2&gt;

&lt;p&gt;SheetRocket is free to start. No credit card required. &lt;br&gt;
Connect your Google Sheet, get your API endpoint, and &lt;br&gt;
build your first embeddable widget in under five minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sheetrocket.com" rel="noopener noreferrer"&gt;Start for free at sheetrocket.com&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Is there a free Sheet2API alternative?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Sheetrocket, Sheety, and SheetDB all offer free plans. &lt;br&gt;
SheetRocket's free plan includes 1,000 API requests per month, &lt;br&gt;
2 embeddable widgets, and 3 active APIs — which is more &lt;br&gt;
generous than most free tiers in this category.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I embed Google Sheets data on a Webflow site?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, with Sheetrocket. Connect your sheet, configure your &lt;br&gt;
widget, and paste the generated embed code into a Webflow &lt;br&gt;
Embed element. Your live sheet data appears on your site &lt;br&gt;
automatically. The other tools on this list do not offer &lt;br&gt;
an embed code. They only provide a JSON API endpoint &lt;br&gt;
that requires custom code to display.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between a Google Sheets API &lt;br&gt;
tool and the Google Sheets API itself?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Google Sheets API is Google's own API for reading &lt;br&gt;
and writing spreadsheet data programmatically. Using it &lt;br&gt;
directly requires setting up OAuth credentials, handling &lt;br&gt;
authentication, and writing code to manage requests. Tools &lt;br&gt;
like SheetRocket and Sheet2API sit on top of the Google &lt;br&gt;
Sheets API and handle all of that for you, giving you a &lt;br&gt;
simple endpoint you can use immediately without any setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does SheetRocket work with private Google Sheets?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Sheetrocket connects to your sheets via a service &lt;br&gt;
account that you share editor access with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sheetrocket-api@sheetrocket-491214.iam.gserviceaccount.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Your sheet stays private. Only the data you choose to &lt;br&gt;
expose through Sheetrocket becomes accessible via your &lt;br&gt;
API or widget, and you control exactly which columns &lt;br&gt;
are visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens to my widget if I edit my Google Sheet?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your changes appear automatically. Sheetrocket fetches &lt;br&gt;
live data on every request, so your widget always reflects &lt;br&gt;
the current state of your sheet. There is no manual sync &lt;br&gt;
or rebuild required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use Sheetrocket on WordPress?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Paste the embed code into a Custom HTML block in &lt;br&gt;
the WordPress block editor. Your widget will render &lt;br&gt;
anywhere you can add custom HTML, including page builders &lt;br&gt;
like Elementor and Divi.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Last updated: April 2026&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sheetrocket is built by Allen Jones, a solo founder &lt;br&gt;
based in Ghana. If you found this post useful, the best &lt;br&gt;
way to support it is to try Sheetrocket at &lt;br&gt;
sheetrocket.com.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Add a Contact Form to Your Astro Site Without a Backend</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Thu, 09 Apr 2026 16:04:10 +0000</pubDate>
      <link>https://forem.com/allenarduino/how-to-add-a-contact-form-to-your-astro-site-without-a-backend-13no</link>
      <guid>https://forem.com/allenarduino/how-to-add-a-contact-form-to-your-astro-site-without-a-backend-13no</guid>
      <description>&lt;p&gt;If you are building a portfolio, landing &lt;br&gt;
page, or blog with Astro, chances are you need a contact form.&lt;/p&gt;

&lt;p&gt;But here is the catch:&lt;/p&gt;

&lt;p&gt;Astro is a static site framework. &lt;br&gt;
It generates fast, lightweight HTML with no server-side backend. That means your forms have nowhere to send data by default.&lt;/p&gt;

&lt;p&gt;Setting up a backend to handle a contact form feels unnecessary &lt;br&gt;
work for most Astro developers. &lt;br&gt;
And that is exactly why thousands of people search for things like "Astro contact form without backend" every month.&lt;/p&gt;

&lt;p&gt;In this guide, you will learn exactly how to handle form submissions in your Astro site without building your own backend, using &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We will walk through a step-by-step tutorial with code you can copy, paste, and deploy immediately.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Astro Developers Need a Form Backend
&lt;/h2&gt;

&lt;p&gt;Astro builds static HTML files. &lt;br&gt;
That is its biggest strength. Fast. Lightweight. &lt;br&gt;
No server required.&lt;/p&gt;

&lt;p&gt;But static HTML forms cannot process their own submissions. When someone clicks submit on a plain HTML form, the data has nowhere to go unless something on the server receives it.&lt;/p&gt;

&lt;p&gt;Setting up your own backend just to collect form submissions means:&lt;/p&gt;

&lt;p&gt;You need a server running Node, PHP, or Python. &lt;br&gt;
You need routing, validation, and spam protection. You must configure &lt;br&gt;
email notifications. You need a database &lt;br&gt;
to store submissions. You must maintain &lt;br&gt;
it indefinitely.&lt;/p&gt;

&lt;p&gt;All this work just to receive a message from a website visitor.&lt;/p&gt;

&lt;p&gt;That is why most Astro developers use a form submission service instead.&lt;/p&gt;


&lt;h2&gt;
  
  
  Popular Ways to Handle Forms in Astro Without a Backend
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Formspree&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the oldest form backend services. &lt;br&gt;
Simple and reliable, but paid plans get &lt;br&gt;
expensive quickly. &lt;br&gt;
Google Sheets integration starts at $90/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Netlify Forms&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A great free option, but only works if your site is deployed on Netlify. If you host on Vercel, Cloudflare, or GitHub Pages, it does not work at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Formgrid.dev (Open-Source)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A newer privacy-first alternative that works with any Astro site, regardless of where it is deployed.&lt;/p&gt;

&lt;p&gt;Features include:&lt;/p&gt;

&lt;p&gt;Open source under MIT license&lt;/p&gt;

&lt;p&gt;Works on any website or deployment platform&lt;/p&gt;

&lt;p&gt;Email notifications for every submission&lt;/p&gt;

&lt;p&gt;Spam protection with a honeypot and rate limiting&lt;/p&gt;

&lt;p&gt;Optional Proof-of-Work CAPTCHA&lt;/p&gt;

&lt;p&gt;Free plan: unlimited forms and &lt;br&gt;
50 submissions per month&lt;/p&gt;

&lt;p&gt;Google Sheets sync on the &lt;br&gt;
Professional plan at $16/month&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Use Formgrid for Your Astro Site
&lt;/h2&gt;

&lt;p&gt;Formgrid is a privacy-first open source alternative to services like Formspree and Netlify Forms. &lt;br&gt;
Here is why it works well with Astro specifically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instant email notifications:&lt;/strong&gt; Receive every submission immediately in your inbox with clean, organized formatting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Works anywhere:&lt;/strong&gt; Unlike Netlify Forms, &lt;br&gt;
Formgrid works whether you deploy on Vercel, Netlify, Cloudflare Pages, GitHub Pages, or your own server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spam protection:&lt;/strong&gt; Built-in honeypot fields, rate limiting, and optional Proof-of-Work CAPTCHA keep bots out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-hostable:&lt;/strong&gt; Run Formgrid on your own infrastructure using Docker for complete data control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Submission dashboard:&lt;/strong&gt; Every submission is saved to your Formgrid &lt;br&gt;
dashboard. No submission is ever lost, even if the email fails to arrive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open source:&lt;/strong&gt; MIT license, no vendor &lt;br&gt;
lock-in, fully auditable.&lt;/p&gt;

&lt;p&gt;Whether you are a solo developer building a portfolio or a freelancer building client websites, Formgrid makes form handling fast, simple, and secure.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 1: Create a Formgrid Account
&lt;/h2&gt;

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

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

&lt;p&gt;Formgrid offers free and paid plans. &lt;br&gt;
The free plan includes:&lt;/p&gt;

&lt;p&gt;Unlimited forms&lt;/p&gt;

&lt;p&gt;50 submissions per month&lt;/p&gt;

&lt;p&gt;Email notifications&lt;/p&gt;

&lt;p&gt;Spam protection&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 2: Create a New Form
&lt;/h2&gt;

&lt;p&gt;Once logged in, go to your dashboard and click New Form.&lt;/p&gt;

&lt;p&gt;Give your form a name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Astro Contact Form"
"Portfolio Enquiry Form"  
"Client Contact Form"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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




&lt;h2&gt;
  
  
  Step 3: Copy Your Endpoint URL
&lt;/h2&gt;

&lt;p&gt;After creating your form, you will land on the form overview page.&lt;/p&gt;

&lt;p&gt;Go to the Overview tab and copy your unique endpoint URL. It looks like this:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



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

&lt;p&gt;You will use this URL as the action attribute on your HTML form or inside your fetch call.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Add the Form to Your
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Astro Site
&lt;/h2&gt;

&lt;p&gt;There are two ways to add Formgrid to your Astro site. &lt;br&gt;
Choose the one that fits your project.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option A: Simple HTML Form
&lt;/h3&gt;

&lt;p&gt;This is the fastest approach and requires zero JavaScript. &lt;br&gt;
Perfect for straightforward contact forms.&lt;/p&gt;

&lt;p&gt;In any &lt;code&gt;.astro&lt;/code&gt; file, add this code:&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



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

&lt;p&gt;When someone submits the form the page redirects to a Formgrid confirmation page. &lt;br&gt;
You receive the submission instantly by email.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option B: Fetch-Based Form
&lt;/h3&gt;
&lt;h3&gt;
  
  
  with No Page Redirect
&lt;/h3&gt;

&lt;p&gt;This approach keeps the user on your page after submission and shows a success message without any page reload. &lt;br&gt;
It uses Astro's built-in &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag.&lt;/p&gt;

&lt;p&gt;Create a new file called &lt;br&gt;
&lt;code&gt;ContactForm.astro&lt;/code&gt; in your components folder and add the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
// ContactForm.astro
---

&amp;lt;div class="form-wrapper"&amp;gt;
  &amp;lt;form id="contact-form"&amp;gt;

    &amp;lt;!-- Honeypot spam protection --&amp;gt;
    &amp;lt;input
      type="text"
      name="_honey"
      style="display:none"
      aria-hidden="true"
    /&amp;gt;

    &amp;lt;div class="field"&amp;gt;
      &amp;lt;label for="name"&amp;gt;Your Name&amp;lt;/label&amp;gt;
      &amp;lt;input
        type="text"
        id="name"
        name="name"
        placeholder="Allen Jones"
        required
      /&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class="field"&amp;gt;
      &amp;lt;label for="email"&amp;gt;Email Address&amp;lt;/label&amp;gt;
      &amp;lt;input
        type="email"
        id="email"
        name="email"
        placeholder="allen@example.com"
        required
      /&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class="field"&amp;gt;
      &amp;lt;label for="message"&amp;gt;Message&amp;lt;/label&amp;gt;
      &amp;lt;textarea
        id="message"
        name="message"
        rows="5"
        placeholder="Write your message here"
        required
      &amp;gt;&amp;lt;/textarea&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;p 
      id="success-message" 
      style="display:none; color: green;"
    &amp;gt;
      Your message was sent successfully.
    &amp;lt;/p&amp;gt;

    &amp;lt;p 
      id="error-message" 
      style="display:none; color: red;"
    &amp;gt;
      Something went wrong. Please try again.
    &amp;lt;/p&amp;gt;

    &amp;lt;button type="submit" id="submit-btn"&amp;gt;
      Send Message
    &amp;lt;/button&amp;gt;

  &amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
  const form = document.getElementById(
    'contact-form'
  ) as HTMLFormElement

  const submitBtn = document.getElementById(
    'submit-btn'
  ) as HTMLButtonElement

  const successMsg = document.getElementById(
    'success-message'
  ) as HTMLParagraphElement

  const errorMsg = document.getElementById(
    'error-message'
  ) as HTMLParagraphElement

  form.addEventListener('submit', async (e) =&amp;gt; {
    e.preventDefault()

    submitBtn.textContent = 'Sending...'
    submitBtn.disabled = true
    successMsg.style.display = 'none'
    errorMsg.style.display = 'none'

    const formData = new FormData(form)
    const data = Object.fromEntries(
      formData.entries()
    )

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

      if (response.ok) {
        form.reset()
        successMsg.style.display = 'block'
      } else {
        errorMsg.style.display = 'block'
      }
    } catch {
      errorMsg.style.display = 'block'
    } finally {
      submitBtn.textContent = 'Send Message'
      submitBtn.disabled = false
    }
  })
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Now import the component on any page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
// src/pages/contact.astro
import ContactForm from 
  '../components/ContactForm.astro'
---

&amp;lt;html lang="en"&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8" /&amp;gt;
    &amp;lt;title&amp;gt;Contact&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Get In Touch&amp;lt;/h1&amp;gt;
    &amp;lt;ContactForm /&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: Receive Submissions Instantly
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight email"&gt;&lt;code&gt;&lt;span class="nt"&gt;New Submission&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; Astro Contact Form&lt;/span&gt;

Name: Allen Jones
Email: allen@example.com
Message: Hi, I would love to work 
         with you on my next project.

Submitted: 10:30 AM, April 9, 2026
&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%2Fw0lu1tjfb1gpstvhesgu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0lu1tjfb1gpstvhesgu.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;You can also view all submissions &lt;br&gt;
in your Formgrid dashboard at any time.&lt;/p&gt;

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

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




&lt;h2&gt;
  
  
  Bonus: Send Astro Form Submissions
&lt;/h2&gt;

&lt;h2&gt;
  
  
  to Google Sheets
&lt;/h2&gt;

&lt;p&gt;If you want every form submission to automatically appear as a new row in a Google Sheet with no Zapier and no API setup, this is available on the Professional plan at $16/month.&lt;/p&gt;

&lt;p&gt;Here is how it works:&lt;/p&gt;

&lt;p&gt;Share a Google Sheet with the Formgrid service account email address. Paste the sheet URL into your form settings. Done. &lt;br&gt;
Every submission flows in automatically as a new row.&lt;/p&gt;

&lt;p&gt;Column headers are created from your form field names on the very first submission, so you do not need to set anything up in the spreadsheet.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to Use a Form Service
&lt;/h2&gt;

&lt;h2&gt;
  
  
  vs Building Your Own Backend
&lt;/h2&gt;

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

&lt;p&gt;You need a simple contact or enquiry form. You do not want to &lt;br&gt;
build or maintain a backend. &lt;br&gt;
You want instant email notifications. You want spam protection without configuration. You are deploying a static Astro site. &lt;br&gt;
You want submissions saved to a dashboard automatically.&lt;/p&gt;

&lt;p&gt;Build your own backend if:&lt;/p&gt;

&lt;p&gt;You need custom authentication logic. You need advanced server-side validation. &lt;br&gt;
You want to store submissions in your own database. &lt;br&gt;
You are building a full SaaS application with complex form workflows.&lt;/p&gt;

&lt;p&gt;For 90% of Astro portfolios, landing pages, and client websites, a form service is more than enough.&lt;/p&gt;




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

&lt;p&gt;Handling form submissions in an Astro site without a backend used to mean hacks, expensive services, or deploying a server you did not need.&lt;/p&gt;

&lt;p&gt;With Formgrid, you can:&lt;/p&gt;

&lt;p&gt;Build a working contact form in under 5 minutes. &lt;br&gt;
Receive submissions &lt;br&gt;
instantly by email. &lt;br&gt;
Avoid all backend code entirely. &lt;br&gt;
Self-host if you want full data control. &lt;br&gt;
Connect to Google Sheets automatically on the &lt;br&gt;
Professional plan.&lt;/p&gt;

&lt;p&gt;If you want a simple, open source, privacy-first way to handle form &lt;br&gt;
submissions in your Astro site, give Formgrid a try.&lt;/p&gt;

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

&lt;p&gt;👉 &lt;a href="https://github.com/allenarduino/formgrid" rel="noopener noreferrer"&gt;GitHub: github.com/allenarduino/formgrid&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 looks off.&lt;/em&gt;&lt;/p&gt;




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

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

</description>
    </item>
    <item>
      <title>Why Contact Form 7 Emails Look Unprofessional and How to Fix It</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Wed, 08 Apr 2026 14:26:48 +0000</pubDate>
      <link>https://forem.com/allenarduino/why-contact-form-7-emails-look-unprofessional-and-how-to-fix-it-2jcb</link>
      <guid>https://forem.com/allenarduino/why-contact-form-7-emails-look-unprofessional-and-how-to-fix-it-2jcb</guid>
      <description>&lt;p&gt;You installed Contact Form 7 on your WordPress site. &lt;br&gt;
Someone fills out your contact form. You receive the email.&lt;/p&gt;

&lt;p&gt;And it looks like this:&lt;/p&gt;

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

&lt;p&gt;Or if you are lucky, it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;From&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;John Smith&lt;/span&gt;
&lt;span class="py"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;john@example.com&lt;/span&gt;
&lt;span class="py"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Hello there&lt;/span&gt;
&lt;span class="py"&gt;_wpcf7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1234&lt;/span&gt;
&lt;span class="py"&gt;_wpcf7_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5.7&lt;/span&gt;
&lt;span class="py"&gt;_wpcf7_locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;en_US&lt;/span&gt;
&lt;span class="py"&gt;_wpcf7_unit_tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wpcf7-f1-p2-o1&lt;/span&gt;
&lt;span class="py"&gt;_wpcf7_container_post&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;If you are an event manager receiving 20 registrations a day, or a small business owner trying to act quickly on client inquiries, this email is a nightmare to read.&lt;/p&gt;

&lt;p&gt;This guide explains exactly why CF7 emails look the way they do and gives you two ways to fix it permanently.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Contact Form 7 Emails Look So Bad
&lt;/h2&gt;

&lt;p&gt;Contact Form 7 sends notification emails by dumping whatever data it receives into the email body. &lt;br&gt;
It does not know your form's structure. &lt;br&gt;
It does not know which fields are important. &lt;br&gt;
It does not know that your recipient needs to see &lt;br&gt;
Contact Information, Event Details, before Payment Summary.&lt;/p&gt;

&lt;p&gt;It just sends everything in one flat list, including internal WordPress fields that your recipient should never see.&lt;/p&gt;

&lt;p&gt;Here are the most common problems CF7 users complain about:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Internal fields showing up in every email&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CF7 includes internal WordPress variables &lt;br&gt;
like &lt;code&gt;_wpcf7&lt;/code&gt;, &lt;code&gt;_wpcf7_version&lt;/code&gt;, &lt;br&gt;
&lt;code&gt;_wpcf7_unit_tag&lt;/code&gt;, and &lt;br&gt;
&lt;code&gt;_wpcf7_container_post&lt;/code&gt; in every &lt;br&gt;
notification email. These are not your &lt;br&gt;
data. They are WordPress internals. &lt;br&gt;
But CF7 sends them anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No section headers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All fields appear in one flat list with no grouping. Name, email, message, event selection, dietary requirements, and payment details are all running together with no separation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No formatting on long text&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Long text values appear as one unbroken paragraph with no line breaks. Reading a multi-paragraph message in a CF7 email is genuinely difficult.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong field order&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fields appear in the order they were submitted, not in a logical reading order. If your form has 20 fields, the email is impossible to scan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generic subject line&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every email says "New message from your contact form" with no context &lt;br&gt;
about who submitted or what they selected. &lt;br&gt;
If you receive 50 submissions per day, every email looks identical &lt;br&gt;
in your inbox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Looks like spam&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because CF7 relies on WordPress PHP &lt;br&gt;
mail for delivery and includes internal fields and raw data. &lt;br&gt;
Gmail and Outlook increasingly treat CF7 notifications as suspicious. &lt;br&gt;
Many CF7 emails end up in spam folders or get rejected entirely.&lt;/p&gt;

&lt;p&gt;The problem gets worse the more fields your form has. A simple 3-field contact form is manageable. &lt;br&gt;
But event registration forms, client intake forms, and job application forms can have 20 to 40 fields. When all of that arrives &lt;br&gt;
as one unformatted block, the person reading it has to hunt for the &lt;br&gt;
information they need every single time.&lt;/p&gt;


&lt;h2&gt;
  
  
  What a Professional Form Email Should Look Like
&lt;/h2&gt;

&lt;p&gt;Instead of a raw data dump, imagine &lt;br&gt;
receiving this for every registration:&lt;/p&gt;

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

&lt;p&gt;Clean. Organized. Readable by anyone. &lt;br&gt;
Whether they are a developer, an event coordinator, or an office manager who just needs to know who is coming and what they paid.&lt;/p&gt;

&lt;p&gt;That is what you should be receiving. &lt;br&gt;
Here is how to get there.&lt;/p&gt;


&lt;h2&gt;
  
  
  Who Does This Problem Affect Most
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Event organizers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Workshop registrations, conference entries, and seminar signups. &lt;br&gt;
Your coordinator needs to see attendee details in a logical order, not a random field dump. For a 200-person event, receiving unreadable registration emails is hours of unnecessary work every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small businesses&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Client intake forms, service booking forms, and quote request forms. Your team needs to act on submissions quickly. &lt;br&gt;
A clean email means faster response times and fewer mistakes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Freelancers and consultants&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Project brief forms, onboarding forms. &lt;br&gt;
When a new client submits their project brief, you want it formatted like a document you can actually work from, not a wall of raw text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nonprofits and community organizations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Volunteer applications, membership forms, and donation forms. Your coordinator needs to process applications efficiently without deciphering raw data.&lt;/p&gt;

&lt;p&gt;If you are sending form submission emails to anyone who is not a developer, the default CF7 email format is not good enough.&lt;/p&gt;


&lt;h2&gt;
  
  
  Fix 1: Customize CF7 Email
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Templates Directly
&lt;/h2&gt;

&lt;p&gt;Contact Form 7 does let you customize &lt;br&gt;
your email template. It is not beautiful, but it works for simple forms.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Open your CF7 form settings
&lt;/h3&gt;

&lt;p&gt;In your WordPress dashboard, go to Contact and click on your form. Click the Mail tab at the top.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Edit the message body
&lt;/h3&gt;

&lt;p&gt;By default, the message body uses the &lt;code&gt;[all_fields]&lt;/code&gt; shortcode, which &lt;br&gt;
dumps everything. Replace it with your specific field shortcodes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;From: [your-name]
Email: [your-email]
Phone: [your-phone]

Message:
[your-message]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;[your-name]&lt;/code&gt;, &lt;code&gt;[your-email]&lt;/code&gt;, &lt;br&gt;
&lt;code&gt;[your-phone]&lt;/code&gt;, and &lt;code&gt;[your-message]&lt;/code&gt; &lt;br&gt;
with the actual field names from your form.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Customize the subject line
&lt;/h3&gt;

&lt;p&gt;Change the subject line from the &lt;br&gt;
generic default to something meaningful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;New inquiry from [your-name] 
via [_site_title]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives every email a subject line that shows who submitted and where it came from.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Remove internal fields
&lt;/h3&gt;

&lt;p&gt;Make sure your message body only includes fields you actually want &lt;br&gt;
to see. Do not include &lt;br&gt;
&lt;code&gt;[_wpcf7]&lt;/code&gt;, &lt;code&gt;[_wpcf7_version]&lt;/code&gt;, or any other internal WordPress &lt;br&gt;
variables.&lt;/p&gt;
&lt;h3&gt;
  
  
  The limitation of this approach
&lt;/h3&gt;

&lt;p&gt;CF7 email customization is plain text. &lt;br&gt;
You can control which fields appear and in what order, but you cannot add section headers, styled layouts, colored backgrounds, or anything &lt;br&gt;
that makes the email look genuinely professional.&lt;/p&gt;

&lt;p&gt;For a simple contact form, this is probably enough. &lt;br&gt;
For complex registration forms with 10 or more fields, you will still end up with a long flat list that is hard to scan.&lt;/p&gt;


&lt;h2&gt;
  
  
  Fix 2: Use Formgrid for Fully Customizable Email Templates
&lt;/h2&gt;

&lt;p&gt;If you want complete control over how your notification emails look &lt;br&gt;
including section headers, branded colors, grouped fields, and custom subject lines, consider switching to Formgrid as your form backend.&lt;/p&gt;

&lt;p&gt;Formgrid is an open-source form backend and form builder. &lt;br&gt;
On the Business plan at $29/month, you get full HTML email template control using Mustache templating. &lt;br&gt;
A simple, widely used templating language that lets you write an HTML email with placeholders that get replaced with real submission data automatically.&lt;/p&gt;
&lt;h3&gt;
  
  
  The available template variables
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight handlebars"&gt;&lt;code&gt;&lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;_formName&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;    
Name of your form

&lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;_time&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;        
Submission timestamp

&lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;fieldName&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;    
Any field by its exact name attribute

&lt;span class="k"&gt;{{#&lt;/span&gt; &lt;span class="nv"&gt;fields&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;      
Loop through all fields
  &lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;_name&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;      Field label
  &lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;_value&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;     Field value
&lt;span class="k"&gt;{{/&lt;/span&gt; &lt;span class="nv"&gt;fields&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;      
Close the loop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Option A: The simple loop for any form
&lt;/h3&gt;

&lt;p&gt;If you just want clean formatted emails without thinking too much about structure use the fields loop. This works for any form automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-family: sans-serif; 
            max-width: 600px; 
            margin: 0 auto;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: #1d4f3d;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    New Submission: {{ _formName }}
  &lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

  {{# fields }}
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin-bottom: 16px; 
              border-bottom: 1px solid #eee; 
              padding-bottom: 16px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin: 0; 
              font-size: 12px; 
              color: #888; 
              text-transform: uppercase;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      {{ _name }}
    &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin: 4px 0 0; 
              font-size: 15px; 
              color: #333;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      {{ _value }}
    &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  {{/ fields }}

  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size: 12px; 
            color: #999;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Submitted: {{ _time }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;This renders every field cleanly with its label above and value below. No internal fields. No raw data. No mess. &lt;br&gt;
Clean, readable output for every submission automatically.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option B: Sectioned template for complex registration forms
&lt;/h3&gt;

&lt;p&gt;If your form has multiple sections, like a workshop registration with &lt;br&gt;
attendee details, session selection, dietary requirements, and payment. You can group fields into sections &lt;br&gt;
with clear headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-family: sans-serif; 
            max-width: 600px; 
            margin: 0 auto; 
            color: #1f2937;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: #1d4f3d; 
             border-bottom: 2px solid #e8f3ee; 
             padding-bottom: 10px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    New Registration: {{ _formName }}
  &lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: #1d4f3d;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Attendee Information
  &lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Name:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ name }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Email:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ email }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Company:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ company }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Phone:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ phone }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: #1d4f3d; 
             margin-top: 24px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Session Selection
  &lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Workshop:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; 
    {{ workshopName }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Date:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ date }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Format:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ format }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: #1d4f3d; 
             margin-top: 24px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Payment
  &lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Ticket Type:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; 
    {{ ticketType }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Total:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; 
    {{ totalAmount }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: #1d4f3d; 
             margin-top: 24px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Notes
  &lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{{ notes }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin-top: 32px; 
             border: none; 
             border-top: 1px solid #e5e7eb;"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size: 12px; 
            color: #9ca3af; 
            margin-top: 12px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Submitted: {{ _time }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;The variable names like &lt;code&gt;{{ name }}&lt;/code&gt;, &lt;br&gt;
&lt;code&gt;{{ workshopName }}&lt;/code&gt;, and &lt;br&gt;
&lt;code&gt;{{ totalAmount }}&lt;/code&gt; must match the &lt;br&gt;
&lt;code&gt;name&lt;/code&gt; attributes of your HTML form &lt;br&gt;
inputs exactly:&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;"name"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"workshopName"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"totalAmount"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you complete control over &lt;br&gt;
the layout, grouping, and order of &lt;br&gt;
every notification email.&lt;/p&gt;
&lt;h3&gt;
  
  
  Custom subject lines
&lt;/h3&gt;

&lt;p&gt;You can control the email subject &lt;br&gt;
line using the &lt;code&gt;_subject&lt;/code&gt; hidden &lt;br&gt;
field in your HTML form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
  &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; 
  &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_subject"&lt;/span&gt; 
  &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"New Registration from {{ name }}"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means every submission email has &lt;br&gt;
a meaningful subject line like &lt;br&gt;
"New Registration from Sarah Johnson" &lt;br&gt;
instead of the generic &lt;br&gt;
"New form submission."&lt;/p&gt;


&lt;h2&gt;
  
  
  How to Set Up Custom Email Templates in Formgrid
&lt;/h2&gt;

&lt;p&gt;Custom email templates are available &lt;br&gt;
on the Business plan at $29/month.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Go to your form settings
&lt;/h3&gt;

&lt;p&gt;Log in to your Formgrid dashboard, open your form, and click the &lt;br&gt;
Settings tab.&lt;/p&gt;



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


&lt;h3&gt;
  
  
  Step 2: Find the Custom Email
&lt;/h3&gt;
&lt;h3&gt;
  
  
  Template section
&lt;/h3&gt;

&lt;p&gt;Scroll down to the Custom Email &lt;br&gt;
Template section. If you are on the Business plan, you will see the &lt;br&gt;
full template editor. &lt;br&gt;
If you are on the free or Premium plan, you will see a prompt to upgrade.&lt;/p&gt;



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


&lt;h3&gt;
  
  
  Step 3: Enable the custom template
&lt;/h3&gt;

&lt;p&gt;Toggle the custom template on. The &lt;br&gt;
editor pre-populates with a starter &lt;br&gt;
template using the simple fields loop. &lt;br&gt;
A clean starting point that works for &lt;br&gt;
any form immediately.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Customize your template
&lt;/h3&gt;

&lt;p&gt;Edit the HTML to match your needs. &lt;br&gt;
Use the simple loop for basic forms or build a sectioned template for &lt;br&gt;
complex registration forms. The available variables panel shows &lt;br&gt;
every variable you can use.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 5: Preview and save
&lt;/h3&gt;

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

&lt;p&gt;From this point on, every submission to your form will use your custom template. &lt;br&gt;
Clean, organized, and formatted exactly the way you designed.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 6: Test it
&lt;/h3&gt;

&lt;p&gt;Submit a test entry on your form and check your inbox. &lt;br&gt;
Your notification email should arrive formatted exactly as you designed.&lt;/p&gt;


&lt;h2&gt;
  
  
  How to Use Formgrid With WordPress
&lt;/h2&gt;

&lt;p&gt;Formgrid is not a WordPress plugin. &lt;br&gt;
It works through a simple HTML form &lt;br&gt;
or iframe embed in your WordPress &lt;br&gt;
Custom HTML block.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option A: Replace CF7 with an
&lt;/h3&gt;
&lt;h3&gt;
  
  
  HTML form
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; 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;Step 2:&lt;/strong&gt; Create a new form and copy &lt;br&gt;
your endpoint URL from the Overview tab:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






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




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




&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; In your WordPress page editor &lt;br&gt;
add a Custom HTML block and replace &lt;br&gt;
your CF7 shortcode with 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;"https://formgrid.dev/api/f/your-form-id"&lt;/span&gt;
  &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

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

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

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

  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_honey"&lt;/span&gt; 
    &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:none"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

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

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Publish the page and submit a test entry.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option B: Embed the Formgrid form builder
&lt;/h3&gt;

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

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




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




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

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

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

&lt;/div&gt;



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




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

&lt;h2&gt;
  
  
  More Than Just Email Templates
&lt;/h2&gt;

&lt;p&gt;Custom email templates are part of the Formgrid Business plan at $29/month &lt;br&gt;
which also includes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;15,000 submissions per month&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-responder emails&lt;/strong&gt;&lt;br&gt;
Automatically send confirmation emails to your form submitters. Every person who registers gets an instant professional confirmation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multiple notification recipients&lt;/strong&gt;&lt;br&gt;
Send submissions to your whole team simultaneously. Everyone who needs to see registrations gets them &lt;br&gt;
in their inbox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom subject lines&lt;/strong&gt;&lt;br&gt;
Every email has a meaningful subject line showing who submitted and what they selected.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Webhooks&lt;/strong&gt;&lt;br&gt;
Connect to Slack, Notion, and other tools when a submission arrives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priority support&lt;/strong&gt;&lt;br&gt;
Direct access to the founder for any issues.&lt;/p&gt;




&lt;h2&gt;
  
  
  CF7 vs Formgrid: Which One
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Should You Use
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You have a simple 3-field contact 
form and just need basic improvements:

Customize CF7 directly using field shortcodes. 
Takes 10 minutes.
Free.


You have a complex registration form with multiple sections, and your team needs to read submissions quickly:

Switch to Formgrid. Full HTML email template control. Section 
headers. 
Branded colors. Clean, organized notifications.
Business plan at $29/month.


You are non-technical and do not want to touch any code:

Use Formgrid's form builder via iframe. Build your form with drag 
and drop. Upgrade to Business for professional email templates.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Real Cost of Unreadable
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Form Emails
&lt;/h2&gt;

&lt;p&gt;It is easy to think of messy form emails as just a minor annoyance. &lt;br&gt;
But the real cost is higher than it looks.&lt;/p&gt;

&lt;p&gt;Every time you receive an unformatted registration email and have to hunt through raw field data to find the information you need, that is time wasted. &lt;br&gt;
For a small team processing 50 registrations per event, that waste &lt;br&gt;
adds up to hours.&lt;/p&gt;

&lt;p&gt;Every time you forward an unformatted submission to a colleague, and they have to decode it, that is friction that slows your whole operation down.&lt;/p&gt;

&lt;p&gt;And every time a submission arrives looking like spam and gets filtered by Gmail before it ever reaches you. That is a lead or registration you never knew you missed.&lt;/p&gt;

&lt;p&gt;Clean, organized notification emails are not a luxury. &lt;br&gt;
They are the difference between a form that works or your business and a form that creates extra work every single day.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Can I fix CF7 email formatting &lt;br&gt;
without switching tools?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Go to your CF7 form settings, click the Mail tab, and replace &lt;br&gt;
&lt;code&gt;[all_fields]&lt;/code&gt; with specific field shortcodes in the order you want &lt;br&gt;
them. &lt;br&gt;
This removes internal fields and gives you control over the field &lt;br&gt;
order. It will not give you section headers or HTML styling, but it is a free improvement that takes 10 minutes.&lt;/p&gt;

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

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

&lt;p&gt;&lt;strong&gt;What happens to my submissions &lt;br&gt;
if the email fails?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With CF7 and PHP mail, if the email fails, the submission is lost permanently. &lt;br&gt;
With Formgrid, every submission is saved to your dashboard regardless of email delivery. &lt;br&gt;
You can always log in and see every submission ever received.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I see a preview before &lt;br&gt;
my template goes live?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Formgrid's template editor includes a Preview button that shows &lt;br&gt;
you exactly how your email will look with sample data substituted in before you save and go live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need to know HTML to use &lt;br&gt;
custom email templates?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Basic HTML knowledge helps, but is not required. &lt;br&gt;
The template editor pre-populates with a clean starter template that works immediately. &lt;br&gt;
You can customize colors and layout by editing simple inline CSS values.&lt;/p&gt;




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

&lt;p&gt;Contact Form 7 email notifications look the way they do because CF7 &lt;br&gt;
was built as a simple form tool, not an email design tool. For basic &lt;br&gt;
contact forms, the default output is acceptable.&lt;/p&gt;

&lt;p&gt;But the moment your form gets complex &lt;br&gt;
with multiple sections and many fields, and your recipients need to act quickly on what they receive, the default CF7 email becomes a real problem.&lt;/p&gt;

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

&lt;p&gt;Customize CF7 directly using field shortcodes for a free improvement &lt;br&gt;
that takes 10 minutes.&lt;/p&gt;

&lt;p&gt;Or switch to Formgrid for full HTML email template control, section headers, branded colors, custom subject lines, and a submission dashboard that saves every entry regardless of email delivery.&lt;/p&gt;

&lt;p&gt;Either way, your notification emails will stop looking like spam and start looking like professional business email communications.&lt;/p&gt;

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




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




</description>
      <category>wordpress</category>
      <category>form</category>
      <category>form7</category>
      <category>formbackend</category>
    </item>
    <item>
      <title>Why Your WordPress Contact Form Stopped Working in 2026</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Wed, 08 Apr 2026 12:08:32 +0000</pubDate>
      <link>https://forem.com/allenarduino/why-your-wordpress-contact-form-stopped-working-in-2026-3ndf</link>
      <guid>https://forem.com/allenarduino/why-your-wordpress-contact-form-stopped-working-in-2026-3ndf</guid>
      <description>&lt;p&gt;You did not change anything.&lt;/p&gt;

&lt;p&gt;Your website looks fine. Your contact form is still there. &lt;br&gt;
Visitors can still fill it out and hit submit. &lt;br&gt;
They even see a success message.&lt;/p&gt;

&lt;p&gt;But the emails are not arriving.&lt;/p&gt;

&lt;p&gt;No submissions in your inbox. No &lt;br&gt;
notifications. Nothing. Just silence.&lt;/p&gt;

&lt;p&gt;If this sounds familiar, you are not alone. &lt;br&gt;
Thousands of WordPress site owners experienced the same problem starting in late 2025 and continuing into 2026. And most of them &lt;br&gt;
had no idea why.&lt;/p&gt;

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


&lt;h2&gt;
  
  
  What Changed in Late 2025
&lt;/h2&gt;

&lt;p&gt;In November 2025, Gmail made a fundamental change to how it handles &lt;br&gt;
unauthenticated emails.&lt;/p&gt;

&lt;p&gt;Previously, Gmail would route suspicious emails to your spam folder, where you could theoretically still find them. &lt;br&gt;
From November 2025, Gmail started rejecting non-compliant emails entirely at the server level. They never arrive anywhere. Not your inbox. Not your spam folder. They simply disappear.&lt;/p&gt;

&lt;p&gt;Microsoft Outlook and Yahoo made similar enforcement changes around the same time. The result was that millions of contact form emails that had been working for years suddenly stopped being delivered &lt;br&gt;
with no warning and no error message.&lt;/p&gt;

&lt;p&gt;Your contact form was not broken. &lt;br&gt;
Your hosting server was sending the emails. &lt;br&gt;
But Gmail, Outlook, and Yahoo were quietly rejecting them before they ever reached you.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why WordPress Contact Forms Are Affected
&lt;/h2&gt;

&lt;p&gt;WordPress sends all emails, including your contact form notifications, using a PHP function called &lt;code&gt;mail()&lt;/code&gt;. This function sends emails directly from your web server without any authentication or encryption.&lt;/p&gt;

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

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

&lt;p&gt;Every WordPress contact form plugin is affected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Contact Form 7: affected
WPForms: affected
Gravity Forms: affected
Ninja Forms: affected
Formidable Forms: affected
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The plugin itself is not broken. The problem is WordPress PHP mail, which every plugin depends on by default.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Five Most Common Reasons Your
&lt;/h2&gt;

&lt;h2&gt;
  
  
  WordPress Form Emails Stopped Arriving
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Reason 1: Gmail now rejects unauthenticated emails entirely&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before November 2025, Gmail sent suspicious emails to spam. &lt;br&gt;
Now Gmail rejects them at the server level. &lt;br&gt;
They never arrive anywhere. Your form is sending. &lt;br&gt;
Gmail is refusing to accept.&lt;/p&gt;

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

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

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

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

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

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

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

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

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

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


&lt;h2&gt;
  
  
  The Three Signs Your Contact Form
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Is Affected
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sign 1: Your form shows a success message, but you receive nothing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The form submits successfully. The visitor sees a thank-you message. But you never receive the notification &lt;br&gt;
email. This is the most common symptom since Gmail's November 2025 changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sign 2: Emails were working and then suddenly stopped&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You had been receiving form notifications for months or years, and then, around late 2025 or early 2026, they stopped arriving without any changes on your end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sign 3: Test emails from your form do not arrive&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You send a test email from your contact form plugin settings, and it never arrives in your inbox or spam folder.&lt;/p&gt;

&lt;p&gt;If any of these match your situation, the fix below will solve it.&lt;/p&gt;


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

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

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

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

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

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

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

&lt;p&gt;&lt;strong&gt;Mailgun (free tier)&lt;/strong&gt;&lt;br&gt;
100 emails per day are free. Excellent deliverability. Requires domain &lt;br&gt;
verification.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Configure WP Mail SMTP
&lt;/h3&gt;

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

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


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

&lt;p&gt;If you want more than just reliable email delivery, including a submission dashboard so you never lose a submission again, consider switching to Formgrid as your form backend.&lt;/p&gt;

&lt;p&gt;Formgrid is an open-source form backend and form builder that handles your form submissions independently of WordPress. &lt;br&gt;
It handles email delivery through enterprise-grade, authenticated &lt;br&gt;
infrastructure that Gmail and Outlook &lt;br&gt;
accept reliably. Here is the most important difference &lt;br&gt;
between Formgrid and the SMTP fix:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every submission is saved to your Formgrid dashboard regardless of &lt;br&gt;
whether the email was delivered.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even if Gmail changes its rules again tomorrow, your submissions are not lost. You can log in to Formgrid and see every submission ever received.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option A: HTML Form in a WordPress Custom HTML Block
&lt;/h3&gt;

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

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Sign up 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;a href="https://media2.dev.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=" "&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 endpoint URL from the Overview tab. &lt;br&gt;
It looks like this:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






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




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

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

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

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

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

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

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

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

&lt;/div&gt;



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

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

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

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



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



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

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

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

&lt;/div&gt;



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




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

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

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

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

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

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

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

&lt;p&gt;&lt;strong&gt;Spam protection&lt;/strong&gt;&lt;br&gt;
Built-in honeypot and rate limiting catch bots before they reach your inbox on all plans, including free.&lt;/p&gt;

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




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You want the simplest fix with minimal setup and you are happy with your current form plugin:

Use WP Mail SMTP with a free SMTP provider. Takes 10 minutes. 
Your existing CF7 or WPForms setup stays the same.


You want reliable emails AND a submission dashboard, AND you never 
want to lose a lead again:

Use Formgrid as your form backend.
Submissions saved permanently regardless of email delivery.


You are a non-technical user who does not want to touch any code:

Use Formgrid's form builder embedded via iframe. No coding 
required.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

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

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

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

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




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

&lt;p&gt;&lt;strong&gt;Will fixing this recover submissions &lt;br&gt;
I already missed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately no. Emails rejected at the server level by Gmail are not stored anywhere. They are gone permanently. This is why having a submission dashboard like Formgrid is important going forward. Even if email delivery fails, your submissions are saved.&lt;/p&gt;

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

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

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

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

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

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

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

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

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

&lt;p&gt;&lt;strong&gt;Will this happen again?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Email providers will continue to tighten authentication requirements over time. &lt;br&gt;
With SMTP or Formgrid, you are using a properly authenticated email &lt;br&gt;
infrastructure that meets current and future standards. PHP mail will &lt;br&gt;
continue to become less reliable over time.&lt;/p&gt;




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

&lt;p&gt;Your WordPress contact form did not stop working because of anything you did. &lt;br&gt;
It stopped because Gmail changed how it handles unauthenticated emails, and WordPress PHP mail has never used proper authentication.&lt;/p&gt;

&lt;p&gt;The fix is straightforward:&lt;/p&gt;

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

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

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

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




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




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

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

</description>
      <category>google</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>wordpress</category>
    </item>
  </channel>
</rss>
