DEV Community

Cover image for 📨 The Easiest Way to Add a Contact Form to Your Site (Using Google Forms)
Satty
Satty

Posted on

📨 The Easiest Way to Add a Contact Form to Your Site (Using Google Forms)

Want to add a contact form to your site without spinning up a backend?

Looking for something quick, free, and serverless?

In this article, I’ll show you two practical ways to embed Google Forms into your Next.js site, with clean UI and no server-side headaches.

See the working version on my portfolio:
👉 https://satty-portfolio.vercel.app/


✅ What You’ll Learn

  • ✅ How to embed Google Forms using an iframe
  • ✅ How to customize your own UI and POST to Google Forms
  • ✅ The pros and cons of both approaches
  • ✅ Code examples using Next.js (App Router) + MUI
  • ✅ Live example from my own portfolio site

🎯 Who Is This For?

  • Developers who want a simple contact form
  • Those looking for a serverless solution
  • Next.js + MUI users who want better design flexibility

🛠 Tech Stack (My Portfolio Site)

Feature Stack
Framework Next.js (App Router + TypeScript)
UI Library MUI (Material UI)
Form Submission Google Forms

🧩 Option 1: Embed Google Form with <iframe> (Easiest Way)

🔧 Steps

  1. Create your form at Google Forms
  2. Click Send<> Embed icon
  3. Copy the iframe code

🧪 Example

<iframe
  src="https://docs.google.com/forms/d/e/xxxxxxxx/viewform?embedded=true"
  width="100%"
  height="800"
  frameborder="0"
  marginheight="0"
  marginwidth="0"
>
  Loading…
</iframe>
Enter fullscreen mode Exit fullscreen mode

✅ Pros & Cons

Pros Cons
Super fast setup Limited styling/customization
Google Sheets support May not feel "native" to your site
Works out of the box Not great for brand consistency

🎨 Option 2: Create a Custom Form and POST to Google Forms

Google Forms has a hidden endpoint (formResponse) that lets you POST data directly. This allows full UI freedom while keeping your form submission serverless.

✨ What You’ll Need

  • The form’s action URL (formResponse)
  • Each field’s name attribute (entry.XXXXXXX)

🔍 How to Get the Form Action URL and Field Names

1.Get the action URL

  • Open your Google Form
  • Right-click → “View Page Source”
  • Look for:
<form action="https://docs.google.com/forms/d/e/xxxxxx/formResponse" ...>
Enter fullscreen mode Exit fullscreen mode

2.Get the field names
Search the source code for:

<input name="entry.123456789" />
<input name="entry.987654321" />
<textarea name="entry.192837465" />
Enter fullscreen mode Exit fullscreen mode

Use these entry.XXXXXXX values in your code.

🧪 Simplified Code Example

'use client';

import { useState } from 'react';

const FORM_URL = 'https://docs.google.com/forms/d/e/xxxxxxxx/formResponse';

export default function ContactForm() {
  const [form, setForm] = useState({ name: '', email: '', message: '' });
  const [submitted, setSubmitted] = useState(false);

  const handleChange = (e: any) => {
    setForm({ ...form, [e.target.name]: e.target.value });
  };

  const handleSubmit = async (e: any) => {
    e.preventDefault();

    const formData = new FormData();
    formData.append('entry.123456789', form.name);
    formData.append('entry.987654321', form.email);
    formData.append('entry.192837465', form.message);

    try {
      await fetch(FORM_URL, {
        method: 'POST',
        mode: 'no-cors',
        body: formData,
      });
      setSubmitted(true);
    } catch (err) {
      alert('Something went wrong. Please try again.');
    }
  };

  if (submitted) return <p>📨 Thanks! Your message has been sent.</p>;

  return (
    <form onSubmit={handleSubmit}>
      <input name="name" placeholder="Your Name" onChange={handleChange} required />
      <input name="email" placeholder="Your Email" type="email" onChange={handleChange} required />
      <textarea name="message" placeholder="Your Message" onChange={handleChange} required />
      <button type="submit">Send</button>
    </form>
  );
}
Enter fullscreen mode Exit fullscreen mode

⚖️ Which Method Should You Use?

Scenario Recommendation
Want something super quick ✅ Use method
Need full control over styling ✅ Use POST method
Want to track events in Google Analytics ✅ Use POST + GA4 event

🔗 Live Example

See the working version on my portfolio:
👉 https://satty-portfolio.vercel.app/


✅ Summary

Google Form Integration Value
Free and easy ✅ No server required
Embed or customize ✅ Two flexible methods
Integrates with MUI/Next ✅ Works in any frontend project

Whether you're launching a portfolio or MVP, Google Forms is a rock-solid, free, and fast option. Start simple, scale smart.

Top comments (0)