[{"data":1,"prerenderedAt":239},["ShallowReactive",2],{"blog-how-to-upload-photo-to-online-form":3},{"blogData":4,"relatedArticles":28},{"id":5,"title":6,"author":7,"authorImage":8,"authorProfile":9,"coverImg":10,"coverImgAlt":11,"createdAt":12,"description":13,"featured":14,"jsonld":15,"keywords":16,"metaDescription":17,"metaImage":18,"metaTitle":6,"publishedAt":19,"slug":20,"updatedAt":21,"__hash__":22,"body":23,"coverImgWidth":24,"coverImgHeight":25,"readingStats":26},"blog\u002Fblog\u002Fhow-to-upload-photo-to-online-form.md","How to Upload Photos, Videos, and Logos to Your Online Forms","Harish Kumar",null,"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fharish-kumar2424\u002F","https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002Fhow_to_upload_media_7471b3ff7c.png","an illustration of how to upload a photo to an online form","2024-11-27T14:32:04.040Z","Learn how to upload a photo to an online form and add other media like videos and logos in Formester. Adding media to your forms will help you communicate better and grab attention.",false,[],"how to upload a photo to an online form,\nfile upload form,","Learn how to upload a photo to an online form and add other media like videos and logos in Formester. Adding media to your forms is great for engagement.",[],"2024-11-28T13:11:25.110Z","how-to-upload-photo-to-online-form","2025-07-16T02:31:17.856Z","rqhpkB7hmKxdQNFea1vqH3F4PdUxZcRprvjdmfSmK4A","![how to upload media.png](https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002Fhow_to_upload_media_7471b3ff7c.png)\n\nAdding photos, videos, and logos to your forms can make them look more professional, engaging, and user-friendly. \nWhether you’re creating a survey, quiz, order form, or **[registration form](\u002Ftemplates\u002Fcategories\u002Fapplication-and-registration\u002F)**, visuals help you communicate better and grab attention. \n\nThis guide will show you how to upload a photo to an online form and add other media like videos and logos with ease in **[Formester–the best no code online form builder](\u002F)**.\n\n## Why Add Photos, Videos, and Logos?\n**[Visuals](https:\u002F\u002Fgrowthmarketinggenie.com\u002Fblog\u002Fwhy-visuals-matter-for-your-brand\u002F)** aren’t just about making your form look good—they make your form work better! Here’s why:\n\n* **Photos** clarify questions or instructions, making them easier to understand.\n\n* **Videos** explain complex ideas or provide engaging demonstrations.\n\n* **Logos** build trust and make your brand stand out.\n\nTo create a form that’s engaging and easy to fill out, adding visuals is the way to go.\n\n### How to Upload a Photo to an Online Form\n**Step 1: Log In to Formester**\n\n**[Sign in to your Formester account](https:\u002F\u002Fapp.formester.com\u002Fusers\u002Fsign_in)**. If you’re new, create an account—it’s quick and free!\n\n**Step 2: Create a New Form**\n\nClick on **“New Form”** this will take you to the dashboard where you can choose from one of our **[free form templates](\u002Ftemplates\u002F)**, start from scratch or use our **[AI form generator](\u002Fai-form-generator\u002F)** to create a form in seconds.\n\n**Step 3: Add a Photo:**\n\n* Navigate to “Add Elements”,\n\n* Under Embed, select “Image”,\n\n* Click on the “Image” Field to open its properties,\n\n* Upload your Image,\n\n* Resize it to fit your needs.\n\n\u003Ciframe width=\"813\" height=\"315\" src=\"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FBWrR700atbA?si=i0fYf18wYpazje3w\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen>\u003C\u002Fiframe>\n\n**Pro Tip:** Use clear, high-quality, **\u003Ca href=\"https:\u002F\u002Fpicsart.com\u002Fai-image-enhancer\u002Funpixelate-image\u002F\">unpixelate images\u003C\u002Fa>** to make your form look polished without slowing it down.\n\n### How to Upload Videos to Your Online Form\n**Step 1:** Navigate to “Add Elements”, then under Embed, select “Video”\n\n**Step 2:** Click on the “Video” Field to open its properties, then upload your video\n\n**Step 3:** Resize it to fit your needs.\n\u003Ciframe width=\"813\" height=\"315\" src=\"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FUZG-ENMhVp8?si=nuUcMvfd944ujT2U\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen>\u003C\u002Fiframe>\n\n**Tip:** Keep videos short and engaging to hold users’ attention.\n\n### How to Add Your Logo to an Online Form\nYour **\u003Ca href=\"https:\u002F\u002Fwww.brandcrowd.com\u002Flogo-maker\">logo\u003C\u002Fa>** makes your form look professional and builds trust with your audience.\n\n\n**Step 1:** Once you are in the form builder, navigate to the “Design” tab.\n\n**Step 2:** Then scroll down to find the option “Add Logo”.\n\n**Step 3:** Add your “Logo” and resize it to fit your brand.\n\n\u003Ciframe width=\"813\" height=\"315\" src=\"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FMVCIA2K8vVk?si=XFo24pziTQzbpsW7\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen>\u003C\u002Fiframe>\n\n### Create Adaptive Forms with Conditional Logic\nWant your form to adjust based on user responses?  **[Formester’s conditional logic](\u002Ffeatures\u002Fconditional-logic\u002F)** lets you:\n\n* Show or hide specific questions based on previous answers.\n\n* Display different photos or videos depending on the user’s selections.\n\n* Tailor the experience to each user, making your form smarter and more efficient.\n\n**For example:** If a user selects “Yes” to attend an event, you can show a follow-up question asking for dietary preferences or a video explaining event details.\n\n### Best Practices for Adding Visuals to Forms\n\n* **Don’t Overdo It:** Use visuals to enhance, not clutter, your form.\n\n* **Optimize File Sizes:** Compress images and videos to keep your form loading fast.\n\n* **Stay Consistent:** Match visuals with your branding style.\n\n* **Test on All Devices:** Preview your form on desktop and mobile to ensure everything looks perfect.\n\nLearn more about **[design tips and examples](\u002Fblog\u002Fcontact-form-design-tips-best-practices-and-examples\u002F)** to create highly engaging online forms that convert.\n\n### Conclusion\nAdding photos, videos, and logos to your online forms isn’t just easy—it’s a game-changer. Visuals make your forms clearer, more engaging, and professional. \n\nWith Formester, you can use the drag-and-drop interface, **[custom branding](\u002Ffeatures\u002Fbranding-kit\u002F)**, and conditional logic to create adaptive forms that users love. **[Start building with Formester today](https:\u002F\u002Fapp.formester.com\u002Fusers\u002Fsign_up)**!\n\n### FAQs\n\n**1. How do I make my form load faster with images and videos?**\nUse compressed images (JPEG or PNG) and embed videos instead of uploading large files.\n\n**2. Can I use GIFs in my forms?**\nYes! Formester supports GIFs, which can make your form more dynamic and fun.\n\n**3. How can conditional logic improve my form?**\nConditional logic lets you show or hide specific fields based on user responses, creating a more personalized and streamlined experience.\n\n",1214,630,{"text":27},"4 min read",[29,48,67,185],{"title":30,"author":7,"authorImage":8,"authorProfile":9,"coverImg":31,"coverImgAlt":32,"createdAt":33,"description":34,"featured":14,"jsonld":35,"keywords":36,"metaDescription":37,"metaImage":38,"metaTitle":39,"publishedAt":40,"slug":41,"updatedAt":42,"__hash__":43,"body":44,"id":45,"coverImgWidth":24,"coverImgHeight":25,"readingStats":46},"Formester Recognized as a Top Form Builder Software Solution for 2024 by Tekpon","https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002FBlog_Cover_Images_1_3248e3d522.png","illustration of tekpon recognition of formester as top form builder software","2024-07-26T05:34:41.894Z","Tekpon has named Formester a top form builder for 2024. Try our easy-to-use, no-code platform to design and manage forms, surveys, and quizzes effortlessly.",[],"tekpon, formester, online form builder, no code form builder, form builder software, form builder software solution, formester reviews, tekpon reviews","Tekpon recognizes Formester as a leading form builder for 2024. Explore our free no-code online form builder to create amazing forms, surveys, and quizzes.",[],"Formester Recognized as Top Form Builder Software by Tekpon","2024-07-26T05:34:54.332Z","formester-recognized-as-a-top-form-builder-software-solution-by-tekpon","2025-02-09T20:59:53.499Z","8Y79t8dRl3rg-lNNDctRQ5ZAnW0t1ytmxwyccJcYGWY","![illustration of tekpon recognition of formester as top form builder software](https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002FBlog_Cover_Images_1_3248e3d522.png)\n\nWe're excited to announce that Tekpon has recognized Formester as one of the **[best form builder software](https:\u002F\u002Ftekpon.com\u002Fcategories\u002Fform-builder-software\u002F)** for the year 2024! \n\nIn their latest industry report, **[Tekpon has recognized Formester as a leading software solution in the form builder category](https:\u002F\u002Ftekpon.com\u002Fsoftware\u002Fformester\u002Freviews\u002F)**. This highlights our commitment to offering a user-friendly and efficient tool for creating online forms, surveys, and quizzes.\n\nOur goal is to make form creation simple and efficient, so you can focus on what matters most. This recognition confirms that we’re on the right track and encourages us to keep improving.\n\n## About Tekpon\n**Tekpon** is a trusted platform that reviews and compares different software tools. They aim to help users and businesses make informed decisions by providing honest and detailed reviews.\n\nThe Tekpon team, made up of experts, **carefully reviews various tools** in different categories to create detailed industry reports. These reports are helpful for people looking for the best software solutions.\n\nTekpon helps people and businesses make decisions about software by comparing and evaluating options. Their **reports** make it easier to choose the best solutions for your needs and save time.\n\n**In the report - Tekpon Said** “**[Formester](\u002F)** offers a straightforward form builder that focuses on simplicity and efficiency. Businesses can create and manage forms for various purposes, including lead generation, surveys, and feedback with ease.\n\nFormester stands out for its user-friendly interface, customizable templates, and seamless integration with marketing tools. The platform’s real-time analytics provide valuable insights into form performance and user engagement. For businesses seeking a hassle-free form-building solution, **Formester is an excellent choice!**”\n\n## Why did they choose Formester?\nTekpon’s expert panel reviewed many form builders to compile their Top 10 Form Builders for 2024 report. Formester stood out for several reasons:\n\n**User-Friendly Interface:** Our drag-and-drop editor makes form building as simple and easy as possible. You don’t need any coding skills to build and customize amazing forms that will engage with your audience.\n\n**Advanced Features:** Formester has many advanced features. These include conditional logic, automatic email responses, auto-save, calculation fields, and more. All of these features are included in the free plan.\n\n**Wide Range of Uses:** Create forms for any purpose—lead registrations, surveys, feedback, and more. Formester offers over 600+ Free Templates that allows you to create advanced forms in minutes!\n\n**Collaborative Tools:** Work together with team members on form creation. Our platform supports multi-user collaboration, making it easier to build, design and fill forms together as a team.\n\n\nWe appreciate Tekpon for acknowledging us. We are excited to offer a user-friendly form-building experience. This experience will cater to both experts and beginners. Our goal is to keep improving our form building software to meet all your needs. If you haven’t tried Formester yet, now is a great time to see why we’re a top choice for form building!\n\n**Thank you to Tekpon** for this wonderful recognition! We’re proud to be among the best and look forward to working with you again in the future!\n\nTo learn more about Formester- **[Click here!](https:\u002F\u002Fapp.formester.com\u002Fusers\u002Fsign_up)**\n","blog\u002Fblog\u002Fformester-recognized-as-a-top-form-builder-software-solution-by-tekpon.md",{"text":47},"3 min read",{"title":49,"author":7,"authorImage":8,"authorProfile":9,"coverImg":50,"coverImgAlt":51,"createdAt":52,"description":53,"featured":14,"jsonld":54,"keywords":55,"metaDescription":56,"metaImage":57,"metaTitle":58,"publishedAt":59,"slug":60,"updatedAt":61,"__hash__":62,"body":63,"id":64,"coverImgWidth":24,"coverImgHeight":25,"readingStats":65},"How to Add Custom Forms In Shopify  (2026)","https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002FUntitled_design_1_4a74150c0c.png","an illlustration of how to add custom forms in shopify","2025-02-06T18:33:52.588Z","Easily build custom forms and embed them on your Shopify store with a no-code form builder like Formester. No coding skills needed!",[],"how to add custom forms in shopify,\nshopify form plugin,\nhow to embed forms in shopify,\nshopify form builder,","Learn to create custom forms and embed them on your Shopify store with a no-code form builder like Formester. Easy setup, no coding required!",[],"How to Add Custom Forms In Shopify | Formester","2026-06-22T05:13:58.086Z","how-to-add-custom-forms-in-shopify","2026-06-22T05:13:58.656Z","eeCEgt5pYma-1n48cuNogoqAP_jyfl8hhjtRaIsFBGc","\u003Cp style=\"font-size: inherit;\">Shopify's built-in form does one thing: name, email, message. The moment you need a file upload, a product dropdown, a deposit, or a conditional field, you hit a wall.\u003C\u002Fp>\n\n\u003Cp>The fix is to build the form in a no-code builder and drop one embed snippet into your store. This guide walks through it in three steps: create the form, embed it with a \u003Ca href=\"https:\u002F\u002Fformester.com\u002Fplugins\u002Fshopify-form-builder\u002F\">Shopify form builder\u003C\u002Fa>, and automate what happens after submit.\u003C\u002Fp>\n\n\u003Cp>No theme code, no developer, no per-form app fee. You can have a custom form live on a Shopify page in a few minutes.\u003C\u002Fp>\n\n\u003Ch2>Shopify's Built-in Form vs a Dedicated Builder\u003C\u002Fh2>\n\n\u003Cp>Before you add an app, it helps to know exactly where Shopify's native form stops.\u003C\u002Fp>\n\n\u003Ch3>Shopify's built-in contact form\u003C\u002Fh3>\n\n\u003Cul>\n\u003Cli>Collects name, email, and a message. That is the ceiling.\u003C\u002Fli>\n\u003Cli>No custom fields, no conditional logic, no file uploads, no payments.\u003C\u002Fli>\n\u003Cli>Submissions land in your store email, with nowhere to filter, tag, or export them.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch3>A dedicated form builder\u003C\u002Fh3>\n\n\u003Cul>\n\u003Cli>Add any field: dropdowns, file uploads, date pickers, signature, \u003Ca href=\"https:\u002F\u002Fformester.com\u002Fintegrations\u002Fstripe\u002F\">payment fields\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>Use \u003Ca href=\"https:\u002F\u002Fformester.com\u002Ffeatures\u002Fconditional-logic\u002F\">conditional logic\u003C\u002Fa> to show fields only when they are relevant.\u003C\u002Fli>\n\u003Cli>Route data straight to a CRM, a spreadsheet, or an autoresponder.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>If your form is a simple \"contact us\", Shopify's native form is fine. For anything an actual order or application needs, you want a builder.\u003C\u002Fp>\n\n\u003Ch2>What a Dedicated Builder Lets You Do\u003C\u002Fh2>\n\n\u003Cp>Once you move off the default form, the kind of data you can collect changes completely:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>Capture detailed customer info: phone, company, order notes, delivery dates.\u003C\u002Fli>\n\u003Cli>Take payments and deposits in the form itself with Stripe or PayPal.\u003C\u002Fli>\n\u003Cli>Let customers upload files: design proofs, prescriptions, ID, brief documents.\u003C\u002Fli>\n\u003Cli>Show or hide fields with conditional logic so the form stays short.\u003C\u002Fli>\n\u003Cli>Auto-send a confirmation email and push the data to your CRM on submit.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>All of it runs without touching your theme code, which is the part most store owners want to avoid.\u003C\u002Fp>\n\n\u003Ch2>Shopify Forms You Can Build This Way\u003C\u002Fh2>\n\n\u003Cp>The same three steps cover almost any form a store needs. The common ones:\u003C\u002Fp>\n\n\u003Ch3>Contact and support forms\u003C\u002Fh3>\n\n\u003Cp>Add the fields Shopify's default form omits: order number, category, file attachment. Route urgent ones straight to your inbox or Slack.\u003C\u002Fp>\n\n\u003Ch3>Registration and account forms\u003C\u002Fh3>\n\n\u003Cp>Collect sign-ups for a loyalty program, an event, or early access, then sync the list to your email tool.\u003C\u002Fp>\n\n\u003Ch3>Wholesale and B2B application forms\u003C\u002Fh3>\n\n\u003Cp>Ask for business name, tax ID, and order volume, and gate access so only approved buyers see wholesale pricing.\u003C\u002Fp>\n\n\u003Ch3>Custom order and quote requests\u003C\u002Fh3>\n\n\u003Cp>Let customers spec a build, pick options, and pay a deposit, all before the order is confirmed. Start from a ready-made \u003Ca href=\"https:\u002F\u002Fformester.com\u002Ftemplates\u002Fcategories\u002Forder-forms\u002F\">order form template\u003C\u002Fa> to skip the setup.\u003C\u002Fp>\n\n\u003Ch3>Product question forms\u003C\u002Fh3>\n\n\u003Cp>Drop a short form on a product page so shoppers can ask before they buy, which lifts conversions on higher-priced items.\u003C\u002Fp>\n\n\u003Ch3>Step 1: Build Your Form\u003C\u002Fh3>\n\n\u003Cp>Start with the fields your form actually needs. A quick way in is the \u003Ca href=\"https:\u002F\u002Fformester.com\u002Fai-form-generator\u002F\">AI form generator\u003C\u002Fa>: describe the form in a sentence and edit the draft it returns.\u003C\u002Fp>\n\n\u003Cp>Depending on the use case, add fields for:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>Customer details: name, email, phone, company.\u003C\u002Fli>\n\u003Cli>Product selections: dropdowns, checkboxes, or quantity fields.\u003C\u002Fli>\n\u003Cli>Custom requests: special instructions, file uploads, preferred dates.\u003C\u002Fli>\n\u003Cli>Payment: a deposit or the full amount, collected in the form.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Then layer in conditional logic. If a customer picks a specific product, show only the customization fields that apply to it. The form stays short, and people finish it.\u003C\u002Fp>\n\n\u003Ch3>Step 2: Embed It on Your Store\u003C\u002Fh3>\n\n\u003Cp>In your form builder, open the share or embed settings and pick Shopify as the platform, then copy the embed code.\u003C\u002Fp>\n\n\u003Cp>Formester gives you the snippet in six embed modes, so the form can sit anywhere it fits:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>Inline: the form lives directly in the page (best for contact and order pages).\u003C\u002Fli>\n\u003Cli>Popup, popover, or sidebar: the form opens on click without leaving the page.\u003C\u002Fli>\n\u003Cli>Side tab or fullscreen: for a persistent prompt or a dedicated form page.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Now add it in Shopify:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>Go to Online Store, then Pages, and click Add Page (or open the product or theme page you want).\u003C\u002Fli>\n\u003Cli>Name the page, then click Add Section in the editor.\u003C\u002Fli>\n\u003Cli>Search for Custom Liquid and select it.\u003C\u002Fli>\n\u003Cli>Paste your embed code into the block.\u003C\u002Fli>\n\u003Cli>Click Save.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>To put the form on a product page instead, open the product template in the theme editor, add the Custom Liquid block where you want it, and paste the same code. The form is live, and submissions are stored and searchable in your dashboard.\u003C\u002Fp>\n\n\u003Ch3>Step 3: Automate What Happens Next\u003C\u002Fh3>\n\n\u003Cp>A form is only half the job. The other half is what happens the second someone hits submit.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>Send an instant confirmation email so the customer knows you got it and what comes next.\u003C\u002Fli>\n\u003Cli>Push every submission to a CRM like \u003Ca href=\"https:\u002F\u002Fformester.com\u002Fintegrations\u002Fhubspot\u002F\">HubSpot\u003C\u002Fa> so it lands in your pipeline, not a forgotten inbox.\u003C\u002Fli>\n\u003Cli>Drop the data into Google Sheets or Slack for the team to action in real time.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>Set this up once and a custom-order form turns into a small workflow: customer submits, gets a confirmation, and the order details are already in your system ready to fulfill.\u003C\u002Fp>\n\n\u003Ch2>Put a Custom Form Live on Your Store\u003C\u002Fh2>\n\n\u003Cp>That is the whole job: build the form, paste one snippet into a Custom Liquid block, and wire up a confirmation email. No theme code, no juggling separate apps for every form type.\u003C\u002Fp>\n\n\u003Cp>Start from a \u003Ca href=\"https:\u002F\u002Fformester.com\u002Ftemplates\u002F\">ready-made template\u003C\u002Fa> or describe what you need and let the builder draft it. \u003Ca href=\"https:\u002F\u002Fapp.formester.com\u002Fusers\u002Fsign_up\u002F\">Get started with Formester free\u003C\u002Fa> and have a custom Shopify form collecting orders today.\u003C\u002Fp>\n\n\u003Csection class=\"faq\">\n\u003Ch2>Shopify Custom Form FAQ\u003C\u002Fh2>\n\u003Cdetails>\u003Csummary>Can you add a custom form to Shopify without code?\u003C\u002Fsummary>\u003Cdiv>Yes. Build the form in a no-code builder, copy the embed snippet, and paste it into a Custom Liquid section on any Shopify page. No theme editing or developer needed.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>How do I add a form to a Shopify product page?\u003C\u002Fsummary>\u003Cdiv>Open the product template in the theme editor, add a Custom Liquid block where you want the form, and paste your embed code. That is how you collect product questions, personalization details, or pre-orders on the listing.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>What kinds of forms can I add to a Shopify store?\u003C\u002Fsummary>\u003Cdiv>Contact forms, registration and account forms, wholesale and B2B applications, custom order and quote requests, product question forms, and feedback surveys. A builder handles all of them with conditional logic, file uploads, and payment fields.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>Will an embedded form slow down my store?\u003C\u002Fsummary>\u003Cdiv>A single embedded form loads asynchronously and barely touches page speed. Keep one form per page, skip heavy background images, and use inline embed rather than a popup on critical pages.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>Why not just use Shopify's built-in contact form?\u003C\u002Fsummary>\u003Cdiv>The default form only collects name, email, and a message. A dedicated builder adds custom fields, conditional logic, file uploads, payments, autoresponders, and CRM sync, none of which the built-in form supports.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003C\u002Fsection>\n\n","blog\u002Fblog\u002Fhow-to-add-custom-forms-in-shopify.md",{"text":66},"6 min read",{"title":68,"author":69,"authorImage":8,"authorProfile":70,"coverImg":71,"coverImgAlt":72,"createdAt":73,"description":74,"featured":14,"jsonld":75,"keywords":174,"metaDescription":74,"metaImage":175,"metaTitle":176,"publishedAt":177,"slug":178,"updatedAt":179,"__hash__":180,"body":181,"id":182,"coverImgWidth":24,"coverImgHeight":25,"readingStats":183},"How to Send HTML Form Data to Google Sheets for Free","Harsh Shah","https:\u002F\u002Flinkedin.com\u002Fin\u002Fharshshahseo","https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002FHow_to_Make_User_Research_Survey_1_ec282fa0b6.png","a cover of a blog post that talks about sending contact form data to google sheets","2025-03-06T18:34:23.526Z","Push HTML form submissions straight into Google Sheets, free. Working Apps Script code, a no-code option, and a method-by-method comparison so you pick once.",[76],{"@graph":77,"@context":173},[78,92,122,159],{"@id":79,"@type":80,"image":71,"author":81,"headline":68,"publisher":83,"description":74,"dateModified":89,"datePublished":90,"mainEntityOfPage":91},"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-send-contact-form-data-to-google-sheets-free\u002F#article","Article",{"url":9,"name":7,"@type":82},"Person",{"logo":84,"name":87,"@type":88},{"url":85,"@type":86},"https:\u002F\u002Fformester.com\u002Flogo.png","ImageObject","Formester","Organization","2026-06-09","2025-03-06","https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-send-contact-form-data-to-google-sheets-free\u002F",{"name":93,"step":94,"tool":108,"@type":116,"totalTime":117,"estimatedCost":118},"How to send HTML form data to Google Sheets with Apps Script",[95,99,102,105],{"name":96,"text":97,"@type":98},"Create the Sheet","Open Google Sheets, create a new spreadsheet, name the tab Submissions, and add column headers in row 1 that match the name attributes on your HTML form inputs.","HowToStep",{"name":100,"text":101,"@type":98},"Open Apps Script and paste the doPost function","Inside the Sheet, open Extensions then Apps Script. Paste the doPost script provided in this guide. Save the project.",{"name":103,"text":104,"@type":98},"Run initialSetup and deploy the web app","Pick initialSetup in the function dropdown and click Run. Approve the OAuth prompt. Click Deploy, New deployment, Web app, Execute as Me, Anyone has access. Copy the deployment URL.",{"name":106,"text":107,"@type":98},"Wire the deployment URL into your HTML form","Point your form's fetch endpoint or action attribute at the deployment URL. Submit a test entry. The row appears in the Sheet within a second.",[109,112,114],{"name":110,"@type":111},"Google Sheets","HowToTool",{"name":113,"@type":111},"Google Apps Script",{"name":115,"@type":111},"HTML form on your site","HowTo","PT30M",{"@type":119,"value":120,"currency":121},"MonetaryAmount","0","USD",{"@type":123,"mainEntity":124},"FAQPage",[125,131,135,139,143,147,151,155],{"name":126,"@type":127,"acceptedAnswer":128},"Is it really free to send HTML form data to Google Sheets?","Question",{"text":129,"@type":130},"Yes. Google Apps Script is free with any Google account, capped at one Sheets write per second per user. Google Forms is free. Formester's free plan includes unlimited submissions.","Answer",{"name":132,"@type":127,"acceptedAnswer":133},"How secure is form data in Google Sheets?",{"text":134,"@type":130},"Google encrypts data at rest and in transit. Lock sharing to specific accounts, neutralize formula characters on input to prevent CSV injection, and do not use a Sheet for payment data or passwords.",{"name":136,"@type":127,"acceptedAnswer":137},"What is the rate limit on Apps Script writes to Sheets?",{"text":138,"@type":130},"Roughly 100 requests per 100 seconds per user, per Google's published quotas. A contact form sustaining one submission per second sits comfortably inside that envelope.",{"name":140,"@type":127,"acceptedAnswer":141},"Can I send file uploads from the form into Google Sheets?",{"text":142,"@type":130},"Sheets cannot hold a file. Write the file to Google Drive via Apps Script and store the Drive URL in the cell, or use a no-code builder that handles file uploads natively.",{"name":144,"@type":127,"acceptedAnswer":145},"How do I add CAPTCHA or spam protection?",{"text":146,"@type":130},"The script in this guide ships a honeypot field. For more, add Google reCAPTCHA v3 on the client and verify the token server-side before writing to the Sheet.",{"name":148,"@type":127,"acceptedAnswer":149},"How do I get an email when someone submits the form?",{"text":150,"@type":130},"Add MailApp.sendEmail inside the doPost function in Apps Script. Or use the autoresponder feature in a no-code builder and skip the code.",{"name":152,"@type":127,"acceptedAnswer":153},"Can I use this on Netlify, Vercel, or any static site?",{"text":154,"@type":130},"Yes. The Apps Script deployment URL is a fetch target. It works from any frontend, hosted anywhere, with no backend on your side.",{"name":156,"@type":127,"acceptedAnswer":157},"Can I move from this setup to a database later?",{"text":158,"@type":130},"Easily. Sheets is a great starter store. When you cross a few hundred submissions a week, route the same form to a database or CRM in parallel with the Sheet.",{"@type":160,"itemListElement":161},"BreadcrumbList",[162,167,171],{"item":163,"name":164,"@type":165,"position":166},"https:\u002F\u002Fformester.com\u002F","Home","ListItem",1,{"item":168,"name":169,"@type":165,"position":170},"https:\u002F\u002Fformester.com\u002Fblog\u002F","Blog",2,{"item":91,"name":68,"@type":165,"position":172},3,"https:\u002F\u002Fschema.org","how to send contact form data to google sheets free,\ncontact form template,\ncontact form automation,",[],"HTML Form to Google Sheets: 3 Free Methods (Code)","2026-06-15T04:53:58.393Z","how-to-send-contact-form-data-to-google-sheets-free","2026-06-15T04:53:58.398Z","SpJtH4MN2xn0shG-jzP6RaMox4pENmrLXV3OuYWeFbk","![a cover of a blog post that talks about sending contact form data to google sheets](https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002FHow_to_Make_User_Research_Survey_1_ec282fa0b6.png)\n\n\u003Cstyle>\n\u002F* batch-1 blog normalisation *\u002F\n.fmstr-blog-lead {\n  font-size: 17px !important;\n  line-height: 1.65 !important;\n  color: #475467 !important;\n  font-weight: 400 !important;\n  margin: 0 0 16px !important;\n}\n.fmstr-blog-lead a { color: #6941c6 !important; font-weight: 500; }\n.fmstr-blog-lead a:hover { text-decoration: underline !important; }\n.fmstr-blog-lead strong { color: #101828; font-weight: 700; }\nsection[class^=\"fmstr-cmp-\"], section[class*=\" fmstr-cmp-\"] {\n  padding-top: 28px !important;\n  padding-bottom: 28px !important;\n}\n@media (max-width: 540px) {\n  section[class^=\"fmstr-cmp-\"], section[class*=\" fmstr-cmp-\"] {\n    padding-top: 24px !important;\n    padding-bottom: 24px !important;\n  }\n}\n\u003C\u002Fstyle>\n\n\u003Cstyle id=\"fmstr-blog-mobile-fullwidth-v3\">\n@media (max-width: 760px) {\n  .art-section { padding-left: 12px !important; padding-right: 12px !important; }\n}\n@media (max-width: 540px) {\n  .art-section { padding-left: 6px !important; padding-right: 6px !important; padding-top: 24px !important; }\n  section[class^=\"fmstr-cmp-\"], section[class*=\" fmstr-cmp-\"] {\n    padding-left: 0 !important; padding-right: 0 !important;\n    overflow-x: hidden !important; box-sizing: border-box !important;\n  }\n  section[class^=\"fmstr-cmp-\"] *, section[class^=\"fmstr-cmp-\"] *::before, section[class^=\"fmstr-cmp-\"] *::after { box-sizing: border-box !important; }\n  section[class^=\"fmstr-cmp-\"] > *, section[class^=\"fmstr-cmp-\"] > * > * { min-width: 0 !important; }\n  section[class^=\"fmstr-cmp-\"] [class*=\"__container\"] {\n    padding-left: 0 !important; padding-right: 0 !important;\n    max-width: 100% !important; width: 100% !important;\n  }\n  section[class^=\"fmstr-cmp-\"] [class*=\"__card\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__step\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__panel\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__tool\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__verdict\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__row\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__fix\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__callout\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__quote\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__tldr\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__answer\"],\n  section[class^=\"fmstr-cmp-\"] [class*=\"__faq\"],\n  section[class^=\"fmstr-cmp-\"] details {\n    padding-left: 14px !important; padding-right: 14px !important;\n    margin-left: 0 !important; margin-right: 0 !important;\n  }\n  section[class^=\"fmstr-cmp-\"] p, section[class^=\"fmstr-cmp-\"] li { font-size: 15px !important; line-height: 1.6 !important; }\n  section[class^=\"fmstr-cmp-\"] h2 { font-size: 22px !important; line-height: 1.22 !important; }\n  section[class^=\"fmstr-cmp-\"] h3 { font-size: 18px !important; line-height: 1.3 !important; }\n  section[class^=\"fmstr-cmp-\"] h4 { font-size: 16px !important; line-height: 1.35 !important; }\n  section[class^=\"fmstr-cmp-\"] table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; width: 100% !important; }\n  section[class^=\"fmstr-cmp-\"] img, section[class^=\"fmstr-cmp-\"] iframe, section[class^=\"fmstr-cmp-\"] video { max-width: 100% !important; height: auto !important; }\n  section[class^=\"fmstr-cmp-\"] pre, section[class^=\"fmstr-cmp-\"] code {\n    white-space: pre-wrap !important; overflow-wrap: anywhere !important; word-break: break-word !important;\n  }\n  section[class^=\"fmstr-cmp-\"] pre { overflow-x: auto; }\n  .fmstr-blog-lead { font-size: 16.5px !important; }\n}\n\u003C\u002Fstyle>\n\n\u003Cp class=\"fmstr-blog-lead\">If you have a contact form, an opt-in widget, or a custom HTML form on your site, you can route every submission straight into a Google Sheet without a database, a Zapier subscription, or a paid backend. Three free methods get you there. Two need code. One does not.\u003C\u002Fp>\n\n\u003Cp class=\"fmstr-blog-lead\">This guide gives you the working Apps Script (paste-ready), the no-code path, and a side-by-side comparison so you know which one to pick before you start.\u003C\u002Fp>\n\n\u003Cstyle>\n.fmstr-cmp-tmpl-tldr a { text-decoration: none !important; }\n.fmstr-cmp-tmpl-tldr {\n--c-card: #f7f3ff;\n--c-fg-1: #101828; --c-fg-2: #475467; --c-fg-3: #697586;\n--c-violet-500: #7f56d9; --c-violet-600: #6941c6; --c-violet-700: #5b34b1;\n--c-edge: #e4d7ff; --c-border: #d6c2f7;\n--c-shadow: 0 1px 3px rgba(16,24,40,.05);\nbackground: transparent;\npadding: 28px 0 40px;\nfont-family: inherit;\ncolor: var(--c-fg-1);\ntext-align: left !important; overflow-x: hidden; -webkit-text-size-adjust: 100%;}\n.fmstr-cmp-tmpl-tldr *, .fmstr-cmp-tmpl-tldr *::before, .fmstr-cmp-tmpl-tldr *::after { box-sizing: border-box; }\n.fmstr-cmp-tmpl-tldr__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-tmpl-tldr__card {\nbackground: var(--c-card);\nborder: 1px solid var(--c-border);\nborder-left: 4px solid var(--c-violet-500);\nborder-radius: 14px;\npadding: 22px 26px;\nbox-shadow: var(--c-shadow);\ndisplay: flex; flex-direction: column; gap: 12px;\n}\n.fmstr-cmp-tmpl-tldr__label {\nfont-size: 12px !important;\nfont-weight: 700 !important;\nletter-spacing: 0.08em !important;\ntext-transform: uppercase;\ncolor: var(--c-violet-700) !important;\ndisplay: inline-flex;\nalign-items: center;\ngap: 8px;\nmargin: 0 !important;\n}\n.fmstr-cmp-tmpl-tldr__label::before {\ncontent: \"\";\nwidth: 8px; height: 8px; border-radius: 9999px;\nbackground: var(--c-violet-500);\ndisplay: inline-block;\n}\n.fmstr-cmp-tmpl-tldr__body {\nfont-size: 16px !important;\nline-height: 1.65 !important;\ncolor: var(--c-fg-1);\nmargin: 0 !important;\nfont-weight: 500 !important;\n}\n.fmstr-cmp-tmpl-tldr__body strong { color: var(--c-violet-700); font-weight: 700; }\n.fmstr-cmp-tmpl-tldr__list {\nmargin: 0 !important; padding: 0 0 0 20px !important;\ndisplay: flex; flex-direction: column; gap: 8px;\nfont-size: 15.5px; line-height: 1.6; color: var(--c-fg-1);\n}\n.fmstr-cmp-tmpl-tldr__list li { margin: 0; }\n.fmstr-cmp-tmpl-tldr__list strong { color: var(--c-violet-700); font-weight: 700; }\n\n@media (max-width: 540px) {\n.fmstr-cmp-tmpl-tldr { padding: 20px 0 28px; }\n.fmstr-cmp-tmpl-tldr__card { padding: 18px 20px; }\n.fmstr-cmp-tmpl-tldr__body { font-size: 15px !important; }\n.fmstr-cmp-tmpl-tldr__list { font-size: 14.5px; }\n}\n\n\n\u002F* mobile-safety-v2 *\u002F\n.fmstr-cmp-tmpl-tldr img, .fmstr-cmp-tmpl-tldr table, .fmstr-cmp-tmpl-tldr pre, .fmstr-cmp-tmpl-tldr iframe, .fmstr-cmp-tmpl-tldr video { max-width: 100%; }\n.fmstr-cmp-tmpl-tldr > * { min-width: 0; }\n.fmstr-cmp-tmpl-tldr [class*='__grid'] > *, .fmstr-cmp-tmpl-tldr [class*='__list'] > *, .fmstr-cmp-tmpl-tldr [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-tldr pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-tmpl-tldr table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-tmpl-tldr\" aria-labelledby=\"fmstr-cmp-tmpl-tldr-label\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-tldr__container\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-tldr__card\">\n\u003Cp class=\"fmstr-cmp-tmpl-tldr__label\" id=\"fmstr-cmp-tmpl-tldr-label\">Quick answer\u003C\u002Fp>\n\u003Cp class=\"fmstr-cmp-tmpl-tldr__body\">You can push HTML form submissions into a Google Sheet for free with three methods. Pick one in 30 seconds:\u003C\u002Fp>\n\u003Cul class=\"fmstr-cmp-tmpl-tldr__list\">\n\u003Cli>\u003Cstrong>Google Forms\u003C\u002Fstrong> (2 minutes, no code): use it when the form does not need to live on your own domain.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Google Apps Script\u003C\u002Fstrong> (20-40 minutes, paste-ready code below): use it when you already have an HTML form on your site and are fine maintaining a script.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>No-code builder like \u003Ca href=\"https:\u002F\u002Fformester.com\u002F\">Formester\u003C\u002Fa>\u003C\u002Fstrong> (5 minutes, no code): use it when you want spam control, conditional logic, and Sheets sync in one place.\u003C\u002Fli>\n\u003Cli>Apps Script caps at roughly one Sheets write per second per user, which is plenty for a contact form.\u003C\u002Fli>\n\u003Cli>Never store payment data or passwords in Sheets. It is a great inbox, not a vault.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\n\u003Cstyle>\n.fmstr-cmp-tmpl-cmp a { text-decoration: none !important; }\n.fmstr-cmp-tmpl-cmp a.fmstr-cmp-tmpl-cmp__link { color: var(--c-violet-600) !important; font-weight: 600; }\n.fmstr-cmp-tmpl-cmp a.fmstr-cmp-tmpl-cmp__link:hover { text-decoration: underline !important; }\n.fmstr-cmp-tmpl-cmp {\n--c-card: #ffffff;\n--c-fg-1: #101828; --c-fg-2: #475467; --c-fg-3: #697586;\n--c-violet-500: #7f56d9; --c-violet-600: #6941c6; --c-violet-700: #5b34b1;\n--c-tint: #f7f3ff; --c-edge: #e4d7ff;\n--c-border: #eaecf0;\n--c-shadow: 0 1px 3px rgba(16,24,40,.05);\n--c-good: #12b76a; --c-bad: #f04438;\nbackground: transparent;\npadding: 48px 0;\nfont-family: inherit;\ncolor: var(--c-fg-1);\ntext-align: left !important;\noverflow-x: hidden;\n}\n.fmstr-cmp-tmpl-cmp *, .fmstr-cmp-tmpl-cmp *::before, .fmstr-cmp-tmpl-cmp *::after { box-sizing: border-box; }\n.fmstr-cmp-tmpl-cmp > *, .fmstr-cmp-tmpl-cmp > * > * { min-width: 0; }\n.fmstr-cmp-tmpl-cmp__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-tmpl-cmp__head { margin: 0 0 28px !important; }\n.fmstr-cmp-tmpl-cmp__h2 {\nfont-size: clamp(26px, 3vw, 36px) !important; font-weight: 700 !important; line-height: 1.15 !important;\nletter-spacing: -.02em !important; margin: 0 !important; color: var(--c-fg-1);\n}\n.fmstr-cmp-tmpl-cmp__intro { color: var(--c-fg-3); font-size: 17px !important; line-height: 1.6 !important; margin: 14px 0 0 !important; }\n.fmstr-cmp-tmpl-cmp__grid {\ndisplay: grid; grid-template-columns: repeat(3, 1fr); gap: 14px;\n}\n.fmstr-cmp-tmpl-cmp__card {\nbackground: var(--c-card);\nborder: 1px solid var(--c-border);\nborder-radius: 14px;\npadding: 22px;\nbox-shadow: var(--c-shadow);\ndisplay: flex; flex-direction: column; gap: 12px;\nmin-width: 0;\n}\n.fmstr-cmp-tmpl-cmp__card--featured {\nborder-color: var(--c-edge);\nbackground: var(--c-tint);\nbox-shadow: 0 4px 18px rgba(105,65,198,.10);\n}\n.fmstr-cmp-tmpl-cmp__chip {\ndisplay: inline-flex; align-items: center;\nfont-size: 11px !important; font-weight: 700 !important; letter-spacing: 0.08em !important;\ntext-transform: uppercase; color: var(--c-violet-700) !important;\nbackground: var(--c-tint); border: 1px solid var(--c-edge);\npadding: 4px 10px; border-radius: 9999px;\nalign-self: flex-start;\n}\n.fmstr-cmp-tmpl-cmp__name {\nfont-size: 18px !important; font-weight: 700 !important; color: var(--c-fg-1);\nmargin: 0 !important; line-height: 1.3 !important;\n}\n.fmstr-cmp-tmpl-cmp__best {\nfont-size: 13.5px !important; color: var(--c-fg-3); margin: 0 !important;\n}\n.fmstr-cmp-tmpl-cmp__best strong { color: var(--c-fg-1); font-weight: 600; }\n.fmstr-cmp-tmpl-cmp__divider {\nheight: 1px; background: var(--c-border); margin: 4px 0; border: 0;\n}\n.fmstr-cmp-tmpl-cmp__list {\nmargin: 0; padding: 0; list-style: none;\ndisplay: flex; flex-direction: column; gap: 8px;\n}\n.fmstr-cmp-tmpl-cmp__item {\ndisplay: block; position: relative; padding-left: 26px;\nfont-size: 14px; line-height: 1.5; color: var(--c-fg-2);\n}\n.fmstr-cmp-tmpl-cmp__item::before {\ncontent: \"\\2713\";\nposition: absolute; left: 0; top: 0.05em;\ncolor: var(--c-good); font-weight: 700; line-height: 1.45;\n}\n.fmstr-cmp-tmpl-cmp__item--con::before { content: \"\\2717\"; color: var(--c-bad); position: absolute; left: 0; top: 0.05em; font-weight: 700; }\n.fmstr-cmp-tmpl-cmp__rules {\nmargin: 28px 0 0; padding: 18px 22px;\nbackground: var(--c-tint); border: 1px solid var(--c-edge);\nborder-radius: 12px;\ndisplay: flex; flex-direction: column; gap: 8px;\n}\n.fmstr-cmp-tmpl-cmp__rules-label {\nfont-size: 11px !important; font-weight: 700 !important; letter-spacing: 0.08em !important;\ntext-transform: uppercase; color: var(--c-violet-700) !important; margin: 0 !important;\n}\n.fmstr-cmp-tmpl-cmp__rules-list {\nmargin: 0 !important; padding: 0 0 0 20px !important;\nfont-size: 14.5px; line-height: 1.6; color: var(--c-fg-1);\ndisplay: flex; flex-direction: column; gap: 6px;\n}\n\n@media (max-width: 920px) {\n.fmstr-cmp-tmpl-cmp__grid { grid-template-columns: 1fr; gap: 12px; }\n}\n@media (max-width: 540px) {\n.fmstr-cmp-tmpl-cmp { padding: 36px 0; }\n.fmstr-cmp-tmpl-cmp__card { padding: 18px 20px; }\n}\n\n\n\u002F* mobile-safety-v2 *\u002F\n.fmstr-cmp-tmpl-cmp img, .fmstr-cmp-tmpl-cmp table, .fmstr-cmp-tmpl-cmp pre, .fmstr-cmp-tmpl-cmp iframe, .fmstr-cmp-tmpl-cmp video { max-width: 100%; }\n.fmstr-cmp-tmpl-cmp > * { min-width: 0; }\n.fmstr-cmp-tmpl-cmp [class*='__grid'] > *, .fmstr-cmp-tmpl-cmp [class*='__list'] > *, .fmstr-cmp-tmpl-cmp [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-cmp pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-tmpl-cmp table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-tmpl-cmp\" aria-labelledby=\"fmstr-cmp-tmpl-cmp-h2\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__container\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__head\">\n\u003Ch2 class=\"fmstr-cmp-tmpl-cmp__h2\" id=\"fmstr-cmp-tmpl-cmp-h2\">Which method should you pick?\u003C\u002Fh2>\n\u003Cp class=\"fmstr-cmp-tmpl-cmp__intro\">Three free routes from form submission to a Google Sheet row. Match the method to where you already are.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__grid\">\n\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__card\">\n\u003Cspan class=\"fmstr-cmp-tmpl-cmp__chip\">Method 1\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-cmp__name\">Google Forms\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-cmp__best\">\u003Cstrong>Best for:\u003C\u002Fstrong> A form you do not need to embed on your own site.\u003C\u002Fp>\n\u003Chr class=\"fmstr-cmp-tmpl-cmp__divider\">\n\u003Cul class=\"fmstr-cmp-tmpl-cmp__list\">\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">2-minute setup, no code at all.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Free with any Google account.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Responses auto-link to a Sheet.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item fmstr-cmp-tmpl-cmp__item--con\">Lives on a Google URL, not your domain.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item fmstr-cmp-tmpl-cmp__item--con\">Limited design control.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__card\">\n\u003Cspan class=\"fmstr-cmp-tmpl-cmp__chip\">Method 2\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-cmp__name\">Google Apps Script\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-cmp__best\">\u003Cstrong>Best for:\u003C\u002Fstrong> A custom HTML form you already have on your site.\u003C\u002Fp>\n\u003Chr class=\"fmstr-cmp-tmpl-cmp__divider\">\n\u003Cul class=\"fmstr-cmp-tmpl-cmp__list\">\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Free forever, no usage cap on Sheets writes (within Google quotas).\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Paste-ready code, no edits required.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Stays on your domain, no third-party branding.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item fmstr-cmp-tmpl-cmp__item--con\">20-40 minute setup.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item fmstr-cmp-tmpl-cmp__item--con\">You maintain the script and the deployment.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__card fmstr-cmp-tmpl-cmp__card--featured\">\n\u003Cspan class=\"fmstr-cmp-tmpl-cmp__chip\">Method 3 &middot; No-code\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-cmp__name\">Formester\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-cmp__best\">\u003Cstrong>Best for:\u003C\u002Fstrong> Embedding on any site with spam control, conditional logic, and Sheets sync.\u003C\u002Fp>\n\u003Chr class=\"fmstr-cmp-tmpl-cmp__divider\">\n\u003Cul class=\"fmstr-cmp-tmpl-cmp__list\">\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">5-minute setup, no code at all.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Free plan includes unlimited responses.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Native \u003Ca class=\"fmstr-cmp-tmpl-cmp__link\" href=\"https:\u002F\u002Fformester.com\u002Fintegrations\u002F\">Google Sheets integration\u003C\u002Fa>, OAuth, retries handled.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item\">Spam filtering, conditional logic, analytics built in.\u003C\u002Fli>\n\u003Cli class=\"fmstr-cmp-tmpl-cmp__item fmstr-cmp-tmpl-cmp__item--con\">Branded footer on the free plan.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n\n\u003C\u002Fdiv>\n\n\u003Cdiv class=\"fmstr-cmp-tmpl-cmp__rules\">\n\u003Cp class=\"fmstr-cmp-tmpl-cmp__rules-label\">Decision rule\u003C\u002Fp>\n\u003Cul class=\"fmstr-cmp-tmpl-cmp__rules-list\">\n\u003Cli>If the form already exists in HTML and you are fine maintaining a script, use Apps Script.\u003C\u002Fli>\n\u003Cli>If you do not need to embed the form on your own domain, use Google Forms.\u003C\u002Fli>\n\u003Cli>If you want zero maintenance, spam control, conditional logic, and Google Sheets sync in one place, use a no-code form builder like Formester.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\n\u003Cstyle>\n.fmstr-cmp-tmpl-steps a { text-decoration: none !important; }\n.fmstr-cmp-tmpl-steps a.fmstr-cmp-tmpl-steps__link { color: var(--c-violet-600) !important; font-weight: 600; }\n.fmstr-cmp-tmpl-steps a.fmstr-cmp-tmpl-steps__link:hover { text-decoration: underline !important; }\n.fmstr-cmp-tmpl-steps {\n--c-card: #ffffff;\n--c-fg-1: #101828; --c-fg-2: #475467; --c-fg-3: #697586;\n--c-violet-500: #7f56d9; --c-violet-600: #6941c6; --c-violet-700: #5b34b1;\n--c-tint: #f7f3ff; --c-edge: #e4d7ff;\n--c-border: #eaecf0;\n--c-code-bg: #0f172a; --c-code-fg: #e2e8f0;\n--c-shadow: 0 1px 3px rgba(16,24,40,.05);\nbackground: transparent;\npadding: 48px 0;\nfont-family: inherit;\ncolor: var(--c-fg-1);\ntext-align: left !important;\noverflow-x: hidden;\n}\n.fmstr-cmp-tmpl-steps *, .fmstr-cmp-tmpl-steps *::before, .fmstr-cmp-tmpl-steps *::after { box-sizing: border-box; }\n.fmstr-cmp-tmpl-steps > *, .fmstr-cmp-tmpl-steps > * > * { min-width: 0; }\n.fmstr-cmp-tmpl-steps__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-tmpl-steps__head { margin: 0 0 28px !important; }\n.fmstr-cmp-tmpl-steps__h2 {\nfont-size: clamp(26px, 3vw, 36px) !important; font-weight: 700 !important; line-height: 1.15 !important;\nletter-spacing: -.02em !important; margin: 0 !important; color: var(--c-fg-1);\n}\n.fmstr-cmp-tmpl-steps__intro { color: var(--c-fg-3); font-size: 17px !important; line-height: 1.6 !important; margin: 14px 0 0 !important; }\n.fmstr-cmp-tmpl-steps__list {\ndisplay: flex; flex-direction: column; gap: 14px;\nmargin: 0; padding: 0; list-style: none;\n}\n.fmstr-cmp-tmpl-steps__item {\nbackground: var(--c-card);\nborder: 1px solid var(--c-border);\nborder-radius: 14px;\npadding: 22px 24px;\nbox-shadow: var(--c-shadow);\ndisplay: flex; gap: 12px;\nalign-items: flex-start;\nmin-width: 0;\n}\n.fmstr-cmp-tmpl-steps__num {\nflex-shrink: 0;\nwidth: 26px; line-height: 1; height: 26px; border-radius: 7px;\nbackground: var(--c-tint);\nborder: 1px solid var(--c-edge);\ncolor: var(--c-violet-700) !important;\nfont-weight: 800; font-size: 13px;\ndisplay: inline-flex; align-items: center; justify-content: center;\n}\n.fmstr-cmp-tmpl-steps__main { flex: 1; min-width: 0; }\n.fmstr-cmp-tmpl-steps__title {\nfont-size: 17px !important; font-weight: 700 !important; line-height: 1.3 !important;\ncolor: var(--c-fg-1); margin: 0 0 6px !important;\n}\n.fmstr-cmp-tmpl-steps__body {\nfont-size: 15px !important; line-height: 1.6 !important;\ncolor: var(--c-fg-2); margin: 0 0 10px !important;\n}\n.fmstr-cmp-tmpl-steps__body:last-child { margin-bottom: 0 !important; }\n.fmstr-cmp-tmpl-steps__body code {\nbackground: #f4f4f7; padding: 1px 6px; border-radius: 5px;\nfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\nfont-size: 13.5px; color: var(--c-violet-700);\nborder: 1px solid var(--c-border);\n}\n.fmstr-cmp-tmpl-steps__code {\nmargin: 12px 0 4px;\nbackground: var(--c-code-bg);\ncolor: var(--c-code-fg);\nborder-radius: 10px;\npadding: 16px 18px;\noverflow-x: auto;\nfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\nfont-size: 13px;\nline-height: 1.6;\nwhite-space: pre;\nmax-width: 100%;\n}\n.fmstr-cmp-tmpl-steps__code-label {\ndisplay: block; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\nfont-size: 11.5px; font-weight: 700; letter-spacing: 0.06em;\ntext-transform: uppercase; color: #94a3b8;\nmargin: 0 0 10px;\n}\n.fmstr-cmp-tmpl-steps__note {\nmargin: 12px 0 0 !important; padding: 12px 14px;\nbackground: var(--c-tint); border: 1px solid var(--c-edge);\nborder-radius: 10px;\nfont-size: 14px !important; line-height: 1.55 !important;\ncolor: var(--c-fg-1);\n}\n.fmstr-cmp-tmpl-steps__note strong { color: var(--c-violet-700); font-weight: 700; }\n\n@media (max-width: 540px) {\n.fmstr-cmp-tmpl-steps { padding: 36px 0; }\n.fmstr-cmp-tmpl-steps__item { padding: 18px 20px; gap: 14px; }\n.fmstr-cmp-tmpl-steps__num { width: 34px; height: 34px; font-size: 15px; }\n.fmstr-cmp-tmpl-steps__title { font-size: 16px !important; }\n.fmstr-cmp-tmpl-steps__body { font-size: 14.5px !important; }\n.fmstr-cmp-tmpl-steps__code { font-size: 12px; padding: 14px 16px; }\n}\n\n\n\u002F* mobile-safety-v2 *\u002F\n.fmstr-cmp-tmpl-steps img, .fmstr-cmp-tmpl-steps table, .fmstr-cmp-tmpl-steps pre, .fmstr-cmp-tmpl-steps iframe, .fmstr-cmp-tmpl-steps video { max-width: 100%; }\n.fmstr-cmp-tmpl-steps > * { min-width: 0; }\n.fmstr-cmp-tmpl-steps [class*='__grid'] > *, .fmstr-cmp-tmpl-steps [class*='__list'] > *, .fmstr-cmp-tmpl-steps [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-steps pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-tmpl-steps table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\n\n\n\u002F* mobile-inline-num *\u002F\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-steps__item { padding: 18px 16px; gap: 10px; flex-direction: row; align-items: flex-start; }\n  .fmstr-cmp-tmpl-steps__num { width: 28px; height: 28px; font-size: 13px; border-radius: 8px; }\n}\n\n\u002F* step-inline-num-restructure *\u002F\n.fmstr-cmp-tmpl-steps__item { display: block !important; }\n.fmstr-cmp-tmpl-steps__title { display: block; }\n.fmstr-cmp-tmpl-steps__num { display: inline-block !important; vertical-align: 2px; margin-right: 8px; padding: 2px 8px; width: auto !important; height: auto !important; border-radius: 6px; font-size: 12.5px !important; line-height: 1.3 !important; }\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-steps__num { font-size: 11.5px !important; padding: 2px 7px; margin-right: 6px; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-tmpl-steps\" aria-labelledby=\"fmstr-cmp-tmpl-steps-h2\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-steps__container\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-steps__head\">\n\u003Ch2 class=\"fmstr-cmp-tmpl-steps__h2\" id=\"fmstr-cmp-tmpl-steps-h2\">Method 2: Google Apps Script, full working setup\u003C\u002Fh2>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__intro\">\u003Cstrong>Method 1 is one click in Google Forms. Method 3 is a no-code toggle in Formester.\u003C\u002Fstrong> The only method that needs a real walkthrough is Method 2. Here it is, in full.\u003C\u002Fp>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__intro\">Paste-ready code that handles any field name in your HTML form, sanitizes against \u003Ca class=\"fmstr-cmp-tmpl-steps__link\" href=\"https:\u002F\u002Fowasp.org\u002Fwww-community\u002Fattacks\u002FCSV_Injection\">CSV formula injection\u003C\u002Fa>, and works with both \u003Ccode>application\u002Fjson\u003C\u002Fcode> and standard form-encoded submissions.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Col class=\"fmstr-cmp-tmpl-steps__list\">\n\n\u003Cli class=\"fmstr-cmp-tmpl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-tmpl-steps__title\">\u003Cspan class=\"fmstr-cmp-tmpl-steps__num\" aria-hidden=\"true\">1\u003C\u002Fspan>Create the Sheet\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Open \u003Ca class=\"fmstr-cmp-tmpl-steps__link\" href=\"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002F\">Google Sheets\u003C\u002Fa> and create a new spreadsheet. Name the tab \u003Ccode>Submissions\u003C\u002Fcode>. In row 1, add column headers that match the \u003Ccode>name\u003C\u002Fcode> attributes on your form inputs. Add \u003Ccode>timestamp\u003C\u002Fcode> as the first column. The script reads row 1 as the source of truth for column mapping, so a typo in a header is a typo in the data.\u003C\u002Fp>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Example row 1: \u003Ccode>timestamp | name | email | message\u003C\u002Fcode>\u003C\u002Fp>\n\u003C\u002Fli>\n\n\u003Cli class=\"fmstr-cmp-tmpl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-tmpl-steps__title\">\u003Cspan class=\"fmstr-cmp-tmpl-steps__num\" aria-hidden=\"true\">2\u003C\u002Fspan>Open Apps Script and paste the code\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Inside the Sheet, go to Extensions, then Apps Script. Delete the boilerplate and paste this:\u003C\u002Fp>\n\u003Cpre class=\"fmstr-cmp-tmpl-steps__code\">\u003Cspan class=\"fmstr-cmp-tmpl-steps__code-label\">Code.gs\u003C\u002Fspan>const SHEET_NAME = 'Submissions';\nconst SCRIPT_PROP = PropertiesService.getScriptProperties();\n\nfunction initialSetup() {\n  const activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();\n  SCRIPT_PROP.setProperty('key', activeSpreadsheet.getId());\n}\n\nfunction doPost(e) {\n  const lock = LockService.getScriptLock();\n  lock.tryLock(10000);\n\n  try {\n    const doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty('key'));\n    const sheet = doc.getSheetByName(SHEET_NAME);\n\n    const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];\n    const nextRow = sheet.getLastRow() + 1;\n\n    \u002F\u002F Honeypot: if a hidden field named \"website\" is filled, drop the submission.\n    if (e.parameter.website) {\n      return ContentService.createTextOutput(JSON.stringify({ result: 'ignored' }))\n        .setMimeType(ContentService.MimeType.JSON);\n    }\n\n    const sanitize = (value) =&gt; {\n      if (typeof value !== 'string') return value;\n      \u002F\u002F Block CSV \u002F formula injection\n      return \u002F^[=+\\-@]\u002F.test(value) ? \"'\" + value : value;\n    };\n\n    const newRow = headers.map((header) =&gt; {\n      if (header === 'timestamp') return new Date();\n      return sanitize(e.parameter[header] || '');\n    });\n\n    sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);\n\n    return ContentService\n      .createTextOutput(JSON.stringify({ result: 'success', row: nextRow }))\n      .setMimeType(ContentService.MimeType.JSON);\n  } catch (err) {\n    return ContentService\n      .createTextOutput(JSON.stringify({ result: 'error', error: err.toString() }))\n      .setMimeType(ContentService.MimeType.JSON);\n  } finally {\n    lock.releaseLock();\n  }\n}\u003C\u002Fpre>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Save the script. Then in the function dropdown at the top of the editor, pick \u003Ccode>initialSetup\u003C\u002Fcode> and click Run once. Approve the OAuth prompt when Google asks. You will only do this once.\u003C\u002Fp>\n\u003C\u002Fli>\n\n\u003Cli class=\"fmstr-cmp-tmpl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-tmpl-steps__title\">\u003Cspan class=\"fmstr-cmp-tmpl-steps__num\" aria-hidden=\"true\">3\u003C\u002Fspan>Deploy as a web app\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Click Deploy, then New deployment. Pick Web app. Set Execute as: Me. Set Who has access: Anyone. Click Deploy. Copy the long URL that ends in \u003Ccode>\u002Fexec\u003C\u002Fcode>. That URL is your form endpoint.\u003C\u002Fp>\n\u003Cdiv class=\"fmstr-cmp-tmpl-steps__note\">\u003Cstrong>Heads-up:\u003C\u002Fstrong> every time you change the script, redeploy and grab the new URL. Old URLs keep working at the old script version, which is the most common cause of \"I updated my code and nothing changed\" complaints.\u003C\u002Fdiv>\n\u003C\u002Fli>\n\n\u003Cli class=\"fmstr-cmp-tmpl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-tmpl-steps__title\">\u003Cspan class=\"fmstr-cmp-tmpl-steps__num\" aria-hidden=\"true\">4\u003C\u002Fspan>Wire up your HTML form\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Drop this into your page. Replace \u003Ccode>PASTE_YOUR_DEPLOYMENT_URL_HERE\u003C\u002Fcode> with the URL from step 3.\u003C\u002Fp>\n\u003Cpre class=\"fmstr-cmp-tmpl-steps__code\">\u003Cspan class=\"fmstr-cmp-tmpl-steps__code-label\">index.html\u003C\u002Fspan>&lt;form id=\"contact-form\"&gt;\n  &lt;input type=\"text\" name=\"name\" required placeholder=\"Name\" \u002F&gt;\n  &lt;input type=\"email\" name=\"email\" required placeholder=\"Email\" \u002F&gt;\n  &lt;textarea name=\"message\" required placeholder=\"Message\"&gt;&lt;\u002Ftextarea&gt;\n  &lt;!-- Honeypot: hidden from humans, filled by bots --&gt;\n  &lt;input type=\"text\" name=\"website\" tabindex=\"-1\" autocomplete=\"off\" style=\"position:absolute;left:-9999px\" \u002F&gt;\n  &lt;button type=\"submit\"&gt;Send&lt;\u002Fbutton&gt;\n&lt;\u002Fform&gt;\n\n&lt;script&gt;\n  const form = document.getElementById('contact-form');\n  const endpoint = 'PASTE_YOUR_DEPLOYMENT_URL_HERE';\n\n  form.addEventListener('submit', async (e) =&gt; {\n    e.preventDefault();\n    const data = new FormData(form);\n    try {\n      await fetch(endpoint, { method: 'POST', body: data });\n      form.reset();\n      alert('Thanks. We will be in touch.');\n    } catch (err) {\n      alert('Something went wrong. Try again in a minute.');\n    }\n  });\n&lt;\u002Fscript&gt;\u003C\u002Fpre>\n\u003Cp class=\"fmstr-cmp-tmpl-steps__body\">Submit a test entry. The row should appear in your Sheet within a second.\u003C\u002Fp>\n\u003Cdiv class=\"fmstr-cmp-tmpl-steps__note\">\u003Cstrong>Rate limit to know about:\u003C\u002Fstrong> Google caps the Sheets-backed Apps Script at roughly \u003Ca class=\"fmstr-cmp-tmpl-steps__link\" href=\"https:\u002F\u002Fdevelopers.google.com\u002Fsheets\u002Fapi\u002Flimits\">100 requests per 100 seconds per user\u003C\u002Fa>, or one write per second. For a contact form that is plenty. If you expect bursts (a launch, a paid ad campaign), queue submissions or use a builder that handles retries.\u003C\u002Fdiv>\n\u003C\u002Fli>\n\n\u003C\u002Fol>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\u003Cstyle>\n.fmstr-cmp-tmpl-midcta a { text-decoration: none !important; }\n.fmstr-cmp-tmpl-midcta { background: transparent; padding: 48px 0; font-family: inherit; color: #101828; overflow-x: hidden; }\n.fmstr-cmp-tmpl-midcta *, .fmstr-cmp-tmpl-midcta *::before, .fmstr-cmp-tmpl-midcta *::after { box-sizing: border-box; }\n.fmstr-cmp-tmpl-midcta__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-tmpl-midcta__card { width: 100%; background: linear-gradient(135deg, #f7f3ff 0%, #faf7ff 100%); border: 1px solid #e4d7ff; border-radius: 18px; padding: 48px 32px; text-align: center; box-shadow: 0 4px 24px rgba(127, 86, 217, 0.08); }\n.fmstr-cmp-tmpl-midcta__inner { max-width: 760px; margin: 0 auto; }\n.fmstr-cmp-tmpl-midcta__eyebrow { display: inline-block; padding: 4px 12px; background: #ffffff; border: 1px solid #e4d7ff; border-radius: 9999px; color: #5b34b1 !important; font-size: 11.5px !important; font-weight: 700 !important; letter-spacing: 0.06em !important; text-transform: uppercase; margin: 0 0 14px !important; }\n.fmstr-cmp-tmpl-midcta__h2 { font-size: clamp(22px, 3vw, 28px) !important; font-weight: 700 !important; line-height: 1.2 !important; letter-spacing: -0.02em !important; margin: 0 0 12px !important; color: #101828 !important; }\n.fmstr-cmp-tmpl-midcta__body { font-size: 16px !important; line-height: 1.55 !important; color: #475467 !important; margin: 0 0 22px !important; }\n.fmstr-cmp-tmpl-midcta__cta { display: inline-flex !important; align-items: center; gap: 8px; background: #7f56d9 !important; color: #ffffff !important; border: 1px solid #7f56d9 !important; padding: 12px 26px !important; border-radius: 9999px !important; font-size: 15px !important; font-weight: 600 !important; text-decoration: none !important; transition: background .15s ease, transform .15s ease; }\n.fmstr-cmp-tmpl-midcta__cta:hover { background: #6941c6 !important; border-color: #6941c6 !important; color: #ffffff !important; text-decoration: none !important; transform: translateY(-1px); }\n.fmstr-cmp-tmpl-midcta__cta::after { content: \"\\2192\"; transition: transform .15s ease; }\n.fmstr-cmp-tmpl-midcta__cta:hover::after { transform: translateX(2px); }\n.fmstr-cmp-tmpl-midcta__strip { font-size: 13px !important; color: #697586 !important; margin: 20px 0 0 !important; display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 6px 14px; width: 100%; }\n.fmstr-cmp-tmpl-midcta__strip span { color: #d6c2f7; }\n@media (max-width: 760px) {\n  .fmstr-cmp-tmpl-midcta__card { padding: 36px 22px; }\n}\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-midcta { padding: 32px 0; }\n  .fmstr-cmp-tmpl-midcta__card { padding: 26px 16px; border-radius: 14px; }\n  .fmstr-cmp-tmpl-midcta__h2 { font-size: 20px !important; }\n  .fmstr-cmp-tmpl-midcta__body { font-size: 15px !important; }\n  .fmstr-cmp-tmpl-midcta__cta { padding: 11px 22px !important; font-size: 14.5px !important; width: 100%; justify-content: center; }\n  .fmstr-cmp-tmpl-midcta__strip { font-size: 12.5px !important; gap: 4px 10px; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-tmpl-midcta\" aria-labelledby=\"fmstr-cmp-tmpl-midcta-h2\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-midcta__container\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-midcta__card\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-midcta__inner\">\n\u003Cspan class=\"fmstr-cmp-tmpl-midcta__eyebrow\">No-code path\u003C\u002Fspan>\n\u003Ch2 class=\"fmstr-cmp-tmpl-midcta__h2\" id=\"fmstr-cmp-tmpl-midcta-h2\">Send HTML form data to Google Sheets, without writing a single line of code\u003C\u002Fh2>\n\u003Cp class=\"fmstr-cmp-tmpl-midcta__body\">Drop in a Formester form, connect Google Sheets, done. Two-way sync, free plan, no script to maintain.\u003C\u002Fp>\n\u003Ca class=\"fmstr-cmp-tmpl-midcta__cta\" href=\"https:\u002F\u002Fapp.formester.com\u002Fusers\u002Fsign_up\" style=\"background: #7f56d9 !important; color: #ffffff !important; border-color: #7f56d9 !important; text-decoration: none !important;\">Start free on Formester\u003C\u002Fa>\n\u003Cp class=\"fmstr-cmp-tmpl-midcta__strip\">Free forever plan\u003Cspan>&bull;\u003C\u002Fspan>No credit card\u003Cspan>&bull;\u003C\u002Fspan>Setup in 2 minutes\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\u003Cstyle>\n\u002F* host-link-override *\u002F\n.fmstr-cmp-tmpl-faq a { text-decoration: none !important; }\n.fmstr-cmp-tmpl-faq {\n--c-card: #ffffff;\n--c-fg-1: #101828; --c-fg-2: #475467; --c-fg-3: #697586;\n--c-violet-600: #6941c6;\n--c-tint: #f7f3ff; --c-edge: #e4d7ff;\n--c-border: #eaecf0; --c-chip-bg: #f4f4f7;\n--c-shadow: 0 1px 3px rgba(16,24,40,.05);\n\nbackground: transparent; padding: 56px 24px;\nfont-family: inherit;\ncolor: var(--c-fg-1);\ntext-align: left !important; overflow-x: hidden; -webkit-text-size-adjust: 100%;}\n.fmstr-cmp-tmpl-faq *, .fmstr-cmp-tmpl-faq *::before, .fmstr-cmp-tmpl-faq *::after { box-sizing: border-box; }\n.fmstr-cmp-tmpl-faq__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-tmpl-faq__h2 { font-size: clamp(26px, 3vw, 36px) !important; font-weight: 700 !important; line-height: 1.15 !important; letter-spacing: -.02em !important; margin: 0 !important; color: var(--c-fg-1); text-align: left; }\n.fmstr-cmp-tmpl-faq__intro { color: var(--c-fg-3); font-size: 17px !important; line-height: 1.6 !important; margin: 14px 0 28px !important; text-align: left; }\n.fmstr-cmp-tmpl-faq__list { display: flex; flex-direction: column; gap: 12px; }\n.fmstr-cmp-tmpl-faq__item {\nbackground: var(--c-card); border: 1px solid var(--c-border);\nborder-radius: 14px; box-shadow: var(--c-shadow); overflow: hidden;\n}\n.fmstr-cmp-tmpl-faq__item > summary {\npadding: 18px 22px; cursor: pointer; font-weight: 600; font-size: 16.5px;\ncolor: var(--c-fg-1); display: flex; align-items: center; gap: 14px;\nlist-style: none;\n}\n.fmstr-cmp-tmpl-faq__item > summary::-webkit-details-marker { display: none; }\n.fmstr-cmp-tmpl-faq__item > summary::before {\ncontent: \"\"; width: 28px; height: 28px; border-radius: 8px; flex-shrink: 0;\nbackground-color: var(--c-chip-bg);\nbackground-image: url(\"data:image\u002Fsvg+xml,%3Csvg xmlns='http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg' width='14' height='14' viewBox='0 0 14 14' fill='none' stroke='%2375747f' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 5l4 4 4-4'\u002F%3E%3C\u002Fsvg%3E\");\nbackground-repeat: no-repeat; background-position: center;\ntransition: transform .15s ease, background-color .15s ease;\n}\n.fmstr-cmp-tmpl-faq__item[open] > summary::before { transform: rotate(180deg); background-color: var(--c-tint); }\n.fmstr-cmp-tmpl-faq__item[open] > summary { color: var(--c-violet-600) !important; }\n.fmstr-cmp-tmpl-faq__answer { padding: 0 22px 22px 64px; color: var(--c-fg-2); font-size: 15.5px; line-height: 1.7; }\n.fmstr-cmp-tmpl-faq__answer a { color: var(--c-violet-600) !important; text-decoration: none !important; font-weight: 600; }\n.fmstr-cmp-tmpl-faq__answer a:hover { text-decoration: underline !important; }\n.fmstr-cmp-tmpl-faq__answer code {\nbackground: var(--c-chip-bg); padding: 1px 6px; border-radius: 5px;\nfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\nfont-size: 13.5px; color: var(--c-violet-600);\nborder: 1px solid var(--c-border);\n}\n\n@media (max-width: 760px) {\n.fmstr-cmp-tmpl-faq { padding: 40px 16px; }\n.fmstr-cmp-tmpl-faq__intro { font-size: 15.5px !important; text-align: left; }\n.fmstr-cmp-tmpl-faq__item > summary { padding: 16px 16px; font-size: 15.5px; gap: 12px; }\n.fmstr-cmp-tmpl-faq__item > summary::before { width: 26px; height: 26px; }\n.fmstr-cmp-tmpl-faq__answer { padding: 0 16px 18px 16px; font-size: 15px; line-height: 1.65; }\n}\n\n\n\u002F* mobile-safety-v2 *\u002F\n.fmstr-cmp-tmpl-faq img, .fmstr-cmp-tmpl-faq table, .fmstr-cmp-tmpl-faq pre, .fmstr-cmp-tmpl-faq iframe, .fmstr-cmp-tmpl-faq video { max-width: 100%; }\n.fmstr-cmp-tmpl-faq > * { min-width: 0; }\n.fmstr-cmp-tmpl-faq [class*='__grid'] > *, .fmstr-cmp-tmpl-faq [class*='__list'] > *, .fmstr-cmp-tmpl-faq [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-faq pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-tmpl-faq table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-tmpl-faq\" aria-labelledby=\"fmstr-cmp-tmpl-faq-h2\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__container\">\n\u003Ch2 class=\"fmstr-cmp-tmpl-faq__h2\" id=\"fmstr-cmp-tmpl-faq-h2\">Frequently asked questions\u003C\u002Fh2>\n\u003Cp class=\"fmstr-cmp-tmpl-faq__intro\">Common questions about routing HTML form data into Google Sheets for free.\u003C\u002Fp>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__list\">\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>Is it really free to send HTML form data to Google Sheets?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Yes. Google Apps Script is free with any Google account, with the rate limit of one Sheets write per second per user. Google Forms is free. Formester's free plan includes unlimited submissions. You only start paying when your volume crosses Google's API quota or a builder's free-plan cap.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>How secure is form data in Google Sheets?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Google encrypts data at rest and in transit. The risk is in sharing and CSV injection, not the storage. Lock down sharing to specific accounts, do not share by link, neutralize formula characters on input (the script above does this), and never use a Sheet for payment data or passwords.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>What is the rate limit on Apps Script writes to Sheets?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Roughly 100 requests per 100 seconds per user, per Google's published quotas. For a contact form that allows a sustained one submission per second, with bursts handled by retries.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>Can I send file uploads from the form into Google Sheets?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Sheets cannot hold a file, but it can hold a link. With Apps Script, you can write the file to Google Drive and write the Drive URL into the cell. With a no-code builder, the \u003Ca href=\"https:\u002F\u002Fformester.com\u002Ffeatures\u002F\">file upload field in Formester\u003C\u002Fa> handles this and stores the file separately.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>How do I add CAPTCHA or spam protection?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">The script above includes a honeypot field. For more, add Google reCAPTCHA v3 on the client and verify the token server-side before writing to the Sheet. Builders ship CAPTCHA, rate limiting, and IP blocks as a toggle.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>How do I get an email when someone submits the form?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Add \u003Ccode>MailApp.sendEmail({ to: 'you@example.com', subject: 'New form submission', body: JSON.stringify(e.parameter) })\u003C\u002Fcode> inside the \u003Ccode>doPost\u003C\u002Fcode> function in the script. Or use the \u003Ca href=\"https:\u002F\u002Fformester.com\u002Ffeatures\u002Fautoresponder-email\u002F\">autoresponder feature\u003C\u002Fa> in Formester and skip the code.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>Can I use this on Netlify, Vercel, or any static site?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Yes. The Apps Script deployment URL is just a \u003Ccode>fetch\u003C\u002Fcode> target. It works from any frontend, hosted anywhere, with no backend on your side.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003Cdetails class=\"fmstr-cmp-tmpl-faq__item\">\n\u003Csummary>Can I move from this setup to a database later?\u003C\u002Fsummary>\n\u003Cdiv class=\"fmstr-cmp-tmpl-faq__answer\">Easily. Sheets is a great starter store. When you cross a few hundred submissions a week, route the same form to a database or CRM in parallel with the Sheet. Most CRMs ship a Google Sheets sync, so you can keep the Sheet for the team and the CRM for the system of record.\u003C\u002Fdiv>\n\u003C\u002Fdetails>\n\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\n\u003Cstyle>\n\u002F* host-link-override *\u002F\n.fmstr-cmp-tmpl-rel a { text-decoration: none !important; }\n.fmstr-cmp-tmpl-rel {\n--c-card: #ffffff;\n--c-fg-1: #101828; --c-fg-2: #475467; --c-fg-3: #697586;\n--c-violet-500: #7f56d9; --c-violet-600: #6941c6;\n--c-tint: #f7f3ff; --c-edge: #e4d7ff;\n--c-border: #eaecf0;\n--c-shadow: 0 4px 20px rgba(16,24,40,.06);\n\nbackground: transparent;\npadding: 56px 24px;\nfont-family: inherit;\ncolor: var(--c-fg-1);\ntext-align: left !important; overflow-x: hidden; -webkit-text-size-adjust: 100%;}\n.fmstr-cmp-tmpl-rel *, .fmstr-cmp-tmpl-rel *::before, .fmstr-cmp-tmpl-rel *::after { box-sizing: border-box; }\n.fmstr-cmp-tmpl-rel__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-tmpl-rel__head { margin: 0 0 28px !important; text-align: left; }\n.fmstr-cmp-tmpl-rel__h2 { font-size: clamp(26px, 3vw, 36px) !important; font-weight: 700 !important; line-height: 1.15 !important; letter-spacing: -.02em !important; margin: 0 !important; color: var(--c-fg-1); text-align: left; }\n.fmstr-cmp-tmpl-rel__intro { color: var(--c-fg-3); font-size: 17px !important; line-height: 1.6 !important; margin: 14px 0 0 !important; text-align: left; }\n\n.fmstr-cmp-tmpl-rel__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }\n.fmstr-cmp-tmpl-rel__card {\nbackground: var(--c-card); border: 1px solid var(--c-border);\nborder-radius: 14px; padding: 20px 22px; display: flex; flex-direction: column; gap: 8px;\ntext-decoration: none !important; color: inherit !important; transition: all .15s ease;\nposition: relative;\n}\n.fmstr-cmp-tmpl-rel__card:hover { border-color: var(--c-edge); box-shadow: var(--c-shadow); transform: translateY(-1px); }\n.fmstr-cmp-tmpl-rel__chip {\ndisplay: inline-block; padding: 3px 10px; border-radius: 9999px;\nbackground: var(--c-tint); border: 1px solid var(--c-edge);\ncolor: var(--c-violet-600); font-size: 11.5px; font-weight: 600; letter-spacing: .02em;\ntext-transform: uppercase; align-self: flex-start;\nmargin-bottom: 2px;\n}\n.fmstr-cmp-tmpl-rel__title {\nfont-size: 16px !important; font-weight: 700 !important; color: var(--c-fg-1); margin: 0 !important; line-height: 1.3 !important; text-align: left; }\n.fmstr-cmp-tmpl-rel__body { font-size: 14.5px !important; line-height: 1.55 !important; color: var(--c-fg-2); margin: 0 !important; }\n.fmstr-cmp-tmpl-rel__arrow {\nmargin-top: 6px; color: var(--c-violet-600); font-size: 14px; font-weight: 600;\ndisplay: inline-flex; align-items: center; gap: 6px;\n}\n.fmstr-cmp-tmpl-rel__arrow::after {\ncontent: \"\\2192\"; transition: transform .15s ease; display: inline-block;\n}\n.fmstr-cmp-tmpl-rel__card:hover .fmstr-cmp-tmpl-rel__arrow::after { transform: translateX(3px); }\n\n@media (max-width: 880px) { .fmstr-cmp-tmpl-rel__grid { grid-template-columns: 1fr 1fr; gap: 14px; } }\n@media (max-width: 540px) {\n.fmstr-cmp-tmpl-rel { padding: 40px 16px; }\n.fmstr-cmp-tmpl-rel__grid { grid-template-columns: 1fr; gap: 12px; }\n.fmstr-cmp-tmpl-rel__card { padding: 18px 20px; }\n}\n\n\n\u002F* mobile-safety-v2 *\u002F\n.fmstr-cmp-tmpl-rel img, .fmstr-cmp-tmpl-rel table, .fmstr-cmp-tmpl-rel pre, .fmstr-cmp-tmpl-rel iframe, .fmstr-cmp-tmpl-rel video { max-width: 100%; }\n.fmstr-cmp-tmpl-rel > * { min-width: 0; }\n.fmstr-cmp-tmpl-rel [class*='__grid'] > *, .fmstr-cmp-tmpl-rel [class*='__list'] > *, .fmstr-cmp-tmpl-rel [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-tmpl-rel pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-tmpl-rel table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\u003C\u002Fstyle>\n\n\u003Csection class=\"fmstr-cmp-tmpl-rel\" aria-labelledby=\"fmstr-cmp-tmpl-rel-h2\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-rel__container\">\n\u003Cdiv class=\"fmstr-cmp-tmpl-rel__head\">\n\u003Ch2 class=\"fmstr-cmp-tmpl-rel__h2\" id=\"fmstr-cmp-tmpl-rel-h2\">More on connecting forms to Google Sheets\u003C\u002Fh2>\n\u003Cp class=\"fmstr-cmp-tmpl-rel__intro\">More on connecting forms to Google Sheets, building APIs around them, and picking the right builder.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Cdiv class=\"fmstr-cmp-tmpl-rel__grid\">\n\n\u003Ca class=\"fmstr-cmp-tmpl-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fblog\u002Fbest-form-builders-compatible-with-google-sheets\u002F\">\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__chip\">Listicle\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-rel__title\">Best form builders compatible with Google Sheets\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-rel__body\">Side-by-side on price, sync mode, and field mapping.\u003C\u002Fp>\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__arrow\">Read\u003C\u002Fspan>\n\u003C\u002Fa>\n\n\u003Ca class=\"fmstr-cmp-tmpl-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-link-google-sheets-to-google-forms\u002F\">\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__chip\">How-to\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-rel__title\">How to link Google Sheets to Google Forms\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-rel__body\">The 2-minute setup for the Google Forms route.\u003C\u002Fp>\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__arrow\">Read\u003C\u002Fspan>\n\u003C\u002Fa>\n\n\u003Ca class=\"fmstr-cmp-tmpl-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-pre-fill-forms-using-google-sheets-and-formester\u002F\">\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__chip\">How-to\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-rel__title\">Pre-fill forms using Google Sheets and Formester\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-rel__body\">Reverse the flow: pull Sheet data into a form before it loads.\u003C\u002Fp>\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__arrow\">Read\u003C\u002Fspan>\n\u003C\u002Fa>\n\n\u003Ca class=\"fmstr-cmp-tmpl-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fblog\u002Fhow-to-link-squarespace-forms-to-google-sheets\u002F\">\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__chip\">How-to\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-rel__title\">How to link Squarespace forms to Google Sheets\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-rel__body\">Same idea, scoped to a Squarespace site.\u003C\u002Fp>\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__arrow\">Read\u003C\u002Fspan>\n\u003C\u002Fa>\n\n\u003Ca class=\"fmstr-cmp-tmpl-rel__card\" href=\"https:\u002F\u002Fformester.com\u002Fintegrations\u002F\">\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__chip\">Formester\u003C\u002Fspan>\n\u003Ch3 class=\"fmstr-cmp-tmpl-rel__title\">Google Sheets integration\u003C\u002Fh3>\n\u003Cp class=\"fmstr-cmp-tmpl-rel__body\">Native sync with OAuth, header mapping, and retries handled.\u003C\u002Fp>\n\u003Cspan class=\"fmstr-cmp-tmpl-rel__arrow\">Open\u003C\u002Fspan>\n\u003C\u002Fa>\n\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fsection>\n\n\n","blog\u002Fblog\u002Fhow-to-send-contact-form-data-to-google-sheets-free.md",{"text":184},"9 min read",{"title":186,"author":7,"authorImage":8,"authorProfile":9,"coverImg":187,"coverImgAlt":188,"createdAt":189,"description":190,"featured":14,"jsonld":191,"keywords":227,"metaDescription":196,"metaImage":228,"metaTitle":229,"publishedAt":230,"slug":231,"updatedAt":232,"__hash__":233,"body":234,"id":235,"coverImgWidth":236,"coverImgHeight":237,"readingStats":238},"10 Types of Background Checks (And When to Run Each One)","https:\u002F\u002Fformester-strapi.s3.ap-south-1.amazonaws.com\u002Ftypes_of_background_checks_b5eee63e2f.png","10 types of background checks explained for 2026","2026-06-30T03:08:44.646Z","The 10 most common background check types employers run, what each one surfaces, cost and turnaround, when to use vs skip, plus FCRA compliance basics for employers.",[192,201],{"@type":80,"image":187,"author":193,"@context":173,"headline":186,"publisher":194,"description":196,"dateModified":197,"datePublished":197,"mainEntityOfPage":198},{"url":9,"name":7,"@type":82},{"url":163,"logo":195,"name":87,"@type":88},{"url":85,"@type":86},"The 10 most common background check types: what each surfaces, cost, turnaround, when to use, and when to skip. Plus FCRA compliance basics for employers.","2026-06-29",{"@id":199,"@type":200},"https:\u002F\u002Fformester.com\u002Fblog\u002Ftypes-of-background-checks\u002F","WebPage",{"@type":123,"@context":173,"mainEntity":202},[203,207,211,215,219,223],{"name":204,"@type":127,"acceptedAnswer":205},"What is the most common type of background check?",{"text":206,"@type":130},"Identity verification + a multi-state criminal database search + county courthouse search for criminal records in counties the candidate has lived in. Most US pre-employment checks include all three. Add MVR, employment verification, and education verification as needed for the role.",{"name":208,"@type":127,"acceptedAnswer":209},"How many types of background checks are there?",{"text":210,"@type":130},"10 commonly-used types: identity, multi-state criminal database, county criminal courthouse, federal criminal, sex offender registry, motor vehicle record, employment verification, education verification, credit check, and drug screening. Specialized roles can require additional checks (FBI fingerprint, professional license verification, international records).",{"name":212,"@type":127,"acceptedAnswer":213},"Which background check is best for hiring?",{"text":214,"@type":130},"There is no single best check. Match the stack to the role's risk profile: customer data handling needs identity + criminal + employment, driving roles need MVR added, healthcare needs sex offender + drug + license, finance needs credit. Running all 10 on every hire is wasteful and creates compliance exposure.",{"name":216,"@type":127,"acceptedAnswer":217},"How much does a background check cost?",{"text":218,"@type":130},"$25 to $50 for a basic stack (identity + criminal database + employment), $80 to $200 for a comprehensive stack with MVR, education, credit, and drug screening. Prices vary by provider and by jurisdiction (some counties charge access fees that the provider passes through).",{"name":220,"@type":127,"acceptedAnswer":221},"What is the difference between a multi-state and county criminal background check?",{"text":222,"@type":130},"Multi-state checks an aggregator database that covers most US states quickly but has coverage gaps. County checks a specific courthouse directly, slower and more expensive but more thorough. Most professional screening stacks include both: multi-state as the fast first pass, county for the candidate's actual lived counties to fill in gaps.",{"name":224,"@type":127,"acceptedAnswer":225},"Are background checks required by law?",{"text":226,"@type":130},"Some are. DOT requires drug testing and MVR for commercial drivers. Healthcare often requires sex offender registry checks and license verification. Federal contractors have specific stack requirements. Most other roles are not legally required to run background checks, but most employers do anyway because of liability exposure for negligent hiring claims.","types of background checks, background check types, kinds of background checks, what is included in a background check, employment background check types",[],"10 Types of Background Checks Explained (2026)","2026-06-30T00:00:00.000Z","types-of-background-checks","2026-06-30T13:01:45.856Z","EPa3fHKvi7dCxq8ECTJgCkEmNnbjDT8MBgvlGoCjXqo","\u003Cp style=\"font-size: inherit;\">There is no single thing called \"a background check\". The term covers 10+ distinct check types, each pulling from a different data source, each with its own legal rules, cost, and turnaround. Picking the right combination for a role is the difference between meaningful risk screening and theatre.\u003C\u002Fp>\n\n\u003Cp>This guide walks the 10 most common background check types employers run, what each one surfaces, when to use it (and when to skip), the cost range, and how long it takes. Use it to build the screening package that matches the role, not the package your provider is upselling.\u003C\u002Fp>\n\n\u003Ch2>Why the right check matters more than running more checks\u003C\u002Fh2>\n\n\u003Cp>Running every available check on every candidate looks thorough. It is actually expensive, slow, and creates compliance exposure. Three reasons to be deliberate:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Cost.\u003C\u002Fstrong> A full check stack can run $80 to $200 per candidate. Multiply by your hiring volume.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Time.\u003C\u002Fstrong> Each check adds days. A 10-check stack often takes 2x as long as a focused 4-check stack.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Compliance.\u003C\u002Fstrong> Some checks (credit, criminal beyond 7 years, salary history) are restricted in specific states. Running them everywhere creates risk.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>The right approach: pick the 3 to 5 checks that match the actual risks of the role. The list below tells you what each one surfaces so you can pick.\u003C\u002Fp>\n\n\u003Ch2>1. Identity verification \u002F SSN trace\u003C\u002Fh2>\n\n\u003Cp>Confirms the candidate is who they say they are. Cross-references the SSN, name, and date of birth against credit bureau records to surface aliases and address history.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Cost:\u003C\u002Fstrong> $5 to $15 per check\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Turnaround:\u003C\u002Fstrong> Under 1 day\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Best for:\u003C\u002Fstrong> Every role. Identity is the foundation of every other check.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Skip if:\u003C\u002Fstrong> Almost never. This is the cheapest check and prevents the worst outcome (hiring someone who is not who they claim).\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>2. Criminal records (multi-state database)\u003C\u002Fh2>\n\n\u003Cp>The \"instant\" criminal check. Searches a multi-state aggregator database covering most US states. Fast, broad, but not always complete.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Cost:\u003C\u002Fstrong> $10 to $25 per check\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Turnaround:\u003C\u002Fstrong> Minutes to 1 hour\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Best for:\u003C\u002Fstrong> First-pass screening. Most providers run this as the entry point.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Limit:\u003C\u002Fstrong> Database coverage is not perfect. Pair with county courthouse searches for the addresses the candidate has lived.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>3. Criminal records (county courthouse)\u003C\u002Fh2>\n\n\u003Cp>The deeper criminal check. Searches court records at the actual county level where the candidate has lived. More thorough than the database, slower and more expensive.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Cost:\u003C\u002Fstrong> $10 to $20 per county\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Turnaround:\u003C\u002Fstrong> 1 to 7 business days per county\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Best for:\u003C\u002Fstrong> Roles where the cost of a missed criminal record is high (positions of trust, healthcare, finance, work with vulnerable populations). For full guidance on timing, see our breakdown of \u003Ca href=\"\u002Fblog\u002Fhow-long-do-background-checks-take\u002F\">how long background checks take\u003C\u002Fa> by type.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Coverage:\u003C\u002Fstrong> Search the counties where the candidate has lived in the last 7 years (FCRA reportable window).\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>4. Federal criminal records\u003C\u002Fh2>\n\n\u003Cp>Different database, different jurisdiction. Federal crimes (tax fraud, drug trafficking, interstate crimes) live in federal court records (PACER), not county or state systems.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Cost:\u003C\u002Fstrong> $10 to $25\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Turnaround:\u003C\u002Fstrong> 1 to 3 business days\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Best for:\u003C\u002Fstrong> Roles handling money, financial data, government contracts, or interstate commerce.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Skip if:\u003C\u002Fstrong> The role does not handle financial or regulated information. Most retail and operational roles do not need this.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>5. Sex offender registry\u003C\u002Fh2>\n\n\u003Cp>Searches the national and state sex offender registries.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Cost:\u003C\u002Fstrong> $5 to $10\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Turnaround:\u003C\u002Fstrong> Minutes\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Best for:\u003C\u002Fstrong> Required for roles involving children, elderly, or vulnerable populations (healthcare, education, childcare).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Note:\u003C\u002Fstrong> Often bundled into the criminal check.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>6. Motor vehicle records (MVR)\u003C\u002Fh2>\n\n\u003Cp>The driving record. Pulls history of license suspensions, DUIs, points on the license, and overall driving infractions from the state DMV.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Cost:\u003C\u002Fstrong> $5 to $20 per state\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Turnaround:\u003C\u002Fstrong> Real-time to 3 days depending on state\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Best for:\u003C\u002Fstrong> Any role involving driving for work. Delivery, sales reps, field service, transportation. Required by DOT regulations for commercial drivers.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Skip if:\u003C\u002Fstrong> The role does not involve work-related driving.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>7. Employment verification\u003C\u002Fh2>\n\n\u003Cp>Confirms the dates, titles, and (if authorized) salaries claimed on the resume by contacting previous employers.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Cost:\u003C\u002Fstrong> $15 to $30 per employer\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Turnaround:\u003C\u002Fstrong> 3 to 5 business days per employer\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Best for:\u003C\u002Fstrong> Almost every role. Resume fabrication is more common than employers like to admit.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Speed tip:\u003C\u002Fstrong> Large employers using The Work Number return in under a day. Small employers can take 1 to 2 weeks.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>8. Education verification\u003C\u002Fh2>\n\n\u003Cp>Confirms degrees, dates, and institutions on the resume. Uses the National Student Clearinghouse for most US universities, manual verification for high schools and smaller institutions.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Cost:\u003C\u002Fstrong> $10 to $25 per credential\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Turnaround:\u003C\u002Fstrong> 3 to 7 business days for US schools, 2 to 4 weeks for international\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Best for:\u003C\u002Fstrong> Roles where the specific degree is required (regulated professions, technical roles with credential requirements).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Skip if:\u003C\u002Fstrong> The degree is not required for the role. Most employers over-verify here.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>9. Credit check\u003C\u002Fh2>\n\n\u003Cp>Pulls the candidate's credit report. Shows credit history, debt levels, bankruptcies, and collections.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Cost:\u003C\u002Fstrong> $15 to $30\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Turnaround:\u003C\u002Fstrong> Instant to 3 days (depending on whether the candidate's credit is frozen)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Best for:\u003C\u002Fstrong> Roles handling money, financial data, or fiduciary responsibilities. Banking, accounting, executive finance roles.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Compliance:\u003C\u002Fstrong> Restricted in 11+ US states for employment use. Check state-by-state requirements before running.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Skip if:\u003C\u002Fstrong> The role does not handle finances. Credit checks for non-financial roles invite legal exposure for limited benefit.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>10. Drug screening\u003C\u002Fh2>\n\n\u003Cp>Tests for substance use through urine, hair, or saliva samples.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Cost:\u003C\u002Fstrong> $30 to $100 depending on panel\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Turnaround:\u003C\u002Fstrong> 1 to 3 business days (5 to 7 for hair tests)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Best for:\u003C\u002Fstrong> DOT-regulated roles, safety-sensitive positions, healthcare, federal contractor roles where required.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Compliance:\u003C\u002Fstrong> Marijuana-specific rules vary by state. Several US states restrict pre-employment marijuana testing.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Skip if:\u003C\u002Fstrong> No safety or regulatory reason to test. Industry standards have shifted away from drug testing for non-safety-sensitive roles.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cdiv style=\"background: #F5F3FF; border: 1px solid #E9D5FF; border-radius: 24px; padding: clamp(28px, 5vw, 56px) clamp(20px, 4vw, 48px); margin: 40px 0; text-align: center; font-family: inherit;\">\n\u003Cdiv style=\"display: inline-block; background: #FFFFFF; border: 1px solid #E9D5FF; border-radius: 9999px; padding: 6px 16px; font-size: 12px; font-weight: 700; color: #6941C6; letter-spacing: 0.06em; text-transform: uppercase; margin-bottom: 22px;\">FCRA Authorization\u003C\u002Fdiv>\n\u003Ch3 style=\"color: #0F172A !important; font-size: clamp(24px, 3.4vw, 36px); line-height: 1.2; font-weight: 700; margin: 0 auto 14px; max-width: 720px; font-family: inherit;\">Collect FCRA-compliant authorization in one form\u003C\u002Fh3>\n\u003Cp style=\"color: #475467; font-size: clamp(15px, 1.5vw, 17px); line-height: 1.55; margin: 0 auto 28px; max-width: 600px; font-family: inherit;\">Our Background Check Authorization Form has the standalone disclosure, the signature field, and the candidate-rights language pre-built.\u003C\u002Fp>\n\u003Cp style=\"margin: 0;\">\u003Ca href=\"https:\u002F\u002Fformester.com\u002Ftemplates\u002Fbackground-check-authorization-form-22780\u002F\" style=\"display: inline-block; background: #7f56d9 !important; color: #ffffff !important; text-decoration: none !important; padding: 14px 28px; border-radius: 9999px; font-weight: 600; font-size: 16px; font-family: inherit;\">Use the Background Check Authorization Form \u003Cspan aria-hidden=\"true\" style=\"margin-left: 4px;\">&rarr;\u003C\u002Fspan>\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp style=\"margin: 22px 0 0; font-size: 13px; color: #697586; font-family: inherit;\">Free forever plan \u003Cspan style=\"color: #C4B5FD;\">&bull;\u003C\u002Fspan> No credit card \u003Cspan style=\"color: #C4B5FD;\">&bull;\u003C\u002Fspan> Setup in 2 minutes\u003C\u002Fp>\n\u003C\u002Fdiv>\n\n\u003Ch2>How to build the right check stack for a role\u003C\u002Fh2>\n\n\u003Cp>Three questions to scope the right stack:\u003C\u002Fp>\n\n\u003Col>\n\u003Cli>\u003Cstrong>What is the real risk?\u003C\u002Fstrong> Match checks to specific risks. Customer-data role: identity + criminal + employment. Driving role: identity + criminal + MVR. Healthcare: identity + criminal + sex offender + drug + license. Stop bundling defaults you do not need.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>What is the candidate experience cost?\u003C\u002Fstrong> Each check adds 1 to 7 days. A 10-check stack for a $50K admin role is bad candidate experience for marginal risk reduction.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>What does the law require here?\u003C\u002Fstrong> Some checks are required by regulation (DOT drug screening, FBI fingerprint for some healthcare). Some are restricted by state. Compliance shapes both what you must run and what you must not run.\u003C\u002Fli>\n\u003C\u002Fol>\n\n\u003Ch2>FCRA compliance basics\u003C\u002Fh2>\n\n\u003Cp>Almost every employment background check in the US falls under the Fair Credit Reporting Act. Three rules every employer running checks needs to follow:\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Standalone disclosure and authorization.\u003C\u002Fstrong> The candidate signs a separate document authorizing the check. Embedding it in the offer letter or application form violates FCRA. Use a dedicated \u003Ca href=\"\u002Ftemplates\u002Fbackground-check-authorization-form-22780\u002F\">background check form\u003C\u002Fa> with the disclosure on a standalone document.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Pre-adverse action notice.\u003C\u002Fstrong> Before deciding not to hire based on the report, give the candidate a copy of the report and a reasonable time (typically 5 business days) to dispute.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Adverse action notice.\u003C\u002Fstrong> If you proceed with the no-hire after dispute, send a formal notice with the candidate's rights and the consumer reporting agency's contact info.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>The \u003Ca href=\"https:\u002F\u002Fwww.consumer.ftc.gov\u002Farticles\u002Femployers-have-rights-too\">FTC publishes employer-side guidance\u003C\u002Fa> on FCRA compliance worth bookmarking.\u003C\u002Fp>\n\n\u003Ch2>The takeaway\u003C\u002Fh2>\n\n\u003Cp>Picking the right 3 to 5 background checks for the role beats running every check available. Identity + criminal (multi-state + county) + employment is the right starting stack for most roles. Add MVR for driving roles, credit for financial roles, drug for safety-sensitive, education for credentialed positions. Skip the rest unless there is a specific risk or compliance reason. Pair the stack with a complete FCRA-compliant consent form, communicate the timeline to candidates, and most of the friction in background screening goes away.\u003C\u002Fp>\n\n\u003Csection class=\"faq\">\n\u003Ch2>Types of background checks FAQ\u003C\u002Fh2>\n\u003Cdetails>\u003Csummary>What is the most common type of background check?\u003C\u002Fsummary>\u003Cdiv>Identity verification + a multi-state criminal database search + county courthouse search for criminal records in counties the candidate has lived in. Most US pre-employment checks include all three. Add MVR, employment verification, and education verification as needed for the role.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>How many types of background checks are there?\u003C\u002Fsummary>\u003Cdiv>10 commonly-used types: identity, multi-state criminal database, county criminal courthouse, federal criminal, sex offender registry, motor vehicle record, employment verification, education verification, credit check, and drug screening. Specialized roles can require additional checks (FBI fingerprint, professional license verification, international records).\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>Which background check is best for hiring?\u003C\u002Fsummary>\u003Cdiv>There is no single best check. Match the stack to the role's risk profile: customer data handling needs identity + criminal + employment, driving roles need MVR added, healthcare needs sex offender + drug + license, finance needs credit. Running all 10 on every hire is wasteful and creates compliance exposure.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>How much does a background check cost?\u003C\u002Fsummary>\u003Cdiv>$25 to $50 for a basic stack (identity + criminal database + employment), $80 to $200 for a comprehensive stack with MVR, education, credit, and drug screening. Prices vary by provider and by jurisdiction (some counties charge access fees that the provider passes through).\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>What is the difference between a multi-state and county criminal background check?\u003C\u002Fsummary>\u003Cdiv>Multi-state checks an aggregator database that covers most US states quickly but has coverage gaps. County checks a specific courthouse directly, slower and more expensive but more thorough. Most professional screening stacks include both: multi-state as the fast first pass, county for the candidate's actual lived counties to fill in gaps.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003Cdetails>\u003Csummary>Are background checks required by law?\u003C\u002Fsummary>\u003Cdiv>Some are. DOT requires drug testing and MVR for commercial drivers. Healthcare often requires sex offender registry checks and license verification. Federal contractors have specific stack requirements. Most other roles are not legally required to run background checks, but most employers do anyway because of liability exposure for negligent hiring claims.\u003C\u002Fdiv>\u003C\u002Fdetails>\n\u003C\u002Fsection>\n\n","blog\u002Fblog\u002Ftypes-of-background-checks.md",2400,1350,{"text":184},1788363426942]