[{"data":1,"prerenderedAt":216},["ShallowReactive",2],{"blog-best-questionnaire-software":3},{"blogData":4,"relatedArticles":27},{"id":5,"title":6,"description":7,"metaTitle":8,"metaDescription":9,"keywords":10,"author":11,"authorProfile":12,"coverImgAlt":13,"featured":14,"slug":15,"body":16,"createdAt":17,"updatedAt":18,"publishedAt":19,"coverImg":20,"metaImage":21,"schema":22,"coverImgWidth":23,"coverImgHeight":24,"readingStats":25},1832,"8 Best Questionnaire Software in 2026: Compared","8 top questionnaire tools ranked for HR, research, feedback, and intake. Formester, SurveyMonkey, Typeform, Jotform, Google Forms, Microsoft Forms, Fillout, Zoho Forms. Analytics + pricing compared.","8 Best Questionnaire Software in 2026 | Formester","The 8 best questionnaire tools in 2026 for HR, research, feedback, and intake. Pricing, templates, integrations, and which one fits your team.","best questionnaire software, questionnaire builder, online questionnaire tool, questionnaire maker, questionnaire software 2026","Harish Kumar","https://www.linkedin.com/in/harish-kumar2424/","8 best questionnaire software compared for 2026",false,"best-questionnaire-software","![8 best questionnaire software compared for 2026](https://formester-strapi.s3.ap-south-1.amazonaws.com/best_questionnaire_software_d54438ac13.png)\n\n\u003Cp style=\"font-size: inherit;\">A questionnaire is a structured set of questions asked to a defined audience with a defined purpose: HR intake, market research, customer feedback, patient screening, employee engagement. Unlike a casual form, it usually has a fixed question set, a distribution plan, and downstream analysis.\u003C/p>\n\n\u003Cp>This guide ranks 8 tools that handle serious questionnaire work, evaluated on question types, distribution, analytics, integrations, and pricing.\u003C/p>\n\n\u003Cdiv style=\"background:#F9FAFB;border-left:4px solid #7f56d9;padding:14px 18px;margin:0 0 24px 0;border-radius:6px;font-family:inherit;\">\n\u003Cp style=\"margin:0;font-size:14px;color:#475467;font-family:inherit;\">\u003Cstrong>How we verified this:\u003C/strong> ratings, review counts, and prices sourced directly from each tool's own pricing / product pages and their public G2 review profile on 2026-07-09. We rechecked every price and free-tier cap the morning of publish. Live listings may vary if a tool updates pricing after this date.\u003C/p>\n\u003C/div>\n\n\u003Ch2>The quick pick\u003C/h2>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Best all-around:\u003C/strong> Formester. Unlimited responses on free, drop-off analysis, all field types, direct CRM integrations.\u003C/li>\n\u003Cli>\u003Cstrong>Best for enterprise research:\u003C/strong> SurveyMonkey. Statistical significance testing, benchmarking, mature analytics.\u003C/li>\n\u003Cli>\u003Cstrong>Best for conversational polish:\u003C/strong> Typeform. Highest completion rates on 10+ question sets.\u003C/li>\n\u003Cli>\u003Cstrong>Best for feature depth:\u003C/strong> Jotform. 20,000+ templates, HIPAA, multi-page questionnaires.\u003C/li>\n\u003Cli>\u003Cstrong>Best free workspace tool:\u003C/strong> Google Forms.\u003C/li>\n\u003Cli>\u003Cstrong>Best for M365 tenants:\u003C/strong> Microsoft Forms.\u003C/li>\n\u003Cli>\u003Cstrong>Best for Airtable-native questionnaires:\u003C/strong> Fillout.\u003C/li>\n\u003Cli>\u003Cstrong>Best for Zoho teams:\u003C/strong> Zoho Forms.\u003C/li>\n\u003C/ul>\n\n\u003Ch2>At a glance: 8 questionnaire tools compared\u003C/h2>\n\n\u003Cdiv class=\"table-wrap\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\u003Cth>Tool\u003C/th>\u003Cth>Free plan\u003C/th>\u003Cth>Cheapest paid\u003C/th>\u003Cth>Advanced logic\u003C/th>\u003Cth>Analytics depth\u003C/th>\u003Cth>G2 rating\u003C/th>\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>Formester\u003C/td>\u003Ctd>Unlimited forms + responses on free\u003C/td>\u003Ctd>Personal $13/mo\u003C/td>\u003Ctd>Personal+\u003C/td>\u003Ctd>Drop-off + response analytics\u003C/td>\u003Ctd>4.7/5\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd>SurveyMonkey\u003C/td>\u003Ctd>25 questions per survey\u003C/td>\u003Ctd>Advantage $39/mo\u003C/td>\u003Ctd>Advantage+\u003C/td>\u003Ctd>Deepest (significance + benchmarks)\u003C/td>\u003Ctd>4.5/5\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd>Typeform\u003C/td>\u003Ctd>3 forms, 10 responses/mo\u003C/td>\u003Ctd>Basic $28/mo\u003C/td>\u003Ctd>Plus+\u003C/td>\u003Ctd>Basic + insights\u003C/td>\u003Ctd>4.5/5\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd>Jotform\u003C/td>\u003Ctd>5 forms, 100 submissions\u003C/td>\u003Ctd>Bronze $34/mo\u003C/td>\u003Ctd>All paid\u003C/td>\u003Ctd>Report Builder\u003C/td>\u003Ctd>4.7/5\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd>Google Forms\u003C/td>\u003Ctd>Free with Google\u003C/td>\u003Ctd>N/A\u003C/td>\u003Ctd>Section-based only\u003C/td>\u003Ctd>Google Sheets analysis\u003C/td>\u003Ctd>4.6/5\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd>Microsoft Forms\u003C/td>\u003Ctd>Free with M365\u003C/td>\u003Ctd>N/A\u003C/td>\u003Ctd>Basic branching\u003C/td>\u003Ctd>Excel Online\u003C/td>\u003Ctd>4.4/5\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd>Fillout\u003C/td>\u003Ctd>Generous free tier\u003C/td>\u003Ctd>Starter $19/mo\u003C/td>\u003Ctd>All paid\u003C/td>\u003Ctd>Native + external\u003C/td>\u003Ctd>4.7/5\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd>Zoho Forms\u003C/td>\u003Ctd>3 forms, 500 submissions/mo\u003C/td>\u003Ctd>Basic $10/mo\u003C/td>\u003Ctd>Standard+\u003C/td>\u003Ctd>Zoho Analytics\u003C/td>\u003Ctd>4.4/5\u003C/td>\u003C/tr>\n\u003C/tbody>\n\u003C/table>\n\u003C/div>\n\n\u003Ch2>1. Formester, best all-around\u003C/h2>\n\n\u003Cp>\u003Cimg src=\"https://formester-strapi.s3.ap-south-1.amazonaws.com/formester_99e2a99609.png\" alt=\"Formester homepage hero screenshot\" style=\"width:100%;max-width:900px;height:auto;border-radius:8px;border:1px solid #e5e7eb;margin:16px 0;\" loading=\"lazy\" />\u003C/p>\n\n\u003Cp>Formester is the value pick for questionnaires because the free plan does not cap responses.\u003C/p>\n\n\u003Cp>That matters: a small HR pulse survey with 500 respondents fits on Formester's free plan; on SurveyMonkey Team Advantage it costs $25/user/month and a three-user minimum.\u003C/p>\n\n\u003Cp>AI questionnaire generation accepts a prompt, a raw question list, or a PDF, and produces the right field types and validation automatically.\u003C/p>\n\n\u003Cp>The gap: no HIPAA BAA yet, so patient-identifiable research still needs SurveyMonkey Premier or Jotform Silver.\u003C/p>\n\n\u003Cp>\u003Cstrong>Best for:\u003C/strong> HR, product, and CX teams running questionnaires with no response cap, no HIPAA requirement, and an appetite for AI-generated drafts.\u003C/p>\n\n\u003Cp>\u003Cstrong>Strengths\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>Unlimited forms and unlimited responses on the free plan (no submission cap)\u003C/li>\n\u003Cli>AI form generation from three inputs: prompt, question list, or PDF upload\u003C/li>\n\u003Cli>Native offline mode across every plan, including free, so field teams keep collecting when signal drops\u003C/li>\n\u003Cli>Payment collection on the free plan via Stripe, PayPal, and Razorpay (most competitors gate this)\u003C/li>\n\u003Cli>Drop-off analysis surfaces the exact question respondents abandon on, on the free plan\u003C/li>\n\u003Cli>GDPR, UK GDPR, and CCPA compliance; DPA available on request\u003C/li>\n\u003Cli>REST API and MCP server for programmatic form and response management\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Weaknesses\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>No HIPAA certification, so it is not the right pick for patient-identifiable health data\u003C/li>\n\u003Cli>Template library sits at roughly 350 templates, well under Jotform's 20,000\u003C/li>\n\u003Cli>G2 review count is 11, small compared to Typeform's 1,000+ or Jotform's 5,300+; the product ships fast but the review corpus has not caught up\u003C/li>\n\u003Cli>No SOC 2 or ISO 27001 attestation yet (roadmap item, not currently certified)\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Pricing\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Free plan:\u003C/strong> Unlimited forms, unlimited responses, AI form creator, drop-off analysis, payment collection, offline mode. No credit card.\u003C/li>\n\u003Cli>\u003Cstrong>Starting paid tier:\u003C/strong> Personal at $13/month (annual), adds conditional logic, custom domain, and file uploads to 100 MB\u003C/li>\n\u003Cli>\u003Cstrong>Most popular:\u003C/strong> Business at $49/month, adds white-label, team seats, and priority support\u003C/li>\n\u003Cli>\u003Cstrong>Enterprise:\u003C/strong> Custom pricing with SSO, dedicated CSM, and DPA\u003C/li>\n\u003Cli>\u003Cstrong>Free trial:\u003C/strong> Not applicable; the free plan is permanent, not a trial\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>G2 rating:\u003C/strong> \u003Ca href=\"https://www.g2.com/products/formester/reviews\" target=\"_blank\" rel=\"noopener\">4.7/5 (11 reviews on G2)\u003C/a>\u003C/p>\n\n\u003Ch2>2. SurveyMonkey, best for enterprise research\u003C/h2>\n\n\u003Cp>\u003Cimg src=\"https://formester-strapi.s3.ap-south-1.amazonaws.com/surveymonkey_3a2712fdfc.png\" alt=\"SurveyMonkey homepage hero screenshot\" style=\"width:100%;max-width:900px;height:auto;border-radius:8px;border:1px solid #e5e7eb;margin:16px 0;\" loading=\"lazy\" />\u003C/p>\n\n\u003Cp>SurveyMonkey is the incumbent for a reason: research teams recognize the brand and enterprise procurement pre-approves it.\u003C/p>\n\n\u003Cp>1,800+ methodologist-written templates and cross-tab analysis are things smaller competitors do not offer.\u003C/p>\n\n\u003Cp>SPSS export, industry benchmarks, and Text Analysis on Premier make it a serious research tool.\u003C/p>\n\n\u003Cp>The tradeoff is per-user pricing that adds up fast: Team Advantage is $25/user/month with a three-user minimum, Premier is $75/user/month.\u003C/p>\n\n\u003Cp>\u003Cstrong>Best for:\u003C/strong> Enterprise research and CX teams that need methodologist-grade templates, SPSS export, and a HIPAA BAA.\u003C/p>\n\n\u003Cp>\u003Cstrong>Strengths\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>The most trusted brand in enterprise survey research; every research team recognizes it\u003C/li>\n\u003Cli>Question bank of 1,800+ certified templates written by methodologists\u003C/li>\n\u003Cli>SPSS export, cross-tab analysis, and Text Analysis (AI) on higher tiers\u003C/li>\n\u003Cli>Benchmarks feature compares your results against SurveyMonkey's aggregate industry data\u003C/li>\n\u003Cli>SOC 2 Type II, HIPAA, GDPR compliance built in, with a signed BAA on the Advantage plan and up\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Weaknesses\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>Paid tiers are steep: Advantage starts at $39/month per user (billed annually), not per organization\u003C/li>\n\u003Cli>Free plan is punishing, 10 questions per survey and 40 responses/month\u003C/li>\n\u003Cli>Interface has not modernized as fast as Typeform or Fillout\u003C/li>\n\u003Cli>Best features (SPSS export, benchmarks, text analysis) sit on Premier or Enterprise\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Pricing\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Free plan:\u003C/strong> 10 questions per survey, 40 responses/month, basic reporting\u003C/li>\n\u003Cli>\u003Cstrong>Starting paid tier:\u003C/strong> Team Advantage at $25/user/month (3-user minimum, annual)\u003C/li>\n\u003Cli>\u003Cstrong>Most popular:\u003C/strong> Team Premier at $75/user/month, unlocks SPSS export and advanced logic\u003C/li>\n\u003Cli>\u003Cstrong>Individual Advantage:\u003C/strong> $39/month for a single seat, 15,000 responses/year\u003C/li>\n\u003Cli>\u003Cstrong>Enterprise:\u003C/strong> Custom pricing with SSO, HIPAA BAA, and dedicated CSM\u003C/li>\n\u003Cli>\u003Cstrong>Free trial:\u003C/strong> Not offered on Team plans; Individual plans have a monthly cancel option\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>G2 rating:\u003C/strong> \u003Ca href=\"https://www.g2.com/products/surveymonkey/reviews\" target=\"_blank\" rel=\"noopener\">4.4/5 (23,528 reviews on G2)\u003C/a>\u003C/p>\n\n\u003Ch2>3. Typeform, best for conversational polish\u003C/h2>\n\n\u003Cp>\u003Cimg src=\"https://formester-strapi.s3.ap-south-1.amazonaws.com/typeform_7aad7a2e5b.png\" alt=\"Typeform homepage hero screenshot\" style=\"width:100%;max-width:900px;height:auto;border-radius:8px;border:1px solid #e5e7eb;margin:16px 0;\" loading=\"lazy\" />\u003C/p>\n\n\u003Cp>For any questionnaire where completion rate matters more than throughput, Typeform is the safest pick.\u003C/p>\n\n\u003Cp>The one-question-at-a-time UX consistently lifts completion rates on qualitative surveys by 10–20 percentage points versus a static form.\u003C/p>\n\n\u003Cp>Growth Flow (2026) layers AI-generated follow-ups on top, useful when a screener needs to branch into a deeper conversation.\u003C/p>\n\n\u003Cp>The response caps and jump between tiers make it a poor pick for high-volume ops or HR pulse surveys, Formester or SurveyMonkey are better there.\u003C/p>\n\n\u003Cp>\u003Cstrong>Best for:\u003C/strong> Product research, brand marketing, and customer feedback teams optimizing for completion rate on qualitative questionnaires.\u003C/p>\n\n\u003Cp>\u003Cstrong>Strengths\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>Best-in-class conversational form UX, one question at a time, feels like a chat\u003C/li>\n\u003Cli>AI Growth Flow (2026 launch) generates full forms and follow-up sequences from a prompt\u003C/li>\n\u003Cli>Deep logic branching and calculations on Plus and above\u003C/li>\n\u003Cli>1,200+ native and Zapier-mediated integrations\u003C/li>\n\u003Cli>Strong analytics on drop-off, completion time, and device split\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Weaknesses\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>Free plan is punishing: only 10 questions per form and 10 responses per month\u003C/li>\n\u003Cli>Prices jump hard between tiers, especially at the Business ($83/mo) step for higher response caps\u003C/li>\n\u003Cli>One question per screen slows down high-volume data entry (better for polish than throughput)\u003C/li>\n\u003Cli>No offline mode\u003C/li>\n\u003Cli>Payment collection is gated behind Plus ($50/mo) and above\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Pricing\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Free plan:\u003C/strong> 1 workspace, 10 questions per form, 10 responses/month\u003C/li>\n\u003Cli>\u003Cstrong>Starting paid tier:\u003C/strong> Basic at $25/month, 100 responses/month, 1 user\u003C/li>\n\u003Cli>\u003Cstrong>Most popular:\u003C/strong> Plus at $50/month, 1,000 responses/month, remove Typeform branding\u003C/li>\n\u003Cli>\u003Cstrong>Business:\u003C/strong> $83/month, 10,000 responses, priority support\u003C/li>\n\u003Cli>\u003Cstrong>Enterprise:\u003C/strong> Custom pricing with SSO, dedicated CSM, and higher response ceilings\u003C/li>\n\u003Cli>\u003Cstrong>Free trial:\u003C/strong> 14-day trial on Business plan\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>G2 rating:\u003C/strong> \u003Ca href=\"https://www.g2.com/products/typeform/reviews\" target=\"_blank\" rel=\"noopener\">4.5/5 (1,003 reviews on G2)\u003C/a>\u003C/p>\n\n\u003Ch2>4. Jotform, best for feature depth\u003C/h2>\n\n\u003Cp>\u003Cimg src=\"https://formester-strapi.s3.ap-south-1.amazonaws.com/jotform_52dafaf96f.png\" alt=\"Jotform homepage hero screenshot\" style=\"width:100%;max-width:900px;height:auto;border-radius:8px;border:1px solid #e5e7eb;margin:16px 0;\" loading=\"lazy\" />\u003C/p>\n\n\u003Cp>Jotform has more question types, more logic, and more integrations than any competitor at its price point.\u003C/p>\n\n\u003Cp>For questionnaires that need HIPAA compliance (Silver plan and above), payment collection, or complex approval workflows, this is the pick.\u003C/p>\n\n\u003Cp>20,000+ templates is more marketing than usable, the search is thin, but the underlying builder handles almost any use case.\u003C/p>\n\n\u003Cp>The interface is dense; expect a learning curve if your team is coming from Google Forms or Typeform.\u003C/p>\n\n\u003Cp>\u003Cstrong>Best for:\u003C/strong> HR, healthcare, and operations teams that need HIPAA, deep logic, and payment collection on the same questionnaire.\u003C/p>\n\n\u003Cp>\u003Cstrong>Strengths\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>Largest template library on the market, over 20,000 pre-built forms\u003C/li>\n\u003Cli>Native support for 40+ payment gateways (Stripe, PayPal, Square, Authorize.Net, and dozens more)\u003C/li>\n\u003Cli>HIPAA compliance available on Silver plan and above (add-on for the BAA)\u003C/li>\n\u003Cli>Jotform Mobile Forms app captures data offline on iOS and Android\u003C/li>\n\u003Cli>Conditional logic, calculations, and multi-page forms across every paid tier\u003C/li>\n\u003Cli>Strong integrations library: Salesforce, HubSpot, Google Sheets, Airtable, Slack\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Weaknesses\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>The interface is dense, so the learning curve is steeper than newer builders\u003C/li>\n\u003Cli>Free plan cuts off at 100 submissions per month, which fills fast for even a small campaign\u003C/li>\n\u003Cli>20,000+ templates sounds great but the search relevance is thin, so finding the right one takes time\u003C/li>\n\u003Cli>Branding removal is gated behind Bronze ($34/mo) and up\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Pricing\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Free plan:\u003C/strong> 5 forms, 100 submissions/month, 100 MB storage. Jotform branding stays on the form.\u003C/li>\n\u003Cli>\u003Cstrong>Starting paid tier:\u003C/strong> Bronze at $34/month (annual $24), 25 forms and 1,000 submissions\u003C/li>\n\u003Cli>\u003Cstrong>Most popular:\u003C/strong> Silver at $39/month (annual $29), 50 forms and 2,500 submissions; unlocks HIPAA add-on\u003C/li>\n\u003Cli>\u003Cstrong>Enterprise:\u003C/strong> Custom pricing with SSO, dedicated support, and a signed BAA\u003C/li>\n\u003Cli>\u003Cstrong>Free trial:\u003C/strong> Not needed; the free plan is permanent\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>G2 rating:\u003C/strong> \u003Ca href=\"https://www.g2.com/products/jotform/reviews\" target=\"_blank\" rel=\"noopener\">4.7/5 (5,321 reviews on G2)\u003C/a>\u003C/p>\n\n\u003Ch2>5. Google Forms, best free workspace tool\u003C/h2>\n\n\u003Cp>\u003Cimg src=\"https://formester-strapi.s3.ap-south-1.amazonaws.com/google_forms_1165c9a16e.png\" alt=\"Google Forms homepage hero screenshot\" style=\"width:100%;max-width:900px;height:auto;border-radius:8px;border:1px solid #e5e7eb;margin:16px 0;\" loading=\"lazy\" />\u003C/p>\n\n\u003Cp>Google Forms is the pragmatic pick for internal questionnaires when 'free and ships today' beats 'polished and paid'.\u003C/p>\n\n\u003Cp>The Sheets integration is real-time, which makes it viable for internal ops surveys that need analysis on Monday morning.\u003C/p>\n\n\u003Cp>For anything customer-facing, the design ceiling is too low; brand-match matters and Google Forms cannot deliver it.\u003C/p>\n\n\u003Cp>Use this for internal pulse surveys, event RSVPs, and quick feedback loops.\u003C/p>\n\n\u003Cp>\u003Cstrong>Best for:\u003C/strong> Google Workspace teams running internal-only questionnaires and event RSVPs that don't need branded design.\u003C/p>\n\n\u003Cp>\u003Cstrong>Strengths\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>Free with any Google account, no submission cap, no form-count cap\u003C/li>\n\u003Cli>Auto-syncs to Google Sheets for one-click analysis\u003C/li>\n\u003Cli>Real-time collaboration on form editing, native to Google Workspace\u003C/li>\n\u003Cli>Response validation, section logic, and question shuffling built in\u003C/li>\n\u003Cli>Familiar interface: anyone who has used Docs can build a form in five minutes\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Weaknesses\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>Very limited design control, you cannot match brand fonts, spacing, or button styles\u003C/li>\n\u003Cli>No native payment collection, offline mode, or webhooks\u003C/li>\n\u003Cli>Logic is basic: 'skip to section' works but no calculations or true multi-condition branching\u003C/li>\n\u003Cli>File uploads only work for respondents signed into a Google account\u003C/li>\n\u003Cli>No native CRM sync; you need Zapier or a script for anything past a spreadsheet\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Pricing\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Free plan:\u003C/strong> Unlimited forms, unlimited responses, unlimited questions with any personal Google account\u003C/li>\n\u003Cli>\u003Cstrong>Starting paid tier:\u003C/strong> Not applicable for Forms itself; Google Workspace Business Starter is $7/user/month if you want business email and admin controls\u003C/li>\n\u003Cli>\u003Cstrong>Most popular:\u003C/strong> Google Workspace Business Standard at $14/user/month for shared drives and larger meeting caps (Forms is bundled at no extra cost)\u003C/li>\n\u003Cli>\u003Cstrong>Enterprise:\u003C/strong> Workspace Enterprise, custom pricing, adds Vault and advanced admin\u003C/li>\n\u003Cli>\u003Cstrong>Free trial:\u003C/strong> 14-day free trial on Google Workspace plans\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>G2 rating:\u003C/strong> \u003Ca href=\"https://www.g2.com/products/google-forms/reviews\" target=\"_blank\" rel=\"noopener\">4.6/5 (48,097 reviews on G2)\u003C/a>\u003C/p>\n\n\u003Ch2>6. Microsoft Forms, best for M365 tenants\u003C/h2>\n\n\u003Cp>\u003Cimg src=\"https://formester-strapi.s3.ap-south-1.amazonaws.com/microsoft_forms_6d1d2eb8e8.png\" alt=\"Microsoft Forms homepage hero screenshot\" style=\"width:100%;max-width:900px;height:auto;border-radius:8px;border:1px solid #e5e7eb;margin:16px 0;\" loading=\"lazy\" />\u003C/p>\n\n\u003Cp>Microsoft Forms is Google Forms for the Microsoft 365 world, and if that's your stack, it's free and admin-safe.\u003C/p>\n\n\u003Cp>Excel and SharePoint are the analysis path, which enterprise IT teams generally prefer to Sheets.\u003C/p>\n\n\u003Cp>Security compliance inherits from the tenant, so SOC 2, ISO 27001, and HIPAA are viable when the org is licensed for them.\u003C/p>\n\n\u003Cp>Design and integration ceilings are similar to Google Forms, good for internal, weak for external.\u003C/p>\n\n\u003Cp>\u003Cstrong>Best for:\u003C/strong> Enterprise IT and HR teams already licensed for Microsoft 365 who want a compliant internal questionnaire tool.\u003C/p>\n\n\u003Cp>\u003Cstrong>Strengths\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>Bundled with any Microsoft 365 subscription at no extra cost\u003C/li>\n\u003Cli>Native integration with Excel, SharePoint, and Teams for downstream analysis\u003C/li>\n\u003Cli>Branching logic and quiz mode with auto-grading built in\u003C/li>\n\u003Cli>Enterprise-grade security posture inherits from Microsoft 365 (SOC 2, ISO 27001, HIPAA when configured)\u003C/li>\n\u003Cli>No response cap on paid Microsoft 365 plans\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Weaknesses\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>Almost useless outside the Microsoft 365 ecosystem, no external respondent tracking, no CRM connectors\u003C/li>\n\u003Cli>Very limited design customization; forms look like Microsoft forms\u003C/li>\n\u003Cli>No payment collection, no webhooks, no offline mode\u003C/li>\n\u003Cli>Free personal-account version has a 200-response cap per form and hides key features\u003C/li>\n\u003Cli>Anonymous responses are gated: on many enterprise tenants, external submissions require admin unlock\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Pricing\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Free plan:\u003C/strong> Any personal Microsoft account, 200 responses per form, basic features\u003C/li>\n\u003Cli>\u003Cstrong>Starting paid tier:\u003C/strong> Microsoft 365 Business Basic at $6/user/month (annual), unlocks the full Forms feature set\u003C/li>\n\u003Cli>\u003Cstrong>Most popular:\u003C/strong> Microsoft 365 Business Standard at $12.50/user/month, adds desktop Office apps and larger mailboxes\u003C/li>\n\u003Cli>\u003Cstrong>Enterprise:\u003C/strong> Microsoft 365 E3 at $36/user/month or E5 at $57/user/month, for compliance and advanced security\u003C/li>\n\u003Cli>\u003Cstrong>Free trial:\u003C/strong> 30-day trial on Microsoft 365 Business\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>G2 rating:\u003C/strong> \u003Ca href=\"https://www.g2.com/products/microsoft-forms/reviews\" target=\"_blank\" rel=\"noopener\">4.4/5 (473 reviews on G2)\u003C/a>\u003C/p>\n\n\u003Ch2>7. Fillout, best for Airtable-native questionnaires\u003C/h2>\n\n\u003Cp>\u003Cimg src=\"https://formester-strapi.s3.ap-south-1.amazonaws.com/fillout_d14627e722.png\" alt=\"Fillout homepage hero screenshot\" style=\"width:100%;max-width:900px;height:auto;border-radius:8px;border:1px solid #e5e7eb;margin:16px 0;\" loading=\"lazy\" />\u003C/p>\n\n\u003Cp>Fillout is the questionnaire pick when Airtable or Notion is your source of truth.\u003C/p>\n\n\u003Cp>Two-way sync means the questionnaire can update existing records (not just insert new ones), which is powerful for RevOps or HR intake.\u003C/p>\n\n\u003Cp>1,000 responses/month on the free plan makes it viable for smaller ops teams without a paid seat.\u003C/p>\n\n\u003Cp>For teams not on Airtable or Notion, Formester or Typeform are broader picks at similar cost.\u003C/p>\n\n\u003Cp>\u003Cstrong>Best for:\u003C/strong> RevOps, HR, and product teams whose source-of-truth is Airtable or Notion and who need the questionnaire to update those records.\u003C/p>\n\n\u003Cp>\u003Cstrong>Strengths\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>Deepest Airtable and Notion two-way sync of any builder, writes back to databases, not just reads\u003C/li>\n\u003Cli>Fillout AI agent (2026) generates full forms from a prompt or scheduling from calendar\u003C/li>\n\u003Cli>Native scheduling, PDF, payments, and signatures in one product, so no bolt-ons\u003C/li>\n\u003Cli>Multi-step, conditional forms with a fast editor UX\u003C/li>\n\u003Cli>Free plan is genuinely usable: 1,000 responses/month, unlimited forms\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Weaknesses\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>Best-in-class for Airtable / Notion teams; less compelling if you are not on either\u003C/li>\n\u003Cli>Smaller review corpus than Jotform / Typeform (~30 G2 reviews)\u003C/li>\n\u003Cli>Growth AI features add up: agent add-ons and higher response caps push Pro users to Business fast\u003C/li>\n\u003Cli>No native offline mode\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Pricing\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Free plan:\u003C/strong> Unlimited forms, 1,000 responses/month, most core features unlocked\u003C/li>\n\u003Cli>\u003Cstrong>Starting paid tier:\u003C/strong> Pro at $19/month (annual), 5,000 responses, remove branding\u003C/li>\n\u003Cli>\u003Cstrong>Most popular:\u003C/strong> Business at $49/month, 25,000 responses, priority support\u003C/li>\n\u003Cli>\u003Cstrong>Enterprise:\u003C/strong> Custom pricing with SSO, custom limits, and DPA\u003C/li>\n\u003Cli>\u003Cstrong>Free trial:\u003C/strong> Not needed; free plan is generous\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>G2 rating:\u003C/strong> \u003Ca href=\"https://www.g2.com/products/fillout/reviews\" target=\"_blank\" rel=\"noopener\">4.6/5 (30 reviews on G2)\u003C/a>\u003C/p>\n\n\u003Ch2>8. Zoho Forms, best for Zoho teams\u003C/h2>\n\n\u003Cp>\u003Cimg src=\"https://formester-strapi.s3.ap-south-1.amazonaws.com/zoho_forms_2e42a5d231.png\" alt=\"Zoho Forms homepage hero screenshot\" style=\"width:100%;max-width:900px;height:auto;border-radius:8px;border:1px solid #e5e7eb;margin:16px 0;\" loading=\"lazy\" />\u003C/p>\n\n\u003Cp>Zoho Forms is the obvious pick if you already run Zoho CRM, Zoho Desk, or Zoho Analytics.\u003C/p>\n\n\u003Cp>One-click sync from a questionnaire submission into Zoho CRM lead objects saves the setup pain other builders demand.\u003C/p>\n\n\u003Cp>Native offline apps for iOS and Android make it viable for field questionnaires (HR site visits, sales enablement).\u003C/p>\n\n\u003Cp>The interface is dated, and if you're not already in Zoho, the case for adopting it is thin.\u003C/p>\n\n\u003Cp>\u003Cstrong>Best for:\u003C/strong> Teams already committed to Zoho who want the fastest CRM sync at the lowest per-seat cost.\u003C/p>\n\n\u003Cp>\u003Cstrong>Strengths\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>Best-in-class if you already use Zoho CRM, Zoho Desk, or Zoho Analytics, one-click sync\u003C/li>\n\u003Cli>40+ field types including signature, file upload, and QR code\u003C/li>\n\u003Cli>Native offline apps for iOS and Android with sync-on-reconnect\u003C/li>\n\u003Cli>Conditional logic, calculations, and multi-page forms on Basic plan and above\u003C/li>\n\u003Cli>Approvals workflows and card-view submissions on Standard and above\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Weaknesses\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>UI feels dated compared to Typeform, Fillout, or Formester (2026)\u003C/li>\n\u003Cli>Non-Zoho integrations are thinner, Zapier fills the gap but adds a hop\u003C/li>\n\u003Cli>Free plan is capped at 3 forms and 500 submissions/month\u003C/li>\n\u003Cli>AI features are behind the market; no full-form generation from a prompt\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>Pricing\u003C/strong>\u003C/p>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Free plan:\u003C/strong> 3 forms, 500 submissions/month, Zoho branding on the form\u003C/li>\n\u003Cli>\u003Cstrong>Starting paid tier:\u003C/strong> Basic at $10/month (annual), 10,000 submissions and 10 forms\u003C/li>\n\u003Cli>\u003Cstrong>Most popular:\u003C/strong> Standard at $25/month, 25 forms and approvals workflows\u003C/li>\n\u003Cli>\u003Cstrong>Professional:\u003C/strong> $50/month, unlimited forms and payment integrations\u003C/li>\n\u003Cli>\u003Cstrong>Premium:\u003C/strong> $90/month for HIPAA compliance and Salesforce integration\u003C/li>\n\u003Cli>\u003Cstrong>Free trial:\u003C/strong> 15-day trial on all paid plans\u003C/li>\n\u003C/ul>\n\n\u003Cp>\u003Cstrong>G2 rating:\u003C/strong> \u003Ca href=\"https://www.g2.com/products/zoho-forms/reviews\" target=\"_blank\" rel=\"noopener\">4.4/5 (129 reviews on G2)\u003C/a>\u003C/p>\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;\">Formester\u003C/div>\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;\">Run questionnaires without response caps\u003C/h3>\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;\">Unlimited responses, drop-off analysis, and all field types on the free plan. No cap on questions or forms.\u003C/p>\n\u003Cp style=\"margin: 0;\">\u003Ca href=\"https://app.formester.com/users/sign_up\" 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;\">Try Formester free \u003Cspan aria-hidden=\"true\" style=\"margin-left: 4px;\">&rarr;\u003C/span>\u003C/a>\u003C/p>\n\u003Cp style=\"margin: 22px 0 0; font-size: 13px; color: #697586; font-family: inherit;\">Free forever plan \u003Cspan style=\"color: #C4B5FD;\">&bull;\u003C/span> No credit card \u003Cspan style=\"color: #C4B5FD;\">&bull;\u003C/span> Setup in 2 minutes\u003C/p>\n\u003C/div>\n\n\u003Ch2>How to pick\u003C/h2>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>Enterprise research + statistical analysis:\u003C/strong> SurveyMonkey\u003C/li>\n\u003Cli>\u003Cstrong>HR engagement or customer feedback (10-20 questions):\u003C/strong> Typeform (completion rate wins) or Formester (cost + no response cap)\u003C/li>\n\u003Cli>\u003Cstrong>Patient screening or HIPAA-required:\u003C/strong> Jotform Silver+ with HIPAA add-on\u003C/li>\n\u003Cli>\u003Cstrong>Internal workspace questionnaire:\u003C/strong> Google Forms (Workspace) or Microsoft Forms (M365)\u003C/li>\n\u003Cli>\u003Cstrong>Airtable-native intake:\u003C/strong> Fillout\u003C/li>\n\u003Cli>\u003Cstrong>Zoho ecosystem:\u003C/strong> Zoho Forms\u003C/li>\n\u003C/ul>\n\n\u003Csection class=\"faq\">\n\u003Ch2>FAQs\u003C/h2>\n\u003Cdetails>\u003Csummary>What is questionnaire software?\u003C/summary>\u003Cdiv>Software that lets you design, distribute, collect, and analyse a structured set of questions. Different from a casual form in that it usually has fixed question sets, defined audiences, and downstream analytics.\u003C/div>\u003C/details>\n\u003Cdetails>\u003Csummary>What is the best free questionnaire software?\u003C/summary>\u003Cdiv>Formester leads on free generosity (unlimited forms + responses). Google Forms and Microsoft Forms are the free defaults for workspace-tied teams. SurveyMonkey's free tier is severely capped (25 questions).\u003C/div>\u003C/details>\n\u003Cdetails>\u003Csummary>Which questionnaire tool has the best analytics?\u003C/summary>\u003Cdiv>SurveyMonkey for statistical rigor (significance testing, benchmarking). Jotform's Report Builder is strong for operational reporting. Formester ships drop-off analysis on free, which is unusual and useful for funnel optimization.\u003C/div>\u003C/details>\n\u003Cdetails>\u003Csummary>Can I use Google Forms for a professional questionnaire?\u003C/summary>\u003Cdiv>For simple surveys under 500 responses, yes. For advanced logic, custom branding, HIPAA, or statistical analysis, look at a paid tool.\u003C/div>\u003C/details>\n\u003Cdetails>\u003Csummary>Is Formester a good questionnaire tool?\u003C/summary>\u003Cdiv>Yes, especially for teams sending questionnaires without wanting to worry about response caps. The free plan supports unlimited responses, all field types, drop-off analysis, and custom email notifications. Conditional logic on Personal ($13/mo) covers most professional questionnaire needs. ---\u003C/div>\u003C/details>\n\u003C/section>","2026-07-09T14:52:44.671Z","2026-07-10T05:24:14.167Z","2026-07-10T05:14:39.000Z","https://formester-strapi.s3.ap-south-1.amazonaws.com/best_questionnaire_software_d54438ac13.png",[],[],2400,1350,{"text":26},"15 min read",[28,48,66,198],{"title":29,"description":30,"metaTitle":31,"metaDescription":32,"keywords":33,"author":11,"authorProfile":12,"coverImgAlt":34,"featured":14,"slug":35,"body":36,"createdAt":37,"updatedAt":38,"publishedAt":39,"coverImg":40,"metaImage":41,"schema":42,"id":43,"coverImgWidth":44,"coverImgHeight":45,"readingStats":46},"How to Collaborate on a Single Form Submission?","Learn how to collaborate on a single form submission with teammates in real time. Submit forms together with ease.","How to Collaborate on a Single Form Submission","Learn how to collaborate on a single form submission with teammates in real time. Submit forms together without delay.","collaborative forms,\ncollaborate on a single form submission,\ncollaborative form submission,\n","a blog post cover about how to collaborate on a single form submission","how-to-collaborate-on-a-single-form-submission","\u003Ciframe width=\"100%\" height=\"315\" src=\"https://www.youtube.com/embed/ruVP5GKQhHo?si=Qd64mMMERhEgnZtt\" 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/iframe>\n\nSometimes, one form needs input from more than one person. Maybe HR fills one part, the manager fills another, and the new employee adds the final details. \n\nSending emails back and forth or using spreadsheets is a mess.\n\nThat’s why** collaborative form submission** matters and why Formester makes it super easy.\n\nIn this post, you’ll learn what **form collaboration** is, how it works, and how to set it up in just a few clicks.\n\n## What Is Form Collaboration?\nForm collaboration means more than one person can work together on a **single form submission**. \nInstead of everyone filling out separate forms or waiting for a copy, each person adds their part to the same form entry.\n\nWith Formester’s **collaborative form feature**, you can:\n\n- Save your progress\n\n- Share a unique link\n\n- Let others fill out the rest\n\nIt’s like passing a digital clipboard around, no confusion, no lost data.\n\n### Why Use Collaborative Form Submission?\nHere’s why this feature is a game-changer:\n\n- **Keep Everything in One Place:** No need to combine multiple forms or chase missing answers.\n\n- **Save Time:** Each person fills only what’s needed, without repeating information.\n\n- **Reduce Errors:** Everyone sees what’s already filled, so nothing gets duplicated or missed.\n\n- **Easy to Use:** No logins, no technical setup. Just toggle a setting and share a link.\n\n### How to Collaborate on a Form in Formester\nYou can set up a collaborative form in just **3 simple steps**:\n\n### Step 1: Turn On Collaboration\n\n- **[Go to](https://app.formester.com/users/sign_in)** the Formester form builder\n\n- Open your form or create a new one\n\n- Click Settings → Advanced Settings\n\n- Toggle **[Save and Resume Later](/features/save-and-continue/)**\n\nThis option enables users to save a partially filled form and return later or pass it to someone else.\n\n### Step 2: Fill and Save Your Progress\n\n- Start filling out the form\n\n- Click the Save and Resume Later button\n\n- You’ll get a unique collaboration link\n\nThis link saves all current entries and lets the next person continue where you left off.\n\n### Step 3: Share the Link with Your Team\n\n- Send the collaboration link to the next person\n\n- They open the form and see everything filled so far\n\n- They complete their part and either submit or pass it on again\n\nRepeat this until the form is complete and ready to submit.\n\n### Conclusion\nSome forms need input from more than one person. Instead of sending emails or sharing files, use Formester’s form collaboration feature. It lets your team work together on a single form entry with one simple link.\n\nEach person fills in their part. Everyone sees what is already done. And the final form stays complete and organized.\n\n**{Start using collaborative forms today](https://app.formester.com/users/sign_up)** and make teamwork easier.","2025-06-11T00:35:13.101Z","2025-06-11T00:38:12.895Z","2025-06-11T00:38:12.890Z","https://formester-strapi.s3.ap-south-1.amazonaws.com/How_to_Make_User_Research_Survey_9_f4db99dddc.png",[],[],1521,1214,630,{"text":47},"3 min read",{"title":49,"description":50,"metaTitle":51,"metaDescription":52,"keywords":53,"author":11,"authorProfile":12,"coverImgAlt":54,"featured":14,"slug":55,"body":56,"createdAt":57,"updatedAt":58,"publishedAt":59,"coverImg":60,"metaImage":61,"schema":62,"id":63,"coverImgWidth":44,"coverImgHeight":45,"readingStats":64},"How to Make a Feedback Form in HTML (with Code, CSS, and a Backend)","Learn how to create a feedback form in HTML with easy steps. Set up an HTML document, add form fields, style with CSS, and add JavaScript for validation. Test your form and start collecting feedback.","How to Make a Feedback Form in HTML (Code, CSS, Validation, Backend)","Build a working feedback form in HTML with copy-paste code, CSS styling, JavaScript validation, accessibility, and a backend that stores submissions without a server.","feedback forms, fillable freedback form, how to make feedback form in html, style feedback form with css, feedback form html code","an illustration of how to make feedback form in html","how-to-make-feedback-form-in-html","![an illustration of how to make feedback form in html](https://formester-strapi.s3.ap-south-1.amazonaws.com/an_illustration_of_how_to_make_feedback_form_in_html_c6203dc935.png)\n\n\u003Cstyle>\n/* host-link-override */\n.fmstr-cmp-ffh-body a { text-decoration: none !important; }\n.fmstr-cmp-ffh-body {\n--c-bg-card: #ffffff;\n--c-bg-soft: #f9fafb;\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; --c-border: #eaecf0;\n--c-code-bg: #0f172a; --c-code-fg: #e2e8f0;\n--c-code-keyword: #a78bfa; --c-code-attr: #67e8f9; --c-code-string: #fcd34d; --c-code-comment: #64748b;\n--c-warn-bg: #fef3c7; --c-warn-fg: #92400e; --c-warn-edge: #fde68a;\n\nbackground: transparent; padding: 24px;\nfont-family: inherit;\ncolor: var(--c-fg-1);\n}\n.fmstr-cmp-ffh-body *, .fmstr-cmp-ffh-body *::before, .fmstr-cmp-ffh-body *::after { box-sizing: border-box; }\n.fmstr-cmp-ffh-body__container { max-width: 820px; margin: 0 auto; }\n\n.fmstr-cmp-ffh-body__intro p { font-size: 17px; line-height: 1.7; color: var(--c-fg-2); margin: 0 0 16px; }\n.fmstr-cmp-ffh-body__intro a { color: var(--c-violet-600) !important; text-decoration: none !important; font-weight: 500; }\n.fmstr-cmp-ffh-body__intro a:hover { text-decoration: underline !important; }\n.fmstr-cmp-ffh-body__intro code { background: var(--c-tint); color: var(--c-violet-600); padding: 2px 6px; border-radius: 4px; font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 14.5px; border: 1px solid var(--c-edge); }\n\n.fmstr-cmp-ffh-body__h2 {\nfont-size: 28px; font-weight: 700; line-height: 1.25; letter-spacing: -.02em;\nmargin: 40px 0 16px; color: var(--c-fg-1);\n}\n.fmstr-cmp-ffh-body__h3 {\nfont-size: 20px; font-weight: 700; line-height: 1.35; letter-spacing: -.01em;\nmargin: 28px 0 12px; color: var(--c-fg-1);\n}\n.fmstr-cmp-ffh-body p { font-size: 16px; line-height: 1.7; color: var(--c-fg-2); margin: 0 0 14px; }\n.fmstr-cmp-ffh-body p strong { color: var(--c-fg-1); }\n.fmstr-cmp-ffh-body a { color: var(--c-violet-600) !important; text-decoration: none !important; font-weight: 500; }\n.fmstr-cmp-ffh-body a:hover { text-decoration: underline !important; }\n.fmstr-cmp-ffh-body ul, .fmstr-cmp-ffh-body ol { margin: 0 0 16px; padding-left: 22px; }\n.fmstr-cmp-ffh-body li { font-size: 16px; line-height: 1.7; color: var(--c-fg-2); margin: 6px 0; }\n.fmstr-cmp-ffh-body li strong { color: var(--c-fg-1); }\n.fmstr-cmp-ffh-body code { background: var(--c-tint); color: var(--c-violet-600); padding: 2px 6px; border-radius: 4px; font-family: ui-monospace, Menlo, Consolas, monospace; font-size: 14.5px; border: 1px solid var(--c-edge); }\n\n.fmstr-cmp-ffh-body__code {\nbackground: var(--c-code-bg); color: var(--c-code-fg);\nborder-radius: 12px; padding: 18px 20px; margin: 8px 0 18px;\noverflow-x: auto;\nfont-family: ui-monospace, Menlo, Consolas, monospace; font-size: 13.5px; line-height: 1.6;\n}\n.fmstr-cmp-ffh-body__code pre { margin: 0; }\n.fmstr-cmp-ffh-body__code code {\nbackground: transparent !important; color: inherit !important; padding: 0; border: 0;\nfont-family: inherit !important; font-size: inherit;\n}\n.fmstr-cmp-ffh-body__code .kw { color: var(--c-code-keyword); }\n.fmstr-cmp-ffh-body__code .at { color: var(--c-code-attr); }\n.fmstr-cmp-ffh-body__code .st { color: var(--c-code-string); }\n.fmstr-cmp-ffh-body__code .cm { color: var(--c-code-comment); font-style: italic; }\n.fmstr-cmp-ffh-body__code .lang { display: inline-block; font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; padding: 3px 10px; border-radius: 6px; background: rgba(255,255,255,.1); color: rgba(255,255,255,.7); margin: 0 0 12px; }\n\n.fmstr-cmp-ffh-body__note {\nmargin: 14px 0 18px; padding: 14px 18px;\nbackground: var(--c-bg-soft); border-left: 3px solid var(--c-violet-500);\nborder-radius: 8px; font-size: 15.5px; color: var(--c-fg-2); line-height: 1.6;\n}\n.fmstr-cmp-ffh-body__note strong { color: var(--c-fg-1); }\n.fmstr-cmp-ffh-body__note--warn { background: var(--c-warn-bg); border-left-color: var(--c-warn-fg); }\n.fmstr-cmp-ffh-body__note--warn strong { color: var(--c-warn-fg); }\n\n.fmstr-cmp-ffh-body__variants {\ndisplay: grid; grid-template-columns: 1fr; gap: 14px; margin: 12px 0 24px;\n}\n.fmstr-cmp-ffh-body__variant {\nbackground: var(--c-bg-card); border: 1px solid var(--c-border); border-radius: 14px;\npadding: 18px 22px;\n}\n.fmstr-cmp-ffh-body__variant h4 {\nfont-size: 16px; font-weight: 700; color: var(--c-fg-1);\nmargin: 0 0 8px; line-height: 1.35;\n}\n.fmstr-cmp-ffh-body__variant p { font-size: 15px; line-height: 1.65; color: var(--c-fg-2); margin: 0; }\n\n@media (max-width: 760px) {\n.fmstr-cmp-ffh-body { padding: 16px; }\n.fmstr-cmp-ffh-body__intro p, .fmstr-cmp-ffh-body p, .fmstr-cmp-ffh-body li { font-size: 15.5px; }\n.fmstr-cmp-ffh-body__h2 { font-size: 24px; margin-top: 32px; }\n.fmstr-cmp-ffh-body__h3 { font-size: 18.5px; }\n.fmstr-cmp-ffh-body__code { padding: 14px 16px; font-size: 12.5px; border-radius: 10px; }\n.fmstr-cmp-ffh-body__variant { padding: 16px 18px; }\n}\n\u003C/style>\n\n\u003Csection class=\"fmstr-cmp-ffh-body\" aria-label=\"How to make a feedback form in HTML\">\n\u003Cdiv class=\"fmstr-cmp-ffh-body__container\">\n\n\u003Cdiv class=\"fmstr-cmp-ffh-body__intro\">\n\u003Cp>A feedback form in HTML is twenty lines of markup, a bit of CSS, and one decision that trips up almost everyone: what happens after the user clicks Submit?\u003C/p>\n\u003Cp>This guide ships the full pattern. You'll get a working \u003Ccode>&lt;form&gt;\u003C/code> with name, email, and message fields, CSS that styles it without a framework, JavaScript validation that doesn't break keyboard users, and three honest options for the backend, including one that needs zero server code. Paste the snippets in order, swap the action URL, and you have a live feedback form on your site in about ten minutes.\u003C/p>\n\u003Cp>If you want to skip the code entirely, \u003Ca href=\"https://formester.com/features/drag-and-drop-form-builder/\">Formester's drag-and-drop builder\u003C/a> ships a feedback form you can \u003Ca href=\"https://formester.com/features/embed-forms/\">embed in any HTML page\u003C/a> with one snippet. Keep reading for the hand-coded path.\u003C/p>\n\u003C/div>\n\n\u003Ch2 class=\"fmstr-cmp-ffh-body__h2\">What a feedback form in HTML actually needs\u003C/h2>\n\u003Cp>Four pieces, in order:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>A \u003Ccode>&lt;form&gt;\u003C/code> element\u003C/strong> with the right \u003Ccode>action\u003C/code> and \u003Ccode>method\u003C/code> so the browser knows where to send data.\u003C/li>\n\u003Cli>\u003Cstrong>Labeled inputs\u003C/strong> for the fields you care about (name, email, rating, message), with \u003Ccode>name\u003C/code> attributes so the server can read them.\u003C/li>\n\u003Cli>\u003Cstrong>Validation\u003C/strong> on the client (for user experience) and on the server (for trust).\u003C/li>\n\u003Cli>\u003Cstrong>A backend\u003C/strong> that receives the submission, stores it, and ideally notifies you. This is the part most tutorials skip; it's the part you need most.\u003C/li>\n\u003C/ul>\n\u003Cp>Below, each piece is a separate step with a copy-paste block. The last step is a single complete file you can save as \u003Ccode>feedback.html\u003C/code> and open in a browser.\u003C/p>\n\n\u003Ch2 class=\"fmstr-cmp-ffh-body__h2\">Step 1: Set up the HTML document\u003C/h2>\n\u003Cp>Save this as \u003Ccode>feedback.html\u003C/code>. It's the shell every form goes inside.\u003C/p>\n\u003Cdiv class=\"fmstr-cmp-ffh-body__code\">\u003Cspan class=\"lang\">HTML\u003C/span>\n\u003Cpre>\u003Ccode>&lt;!DOCTYPE html&gt;\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n&#160;&#160;&lt;meta charset=\"UTF-8\"&gt;\n&#160;&#160;&lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n&#160;&#160;&lt;title&gt;Feedback Form&lt;/title&gt;\n&lt;/head&gt;\n&lt;body&gt;\n&#160;&#160;&lt;h1&gt;Tell us what you think&lt;/h1&gt;\n&#160;&#160;&lt;!-- form goes here --&gt;\n&lt;/body&gt;\n&lt;/html&gt;\u003C/code>\u003C/pre>\n\u003C/div>\n\u003Cp>Two small things that matter later: \u003Ccode>lang=\"en\"\u003C/code> helps screen readers pick the right voice, and the viewport meta tag makes the form usable on phones.\u003C/p>\n\n\u003Ch2 class=\"fmstr-cmp-ffh-body__h2\">Step 2: Add the form fields\u003C/h2>\n\u003Cp>Paste this inside \u003Ccode>&lt;body&gt;\u003C/code>, where the comment says \"form goes here\":\u003C/p>\n\u003Cdiv class=\"fmstr-cmp-ffh-body__code\">\u003Cspan class=\"lang\">HTML\u003C/span>\n\u003Cpre>\u003Ccode>&lt;form id=\"feedback-form\" action=\"/submit-feedback\" method=\"post\" novalidate&gt;\n&#160;&#160;&lt;div class=\"field\"&gt;\n&#160;&#160;&#160;&#160;&lt;label for=\"name\"&gt;Name&lt;/label&gt;\n&#160;&#160;&#160;&#160;&lt;input type=\"text\" id=\"name\" name=\"name\" autocomplete=\"name\" required&gt;\n&#160;&#160;&lt;/div&gt;\n\n&#160;&#160;&lt;div class=\"field\"&gt;\n&#160;&#160;&#160;&#160;&lt;label for=\"email\"&gt;Email&lt;/label&gt;\n&#160;&#160;&#160;&#160;&lt;input type=\"email\" id=\"email\" name=\"email\" autocomplete=\"email\" required&gt;\n&#160;&#160;&lt;/div&gt;\n\n&#160;&#160;&lt;div class=\"field\"&gt;\n&#160;&#160;&#160;&#160;&lt;label for=\"rating\"&gt;How was your experience?&lt;/label&gt;\n&#160;&#160;&#160;&#160;&lt;select id=\"rating\" name=\"rating\" required&gt;\n&#160;&#160;&#160;&#160;&#160;&#160;&lt;option value=\"\"&gt;Pick one&lt;/option&gt;\n&#160;&#160;&#160;&#160;&#160;&#160;&lt;option value=\"5\"&gt;Loved it&lt;/option&gt;\n&#160;&#160;&#160;&#160;&#160;&#160;&lt;option value=\"4\"&gt;Good&lt;/option&gt;\n&#160;&#160;&#160;&#160;&#160;&#160;&lt;option value=\"3\"&gt;Okay&lt;/option&gt;\n&#160;&#160;&#160;&#160;&#160;&#160;&lt;option value=\"2\"&gt;Not great&lt;/option&gt;\n&#160;&#160;&#160;&#160;&#160;&#160;&lt;option value=\"1\"&gt;Bad&lt;/option&gt;\n&#160;&#160;&#160;&#160;&lt;/select&gt;\n&#160;&#160;&lt;/div&gt;\n\n&#160;&#160;&lt;div class=\"field\"&gt;\n&#160;&#160;&#160;&#160;&lt;label for=\"message\"&gt;Your feedback&lt;/label&gt;\n&#160;&#160;&#160;&#160;&lt;textarea id=\"message\" name=\"message\" rows=\"5\" required&gt;&lt;/textarea&gt;\n&#160;&#160;&lt;/div&gt;\n\n&#160;&#160;&lt;button type=\"submit\"&gt;Send feedback&lt;/button&gt;\n&lt;/form&gt;\u003C/code>\u003C/pre>\n\u003C/div>\n\u003Cp>Three details that beginners miss:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Every input has a matching \u003Ccode>&lt;label for&gt;\u003C/code>.\u003C/strong> Click the label, the input focuses. Screen readers read the label out loud. Skip this and the form fails accessibility and loses keyboard users.\u003C/li>\n\u003Cli>\u003Cstrong>\u003Ccode>name\u003C/code> attributes are not cosmetic.\u003C/strong> The server reads submissions by \u003Ccode>name\u003C/code>, so \u003Ccode>name=\"email\"\u003C/code> is what makes the email value reach your inbox. Missing \u003Ccode>name\u003C/code> = silent data loss.\u003C/li>\n\u003Cli>\u003Cstrong>\u003Ccode>autocomplete=\"name\"\u003C/code> and \u003Ccode>autocomplete=\"email\"\u003C/code>\u003C/strong> let browsers pre-fill from saved info. One line, measurable bump in completion.\u003C/li>\n\u003C/ul>\n\u003Cdiv class=\"fmstr-cmp-ffh-body__note\">\u003Cstrong>Note:\u003C/strong> \u003Ccode>novalidate\u003C/code> on the form tag turns off the browser's default error bubbles so you can show your own (covered in Step 4). Drop it if you want native validation only.\u003C/div>\n\n\u003Ch2 class=\"fmstr-cmp-ffh-body__h2\">Step 3: Style it with CSS\u003C/h2>\n\u003Cp>Paste this inside \u003Ccode>&lt;head&gt;\u003C/code> between \u003Ccode>&lt;title&gt;\u003C/code> and the closing \u003Ccode>&lt;/head&gt;\u003C/code>:\u003C/p>\n\u003Cdiv class=\"fmstr-cmp-ffh-body__code\">\u003Cspan class=\"lang\">CSS\u003C/span>\n\u003Cpre>\u003Ccode>&lt;style&gt;\n&#160;&#160;body {\n&#160;&#160;&#160;&#160;font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n&#160;&#160;&#160;&#160;background: #f7f7f9;\n&#160;&#160;&#160;&#160;margin: 0;\n&#160;&#160;&#160;&#160;padding: 40px 16px;\n&#160;&#160;&#160;&#160;color: #1a1a1a;\n&#160;&#160;}\n&#160;&#160;h1 { font-size: 1.5rem; margin: 0 0 24px; text-align: center; }\n&#160;&#160;form {\n&#160;&#160;&#160;&#160;max-width: 480px;\n&#160;&#160;&#160;&#160;margin: 0 auto;\n&#160;&#160;&#160;&#160;background: #fff;\n&#160;&#160;&#160;&#160;padding: 24px;\n&#160;&#160;&#160;&#160;border-radius: 12px;\n&#160;&#160;&#160;&#160;box-shadow: 0 2px 12px rgba(0,0,0,0.06);\n&#160;&#160;}\n&#160;&#160;.field { margin-bottom: 16px; }\n&#160;&#160;label {\n&#160;&#160;&#160;&#160;display: block;\n&#160;&#160;&#160;&#160;font-weight: 600;\n&#160;&#160;&#160;&#160;font-size: 0.9rem;\n&#160;&#160;&#160;&#160;margin-bottom: 6px;\n&#160;&#160;}\n&#160;&#160;input, select, textarea {\n&#160;&#160;&#160;&#160;width: 100%;\n&#160;&#160;&#160;&#160;box-sizing: border-box;\n&#160;&#160;&#160;&#160;padding: 10px 12px;\n&#160;&#160;&#160;&#160;font: inherit;\n&#160;&#160;&#160;&#160;border: 1px solid #d0d0d6;\n&#160;&#160;&#160;&#160;border-radius: 8px;\n&#160;&#160;&#160;&#160;background: #fff;\n&#160;&#160;}\n&#160;&#160;input:focus, select:focus, textarea:focus {\n&#160;&#160;&#160;&#160;outline: 2px solid #5b6cff;\n&#160;&#160;&#160;&#160;outline-offset: 1px;\n&#160;&#160;&#160;&#160;border-color: #5b6cff;\n&#160;&#160;}\n&#160;&#160;input[aria-invalid=\"true\"],\n&#160;&#160;select[aria-invalid=\"true\"],\n&#160;&#160;textarea[aria-invalid=\"true\"] {\n&#160;&#160;&#160;&#160;border-color: #d33;\n&#160;&#160;}\n&#160;&#160;.error {\n&#160;&#160;&#160;&#160;display: block;\n&#160;&#160;&#160;&#160;color: #d33;\n&#160;&#160;&#160;&#160;font-size: 0.8rem;\n&#160;&#160;&#160;&#160;margin-top: 4px;\n&#160;&#160;&#160;&#160;min-height: 1em;\n&#160;&#160;}\n&#160;&#160;button {\n&#160;&#160;&#160;&#160;width: 100%;\n&#160;&#160;&#160;&#160;padding: 12px;\n&#160;&#160;&#160;&#160;background: #5b6cff;\n&#160;&#160;&#160;&#160;color: #fff;\n&#160;&#160;&#160;&#160;font-weight: 600;\n&#160;&#160;&#160;&#160;border: none;\n&#160;&#160;&#160;&#160;border-radius: 8px;\n&#160;&#160;&#160;&#160;cursor: pointer;\n&#160;&#160;}\n&#160;&#160;button:hover { background: #4a59e0; }\n&lt;/style&gt;\u003C/code>\u003C/pre>\n\u003C/div>\n\u003Cp>Two things this stylesheet does that the typical tutorial skips:\u003C/p>\n\u003Cul>\n\u003Cli>Keeps the focus outline visible. Default focus styles are ugly, so most tutorials remove them. Removing them breaks keyboard users. Replace, don't remove.\u003C/li>\n\u003Cli>Uses \u003Ccode>system-ui\u003C/code> for fonts, so the form inherits the host site's native typography on macOS, Windows, iOS, and Android without shipping a font file.\u003C/li>\n\u003C/ul>\n\n\u003Ch2 class=\"fmstr-cmp-ffh-body__h2\">Step 4: Add accessible JavaScript validation\u003C/h2>\n\u003Cp>The alert-on-submit pattern works but it's the worst possible UX. This version shows inline errors, marks invalid fields for screen readers with \u003Ccode>aria-invalid\u003C/code>, and keeps focus where the user can fix the problem.\u003C/p>\n\u003Cp>Paste this right before \u003Ccode>&lt;/body&gt;\u003C/code>:\u003C/p>\n\u003Cdiv class=\"fmstr-cmp-ffh-body__code\">\u003Cspan class=\"lang\">JavaScript\u003C/span>\n\u003Cpre>\u003Ccode>&lt;script&gt;\n&#160;&#160;const form = document.getElementById('feedback-form');\n\n&#160;&#160;function setError(input, message) {\n&#160;&#160;&#160;&#160;input.setAttribute('aria-invalid', 'true');\n&#160;&#160;&#160;&#160;let errorEl = input.parentElement.querySelector('.error');\n&#160;&#160;&#160;&#160;if (!errorEl) {\n&#160;&#160;&#160;&#160;&#160;&#160;errorEl = document.createElement('span');\n&#160;&#160;&#160;&#160;&#160;&#160;errorEl.className = 'error';\n&#160;&#160;&#160;&#160;&#160;&#160;errorEl.id = input.id + '-error';\n&#160;&#160;&#160;&#160;&#160;&#160;input.parentElement.appendChild(errorEl);\n&#160;&#160;&#160;&#160;}\n&#160;&#160;&#160;&#160;errorEl.textContent = message;\n&#160;&#160;&#160;&#160;input.setAttribute('aria-describedby', errorEl.id);\n&#160;&#160;}\n\n&#160;&#160;function clearError(input) {\n&#160;&#160;&#160;&#160;input.setAttribute('aria-invalid', 'false');\n&#160;&#160;&#160;&#160;const errorEl = input.parentElement.querySelector('.error');\n&#160;&#160;&#160;&#160;if (errorEl) errorEl.textContent = '';\n&#160;&#160;}\n\n&#160;&#160;form.addEventListener('submit', function (event) {\n&#160;&#160;&#160;&#160;let firstInvalid = null;\n\n&#160;&#160;&#160;&#160;[...form.querySelectorAll('input, select, textarea')].forEach((input) =&gt; {\n&#160;&#160;&#160;&#160;&#160;&#160;clearError(input);\n&#160;&#160;&#160;&#160;&#160;&#160;if (!input.value.trim()) {\n&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setError(input, 'This field is required.');\n&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;firstInvalid = firstInvalid || input;\n&#160;&#160;&#160;&#160;&#160;&#160;} else if (input.type === 'email' &amp;&amp; !/^\\S+@\\S+\\.\\S+$/.test(input.value)) {\n&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setError(input, 'Enter a valid email address.');\n&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;firstInvalid = firstInvalid || input;\n&#160;&#160;&#160;&#160;&#160;&#160;}\n&#160;&#160;&#160;&#160;});\n\n&#160;&#160;&#160;&#160;if (firstInvalid) {\n&#160;&#160;&#160;&#160;&#160;&#160;event.preventDefault();\n&#160;&#160;&#160;&#160;&#160;&#160;firstInvalid.focus();\n&#160;&#160;&#160;&#160;}\n&#160;&#160;});\n&lt;/script&gt;\u003C/code>\u003C/pre>\n\u003C/div>\n\u003Cp>What this does that the original snippet missed:\u003C/p>\n\u003Cul>\n\u003Cli>Sets \u003Ccode>aria-invalid=\"true\"\u003C/code> and \u003Ccode>aria-describedby\u003C/code> so screen readers announce the error.\u003C/li>\n\u003Cli>Inserts the error message next to the field, not in a modal.\u003C/li>\n\u003Cli>Focuses the first invalid field on failed submit, so a keyboard user lands exactly where they need to fix.\u003C/li>\n\u003Cli>Doesn't trust the email regex to be perfect (it isn't); always re-validate on the server.\u003C/li>\n\u003C/ul>\n\u003Cdiv class=\"fmstr-cmp-ffh-body__note\">\u003Cstrong>Rule of thumb:\u003C/strong> client-side validation is for UX. Server-side validation is for trust. Do both.\u003C/div>\n\n\u003Ch2 class=\"fmstr-cmp-ffh-body__h2\">Step 5: Test the form locally\u003C/h2>\n\u003Cp>Open \u003Ccode>feedback.html\u003C/code> in a browser. Run this checklist:\u003C/p>\n\u003Cul>\n\u003Cli>Tab through every field with the keyboard. Focus should be visible at every stop.\u003C/li>\n\u003Cli>Try to submit empty. You should see inline error messages, focus should jump to the first empty field.\u003C/li>\n\u003Cli>Type a malformed email. You should see \"Enter a valid email address.\"\u003C/li>\n\u003Cli>Open the browser's network tab, submit a valid form. You should see a POST to \u003Ccode>/submit-feedback\u003C/code>. That request will currently 404 because you don't have a backend yet. Step 6 fixes that.\u003C/li>\n\u003C/ul>\n\u003Cp>If you want to skip the backend setup entirely, the next step shows the \u003Ca href=\"https://formester.com/features/html-form-backend/\">Formester HTML form backend\u003C/a> path: change one \u003Ccode>action\u003C/code> attribute and your form starts collecting submissions.\u003C/p>\n\n\u003Ch2 class=\"fmstr-cmp-ffh-body__h2\" id=\"step-6-backend\">Step 6: Wire up a backend that stores submissions\u003C/h2>\n\u003Cp>A feedback form without a backend is a dead form. The browser POSTs the data, the server returns 404, the user sees an error page, the feedback is gone. You have three real options, compared side-by-side below.\u003C/p>\n\n\u003C/div>\n\u003C/section>\n\n\u003Cstyle>\n/* host-link-override */\n.fmstr-cmp-ffh-back a { text-decoration: none !important; }\n.fmstr-cmp-ffh-back {\n--fmstr-cmp-ffh-back-bg-card: #ffffff;\n--fmstr-cmp-ffh-back-bg-code: #0f172a;\n--fmstr-cmp-ffh-back-fg-1: #101828;\n--fmstr-cmp-ffh-back-fg-2: #475467;\n--fmstr-cmp-ffh-back-fg-3: #697586;\n--fmstr-cmp-ffh-back-violet-500: #7f56d9;\n--fmstr-cmp-ffh-back-violet-600: #6941c6;\n--fmstr-cmp-ffh-back-tint: #f7f3ff;\n--fmstr-cmp-ffh-back-edge: #e4d7ff;\n--fmstr-cmp-ffh-back-border: #eaecf0;\n--fmstr-cmp-ffh-back-red: #dc2626;\n--fmstr-cmp-ffh-back-red-bg: #fef2f2;\n--fmstr-cmp-ffh-back-red-edge: #fecaca;\n--fmstr-cmp-ffh-back-amber: #d97706;\n--fmstr-cmp-ffh-back-amber-bg: #fffbeb;\n--fmstr-cmp-ffh-back-amber-edge: #fde68a;\n--fmstr-cmp-ffh-back-green: #15803d;\n--fmstr-cmp-ffh-back-green-bg: #f0fdf4;\n--fmstr-cmp-ffh-back-green-edge: #bbf7d0;\n--fmstr-cmp-ffh-back-code-fg: #e2e8f0;\n--fmstr-cmp-ffh-back-shadow: 0 4px 20px rgba(16,24,40,.06), 0 2px 6px rgba(16,24,40,.04);\n\nbackground: transparent; padding: 56px 24px;\nfont-family: inherit; color: var(--fmstr-cmp-ffh-back-fg-1);\n}\n.fmstr-cmp-ffh-back *, .fmstr-cmp-ffh-back *::before, .fmstr-cmp-ffh-back *::after { box-sizing: border-box; }\n.fmstr-cmp-ffh-back__container { max-width: 820px; margin: 0 auto; }\n.fmstr-cmp-ffh-back__head { margin: 0 0 28px; }\n.fmstr-cmp-ffh-back__eyebrow {\ndisplay: inline-block; padding: 5px 12px; border-radius: 9999px;\nbackground: var(--fmstr-cmp-ffh-back-tint); color: var(--fmstr-cmp-ffh-back-violet-600);\nfont-size: 12px; font-weight: 600; letter-spacing: .04em;\ntext-transform: uppercase; border: 1px solid var(--fmstr-cmp-ffh-back-edge); margin: 0 0 14px;\n}\n.fmstr-cmp-ffh-back__h2 { font-size: clamp(26px, 3vw, 36px); font-weight: 700; line-height: 1.15; letter-spacing: -.02em; margin: 0; }\n.fmstr-cmp-ffh-back__intro { color: var(--fmstr-cmp-ffh-back-fg-3); font-size: 17px; line-height: 1.6; margin: 14px 0 0; }\n\n.fmstr-cmp-ffh-back__grid { display: grid; grid-template-columns: 1fr; gap: 16px; }\n.fmstr-cmp-ffh-back__card {\nbackground: var(--fmstr-cmp-ffh-back-bg-card);\nborder: 1px solid var(--fmstr-cmp-ffh-back-border);\nborder-radius: 18px; padding: 24px 26px; display: flex; flex-direction: column; gap: 16px;\nbox-shadow: var(--fmstr-cmp-ffh-back-shadow); position: relative;\n}\n.fmstr-cmp-ffh-back__card--red { border-top: 4px solid var(--fmstr-cmp-ffh-back-red); }\n.fmstr-cmp-ffh-back__card--amber { border-top: 4px solid var(--fmstr-cmp-ffh-back-amber); }\n.fmstr-cmp-ffh-back__card--green { border-top: 4px solid var(--fmstr-cmp-ffh-back-violet-500); background: linear-gradient(180deg, #fdfbff 0%, #fff 60%); }\n\n.fmstr-cmp-ffh-back__verdict {\ndisplay: inline-flex; align-items: center; gap: 8px; align-self: flex-start;\npadding: 5px 12px; border-radius: 9999px; font-size: 11.5px; font-weight: 700;\nletter-spacing: .04em; text-transform: uppercase;\n}\n.fmstr-cmp-ffh-back__verdict--red { background: var(--fmstr-cmp-ffh-back-red-bg); color: var(--fmstr-cmp-ffh-back-red); border: 1px solid var(--fmstr-cmp-ffh-back-red-edge); }\n.fmstr-cmp-ffh-back__verdict--amber { background: var(--fmstr-cmp-ffh-back-amber-bg); color: var(--fmstr-cmp-ffh-back-amber); border: 1px solid var(--fmstr-cmp-ffh-back-amber-edge); }\n.fmstr-cmp-ffh-back__verdict--green { background: var(--fmstr-cmp-ffh-back-tint); color: var(--fmstr-cmp-ffh-back-violet-600); border: 1px solid var(--fmstr-cmp-ffh-back-edge); }\n\n.fmstr-cmp-ffh-back__name { font-size: 19px; font-weight: 700; margin: 0; letter-spacing: -.01em; color: var(--fmstr-cmp-ffh-back-fg-1); }\n.fmstr-cmp-ffh-back__sub { font-size: 13.5px; color: var(--fmstr-cmp-ffh-back-fg-3); margin: -8px 0 0; line-height: 1.5; }\n\n.fmstr-cmp-ffh-back__code {\nbackground: var(--fmstr-cmp-ffh-back-bg-code);\nborder-radius: 10px; padding: 14px 16px;\nfont-family: ui-monospace, Menlo, Monaco, monospace;\nfont-size: 12px; line-height: 1.55;\ncolor: var(--fmstr-cmp-ffh-back-code-fg);\noverflow-x: auto; margin: 0; white-space: pre;\n}\n.fmstr-cmp-ffh-back__code code { font-family: inherit; }\n.fmstr-cmp-ffh-back__code .t { color: #f472b6; }\n.fmstr-cmp-ffh-back__code .a { color: #a5b4fc; }\n.fmstr-cmp-ffh-back__code .s { color: #86efac; }\n.fmstr-cmp-ffh-back__code .c { color: #64748b; font-style: italic; }\n\n.fmstr-cmp-ffh-back__list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 8px; }\n.fmstr-cmp-ffh-back__row { display: flex; gap: 10px; font-size: 14px; line-height: 1.5; color: var(--fmstr-cmp-ffh-back-fg-2); }\n.fmstr-cmp-ffh-back__row::before {\ncontent: \"\"; width: 16px; height: 16px; border-radius: 50%; flex-shrink: 0; margin-top: 3px;\nbackground-repeat: no-repeat; background-position: center;\n}\n.fmstr-cmp-ffh-back__row--bad::before { background-color: var(--fmstr-cmp-ffh-back-red-bg); background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 10 10' fill='none' stroke='%23dc2626' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M2 2 L8 8 M8 2 L2 8'/%3E%3C/svg%3E\"); }\n.fmstr-cmp-ffh-back__row--meh::before { background-color: var(--fmstr-cmp-ffh-back-amber-bg); background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 10 10' fill='none' stroke='%23d97706' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M2 5 L8 5'/%3E%3C/svg%3E\"); }\n.fmstr-cmp-ffh-back__row--good::before { background-color: var(--fmstr-cmp-ffh-back-green-bg); background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 10 10' fill='none' stroke='%2315803d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 5 L4 7 L8 3'/%3E%3C/svg%3E\"); }\n.fmstr-cmp-ffh-back__row strong { color: var(--fmstr-cmp-ffh-back-fg-1); font-weight: 600; }\n\n.fmstr-cmp-ffh-back__cta {\nmargin-top: auto; padding-top: 4px;\ndisplay: inline-flex; align-items: center; gap: 8px;\ncolor: var(--fmstr-cmp-ffh-back-violet-600) !important;\nfont-weight: 600; font-size: 14.5px;\ntext-decoration: none !important;\n}\n.fmstr-cmp-ffh-back__cta:hover { text-decoration: underline !important; }\n\n@media (max-width: 760px) {\n.fmstr-cmp-ffh-back { padding: 40px 16px; }\n.fmstr-cmp-ffh-back__card { padding: 22px; }\n.fmstr-cmp-ffh-back__intro { font-size: 15.5px; }\n.fmstr-cmp-ffh-back__code { font-size: 11.5px; padding: 12px 14px; }\n}\n\u003C/style>\n\n\u003Csection class=\"fmstr-cmp-ffh-back\" aria-labelledby=\"fmstr-cmp-ffh-back-h2\">\n\u003Cdiv class=\"fmstr-cmp-ffh-back__container\">\n\u003Cdiv class=\"fmstr-cmp-ffh-back__head\">\n\u003Cspan class=\"fmstr-cmp-ffh-back__eyebrow\">Three honest paths\u003C/span>\n\u003Ch2 class=\"fmstr-cmp-ffh-back__h2\" id=\"fmstr-cmp-ffh-back-h2\">What happens after the user clicks Submit\u003C/h2>\n\u003Cp class=\"fmstr-cmp-ffh-back__intro\">Without a backend, a feedback form is a dead form. The browser POSTs the data, the server returns 404, the user sees an error page. Here are the three real options, ranked by how much pain each one ships with.\u003C/p>\n\u003C/div>\n\n\u003Cdiv class=\"fmstr-cmp-ffh-back__grid\">\n\n\u003Carticle class=\"fmstr-cmp-ffh-back__card fmstr-cmp-ffh-back__card--red\">\n\u003Cspan class=\"fmstr-cmp-ffh-back__verdict fmstr-cmp-ffh-back__verdict--red\">Don&rsquo;t ship this\u003C/span>\n\u003Ch3 class=\"fmstr-cmp-ffh-back__name\">Path 1: \u003Ccode>mailto:\u003C/code>\u003C/h3>\n\u003Cp class=\"fmstr-cmp-ffh-back__sub\">The \"no server\" hack that loses about half your submissions.\u003C/p>\n\u003Cpre class=\"fmstr-cmp-ffh-back__code\">\u003Ccode>\u003Cspan class=\"c\">&lt;!-- Opens the user's mail client --&gt;\u003C/span>\n\u003Cspan class=\"t\">&lt;form\u003C/span>\n\u003Cspan class=\"a\">action\u003C/span>=\u003Cspan class=\"s\">\"mailto:you@example.com\"\u003C/span>\n\u003Cspan class=\"a\">method\u003C/span>=\u003Cspan class=\"s\">\"post\"\u003C/span>\n\u003Cspan class=\"a\">enctype\u003C/span>=\u003Cspan class=\"s\">\"text/plain\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>\u003C/code>\u003C/pre>\n\u003Cul class=\"fmstr-cmp-ffh-back__list\">\n\u003Cli class=\"fmstr-cmp-ffh-back__row fmstr-cmp-ffh-back__row--bad\">\u003Cspan>\u003Cstrong>User-action required.\u003C/strong> Browser opens a draft email. They have to click Send manually. Half won&rsquo;t.\u003C/span>\u003C/li>\n\u003Cli class=\"fmstr-cmp-ffh-back__row fmstr-cmp-ffh-back__row--bad\">\u003Cspan>\u003Cstrong>Breaks on mobile.\u003C/strong> Many phones have no configured mail client.\u003C/span>\u003C/li>\n\u003Cli class=\"fmstr-cmp-ffh-back__row fmstr-cmp-ffh-back__row--bad\">\u003Cspan>\u003Cstrong>Spam-filter bait.\u003C/strong> Resulting messages are unsigned and easy to flag.\u003C/span>\u003C/li>\n\u003C/ul>\n\u003C/article>\n\n\u003Carticle class=\"fmstr-cmp-ffh-back__card fmstr-cmp-ffh-back__card--amber\">\n\u003Cspan class=\"fmstr-cmp-ffh-back__verdict fmstr-cmp-ffh-back__verdict--amber\">You&rsquo;ll maintain it\u003C/span>\n\u003Ch3 class=\"fmstr-cmp-ffh-back__name\">Path 2: Your own server\u003C/h3>\n\u003Cp class=\"fmstr-cmp-ffh-back__sub\">PHP, Node, or whatever you already run. Full control, full ownership.\u003C/p>\n\u003Cpre class=\"fmstr-cmp-ffh-back__code\">\u003Ccode>\u003Cspan class=\"c\">// minimal Node/Express receiver\u003C/span>\napp.\u003Cspan class=\"t\">post\u003C/span>(\u003Cspan class=\"s\">'/submit-feedback'\u003C/span>, (req, res) =&gt; {\n\u003Cspan class=\"t\">const\u003C/span> { name, email, message } = req.body;\n\u003Cspan class=\"t\">if\u003C/span> (!validate(email)) \u003Cspan class=\"t\">return\u003C/span> res.\u003Cspan class=\"t\">status\u003C/span>(400);\ndb.\u003Cspan class=\"t\">insert\u003C/span>({ name, email, message });\nres.\u003Cspan class=\"t\">redirect\u003C/span>(\u003Cspan class=\"s\">'/thank-you'\u003C/span>);\n});\u003C/code>\u003C/pre>\n\u003Cul class=\"fmstr-cmp-ffh-back__list\">\n\u003Cli class=\"fmstr-cmp-ffh-back__row fmstr-cmp-ffh-back__row--meh\">\u003Cspan>\u003Cstrong>You own the server.\u003C/strong> Hosting, TLS, scaling, uptime monitoring are yours.\u003C/span>\u003C/li>\n\u003Cli class=\"fmstr-cmp-ffh-back__row fmstr-cmp-ffh-back__row--meh\">\u003Cspan>\u003Cstrong>Spam protection is on you.\u003C/strong> Honeypot, rate limiting, CAPTCHA, all DIY.\u003C/span>\u003C/li>\n\u003Cli class=\"fmstr-cmp-ffh-back__row fmstr-cmp-ffh-back__row--good\">\u003Cspan>\u003Cstrong>Maximum control.\u003C/strong> Custom logic, database, queues, webhooks however you want.\u003C/span>\u003C/li>\n\u003C/ul>\n\u003C/article>\n\n\u003Carticle class=\"fmstr-cmp-ffh-back__card fmstr-cmp-ffh-back__card--green\">\n\u003Cspan class=\"fmstr-cmp-ffh-back__verdict fmstr-cmp-ffh-back__verdict--green\">Skip the server\u003C/span>\n\u003Ch3 class=\"fmstr-cmp-ffh-back__name\">Path 3: Formester HTML form backend\u003C/h3>\n\u003Cp class=\"fmstr-cmp-ffh-back__sub\">One \u003Ccode>action\u003C/code> attribute swap. No server code, no infra.\u003C/p>\n\u003Cpre class=\"fmstr-cmp-ffh-back__code\">\u003Ccode>\u003Cspan class=\"c\">&lt;!-- The only change vs. Path 2 --&gt;\u003C/span>\n\u003Cspan class=\"t\">&lt;form\u003C/span>\n\u003Cspan class=\"a\">action\u003C/span>=\u003Cspan class=\"s\">\"https://app.formester.com/\u003C/span>\n\u003Cspan class=\"s\">    api/v1/forms/YOUR_ID/submissions\"\u003C/span>\n\u003Cspan class=\"a\">method\u003C/span>=\u003Cspan class=\"s\">\"post\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>\u003C/code>\u003C/pre>\n\u003Cul class=\"fmstr-cmp-ffh-back__list\">\n\u003Cli class=\"fmstr-cmp-ffh-back__row fmstr-cmp-ffh-back__row--good\">\u003Cspan>\u003Cstrong>Submissions land in the dashboard.\u003C/strong> View, filter, \u003Ca href=\"https://formester.com/features/export-form-submission-pdf/\">export to PDF\u003C/a>, push to Sheets/Slack/HubSpot.\u003C/span>\u003C/li>\n\u003Cli class=\"fmstr-cmp-ffh-back__row fmstr-cmp-ffh-back__row--good\">\u003Cspan>\u003Cstrong>Spam protection built in.\u003C/strong> Honeypot plus \u003Ca href=\"https://formester.com/features/spam-protection/\">reCAPTCHA-style checks\u003C/a> on every submission.\u003C/span>\u003C/li>\n\u003Cli class=\"fmstr-cmp-ffh-back__row fmstr-cmp-ffh-back__row--good\">\u003Cspan>\u003Cstrong>Free for 100 submissions/month.\u003C/strong> Email notifications, dashboard, integrations included. Used by 56,000+ teams.\u003C/span>\u003C/li>\n\u003C/ul>\n\u003Ca class=\"fmstr-cmp-ffh-back__cta\" href=\"https://formester.com/features/html-form-backend/\">See the HTML form backend &rarr;\u003C/a>\n\u003C/article>\n\n\u003C/div>\n\u003C/div>\n\u003C/section>\n\n\u003Cstyle>\n/* host-link-override */\n.fmstr-cmp-ffh-code a { text-decoration: none !important; }\n.fmstr-cmp-ffh-code {\n--fmstr-cmp-ffh-code-bg-card: #ffffff;\n--fmstr-cmp-ffh-code-bg-code: #0f172a;\n--fmstr-cmp-ffh-code-bg-preview: #f7f7f9;\n--fmstr-cmp-ffh-code-fg-1: #101828;\n--fmstr-cmp-ffh-code-fg-2: #475467;\n--fmstr-cmp-ffh-code-fg-3: #697586;\n--fmstr-cmp-ffh-code-violet-500: #7f56d9;\n--fmstr-cmp-ffh-code-violet-600: #6941c6;\n--fmstr-cmp-ffh-code-tint: #f7f3ff;\n--fmstr-cmp-ffh-code-edge: #e4d7ff;\n--fmstr-cmp-ffh-code-border: #eaecf0;\n--fmstr-cmp-ffh-code-code-fg: #e2e8f0;\n--fmstr-cmp-ffh-code-code-tag: #f472b6;\n--fmstr-cmp-ffh-code-code-attr: #a5b4fc;\n--fmstr-cmp-ffh-code-code-str: #86efac;\n--fmstr-cmp-ffh-code-code-comment: #64748b;\n--fmstr-cmp-ffh-code-shadow: 0 4px 20px rgba(16,24,40,.06), 0 2px 6px rgba(16,24,40,.04);\n\nbackground: transparent; padding: 56px 24px;\nfont-family: inherit; color: var(--fmstr-cmp-ffh-code-fg-1);\n}\n.fmstr-cmp-ffh-code *, .fmstr-cmp-ffh-code *::before, .fmstr-cmp-ffh-code *::after { box-sizing: border-box; }\n.fmstr-cmp-ffh-code__container { max-width: 820px; margin: 0 auto; }\n.fmstr-cmp-ffh-code__head { max-width: 780px; margin: 0 0 32px; }\n.fmstr-cmp-ffh-code__eyebrow {\ndisplay: inline-block; padding: 5px 12px; border-radius: 9999px;\nbackground: var(--fmstr-cmp-ffh-code-tint); color: var(--fmstr-cmp-ffh-code-violet-600);\nfont-size: 12px; font-weight: 600; letter-spacing: .04em;\ntext-transform: uppercase; border: 1px solid var(--fmstr-cmp-ffh-code-edge); margin: 0 0 14px;\n}\n.fmstr-cmp-ffh-code__h2 { font-size: clamp(26px, 3vw, 36px); font-weight: 700; line-height: 1.15; letter-spacing: -.02em; margin: 0; }\n.fmstr-cmp-ffh-code__intro { color: var(--fmstr-cmp-ffh-code-fg-3); font-size: 17px; line-height: 1.6; margin: 14px 0 0; }\n\n.fmstr-cmp-ffh-code__grid {\ndisplay: grid; grid-template-columns: 1fr; gap: 0;\nbackground: var(--fmstr-cmp-ffh-code-bg-card);\nborder: 1px solid var(--fmstr-cmp-ffh-code-border);\nborder-radius: 20px; overflow: hidden;\nbox-shadow: var(--fmstr-cmp-ffh-code-shadow);\n}\n\n.fmstr-cmp-ffh-code__preview-pane {\nbackground: var(--fmstr-cmp-ffh-code-bg-preview);\npadding: 28px 24px;\ndisplay: flex; flex-direction: column; gap: 14px;\nborder-bottom: 1px solid var(--fmstr-cmp-ffh-code-border);\n}\n.fmstr-cmp-ffh-code__preview-label {\nfont-size: 11px; font-weight: 700; letter-spacing: .08em;\ntext-transform: uppercase; color: var(--fmstr-cmp-ffh-code-fg-3);\ndisplay: flex; align-items: center; gap: 8px;\n}\n.fmstr-cmp-ffh-code__preview-label::before {\ncontent: \"\"; width: 8px; height: 8px; border-radius: 50%;\nbackground: #22c55e; flex-shrink: 0;\n}\n.fmstr-cmp-ffh-code__preview-form {\nbackground: #fff; padding: 22px 20px; border-radius: 12px;\nbox-shadow: 0 2px 12px rgba(0,0,0,0.06);\ndisplay: flex; flex-direction: column; gap: 14px;\n}\n.fmstr-cmp-ffh-code__preview-h { font-size: 16px; font-weight: 700; text-align: center; margin: 0 0 4px; color: var(--fmstr-cmp-ffh-code-fg-1); }\n.fmstr-cmp-ffh-code__preview-field { display: flex; flex-direction: column; gap: 6px; }\n.fmstr-cmp-ffh-code__preview-label-row { font-size: 12.5px; font-weight: 600; color: var(--fmstr-cmp-ffh-code-fg-1); }\n.fmstr-cmp-ffh-code__preview-input {\nbackground: #fff; border: 1px solid #d0d0d6; border-radius: 8px;\npadding: 9px 11px; font-size: 12.5px; color: var(--fmstr-cmp-ffh-code-fg-3);\n}\n.fmstr-cmp-ffh-code__preview-input--focus { outline: 2px solid var(--fmstr-cmp-ffh-code-violet-500); outline-offset: 1px; border-color: var(--fmstr-cmp-ffh-code-violet-500); color: var(--fmstr-cmp-ffh-code-fg-1); }\n.fmstr-cmp-ffh-code__preview-select {\nbackground: #fff; border: 1px solid #d0d0d6; border-radius: 8px;\npadding: 9px 11px; font-size: 12.5px; color: var(--fmstr-cmp-ffh-code-fg-3);\ndisplay: flex; justify-content: space-between; align-items: center;\n}\n.fmstr-cmp-ffh-code__preview-textarea {\nbackground: #fff; border: 1px solid #d0d0d6; border-radius: 8px;\npadding: 9px 11px; font-size: 12.5px; color: var(--fmstr-cmp-ffh-code-fg-3);\nmin-height: 54px;\n}\n.fmstr-cmp-ffh-code__preview-btn {\nbackground: var(--fmstr-cmp-ffh-code-violet-500); color: #fff;\npadding: 10px; border-radius: 8px; text-align: center;\nfont-weight: 600; font-size: 13px; margin-top: 4px;\n}\n.fmstr-cmp-ffh-code__preview-caption {\nfont-size: 12px; color: var(--fmstr-cmp-ffh-code-fg-3); line-height: 1.5; margin: 4px 0 0;\n}\n\n.fmstr-cmp-ffh-code__code-pane {\nbackground: var(--fmstr-cmp-ffh-code-bg-code);\nposition: relative; max-height: 560px;\ndisplay: flex; flex-direction: column;\n}\n.fmstr-cmp-ffh-code__code-header {\ndisplay: flex; align-items: center; justify-content: space-between;\npadding: 14px 18px; border-bottom: 1px solid rgba(255,255,255,0.08);\ncolor: var(--fmstr-cmp-ffh-code-code-comment);\nfont-family: ui-monospace, Menlo, Monaco, monospace; font-size: 12px;\n}\n.fmstr-cmp-ffh-code__code-filename { display: flex; align-items: center; gap: 8px; }\n.fmstr-cmp-ffh-code__code-filename::before {\ncontent: \"\"; width: 10px; height: 10px; border-radius: 50%; background: #f87171;\nbox-shadow: 16px 0 0 #fbbf24, 32px 0 0 #34d399;\nmargin-right: 12px;\n}\n.fmstr-cmp-ffh-code__code-copy {\nbackground: rgba(127, 86, 217, 0.18) !important;\ncolor: #c4b5fd !important; border: 1px solid rgba(127, 86, 217, 0.4);\npadding: 6px 14px; border-radius: 6px; font-size: 12px; font-weight: 600;\ncursor: pointer; font-family: ui-monospace, Menlo, Monaco, monospace;\ndisplay: inline-flex; align-items: center; gap: 6px;\n}\n.fmstr-cmp-ffh-code__code-copy:hover { background: rgba(127, 86, 217, 0.28) !important; }\n.fmstr-cmp-ffh-code__code-body {\nmargin: 0; padding: 18px 20px;\nfont-family: ui-monospace, Menlo, Monaco, monospace;\nfont-size: 12.5px; line-height: 1.65;\ncolor: var(--fmstr-cmp-ffh-code-code-fg);\noverflow: auto; flex-grow: 1;\nwhite-space: pre;\nscrollbar-width: thin; scrollbar-color: rgba(167,139,250,.35) transparent;\n}\n.fmstr-cmp-ffh-code__code-body::-webkit-scrollbar { width: 10px; height: 10px; }\n.fmstr-cmp-ffh-code__code-body::-webkit-scrollbar-track { background: transparent; }\n.fmstr-cmp-ffh-code__code-body::-webkit-scrollbar-thumb { background: rgba(167,139,250,.3); border-radius: 5px; }\n.fmstr-cmp-ffh-code__code-body::-webkit-scrollbar-thumb:hover { background: rgba(167,139,250,.5); }\n.fmstr-cmp-ffh-code__code-body code { font-family: inherit; }\n.fmstr-cmp-ffh-code__tag { color: var(--fmstr-cmp-ffh-code-code-tag); }\n.fmstr-cmp-ffh-code__attr { color: var(--fmstr-cmp-ffh-code-code-attr); }\n.fmstr-cmp-ffh-code__str { color: var(--fmstr-cmp-ffh-code-code-str); }\n.fmstr-cmp-ffh-code__cmt { color: var(--fmstr-cmp-ffh-code-code-comment); font-style: italic; }\n\n.fmstr-cmp-ffh-code__foot {\nmargin: 20px auto 0; max-width: 780px; text-align: center;\ncolor: var(--fmstr-cmp-ffh-code-fg-3); font-size: 14.5px; line-height: 1.6;\n}\n.fmstr-cmp-ffh-code__foot a { color: var(--fmstr-cmp-ffh-code-violet-600) !important; font-weight: 600; }\n.fmstr-cmp-ffh-code__foot a:hover { text-decoration: underline !important; }\n\n@media (max-width: 760px) {\n.fmstr-cmp-ffh-code { padding: 40px 16px; }\n.fmstr-cmp-ffh-code__grid { border-radius: 16px; }\n.fmstr-cmp-ffh-code__preview-pane { padding: 22px 18px; }\n.fmstr-cmp-ffh-code__code-pane { max-height: 420px; }\n.fmstr-cmp-ffh-code__code-body { font-size: 11.5px; padding: 14px 16px; }\n.fmstr-cmp-ffh-code__intro { font-size: 15.5px; }\n}\n\u003C/style>\n\n\u003Csection class=\"fmstr-cmp-ffh-code\" aria-labelledby=\"fmstr-cmp-ffh-code-h2\">\n\u003Cdiv class=\"fmstr-cmp-ffh-code__container\">\n\u003Cdiv class=\"fmstr-cmp-ffh-code__head\">\n\u003Cspan class=\"fmstr-cmp-ffh-code__eyebrow\">Copy, paste, ship\u003C/span>\n\u003Ch2 class=\"fmstr-cmp-ffh-code__h2\" id=\"fmstr-cmp-ffh-code-h2\">The complete feedback form, in one file\u003C/h2>\n\u003Cp class=\"fmstr-cmp-ffh-code__intro\">Structure, styling, and accessible JavaScript validation in a single working file. Save as \u003Ccode>feedback.html\u003C/code>, swap the \u003Ccode>action\u003C/code> URL, and the form is live.\u003C/p>\n\u003C/div>\n\n\u003Cdiv class=\"fmstr-cmp-ffh-code__grid\">\n\u003Cdiv class=\"fmstr-cmp-ffh-code__preview-pane\">\n\u003Cdiv class=\"fmstr-cmp-ffh-code__preview-label\">Live preview\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-code__preview-form\">\n\u003Ch3 class=\"fmstr-cmp-ffh-code__preview-h\">Tell us what you think\u003C/h3>\n\u003Cdiv class=\"fmstr-cmp-ffh-code__preview-field\">\n\u003Cspan class=\"fmstr-cmp-ffh-code__preview-label-row\">Name\u003C/span>\n\u003Cdiv class=\"fmstr-cmp-ffh-code__preview-input\">Jane Doe\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-code__preview-field\">\n\u003Cspan class=\"fmstr-cmp-ffh-code__preview-label-row\">Email\u003C/span>\n\u003Cdiv class=\"fmstr-cmp-ffh-code__preview-input fmstr-cmp-ffh-code__preview-input--focus\">jane@example.com\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-code__preview-field\">\n\u003Cspan class=\"fmstr-cmp-ffh-code__preview-label-row\">How was your experience?\u003C/span>\n\u003Cdiv class=\"fmstr-cmp-ffh-code__preview-select\">\u003Cspan>Loved it\u003C/span>\u003Cspan>&#9662;\u003C/span>\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-code__preview-field\">\n\u003Cspan class=\"fmstr-cmp-ffh-code__preview-label-row\">Your feedback\u003C/span>\n\u003Cdiv class=\"fmstr-cmp-ffh-code__preview-textarea\">The dashboard is fast and the export to PDF saved my week.\u003C/div>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-code__preview-btn\">Send feedback\u003C/div>\n\u003C/div>\n\u003Cp class=\"fmstr-cmp-ffh-code__preview-caption\">Rendered output. Keyboard-accessible focus ring on the active field, inline error slot ready, mobile-friendly layout.\u003C/p>\n\u003C/div>\n\n\u003Cdiv class=\"fmstr-cmp-ffh-code__code-pane\">\n\u003Cdiv class=\"fmstr-cmp-ffh-code__code-header\">\n\u003Cspan class=\"fmstr-cmp-ffh-code__code-filename\">feedback.html\u003C/span>\n\u003Cbutton type=\"button\" class=\"fmstr-cmp-ffh-code__code-copy\" aria-label=\"Copy code\">Copy\u003C/button>\n\u003C/div>\n\u003Cpre class=\"fmstr-cmp-ffh-code__code-body\">\u003Ccode>\u003Cspan class=\"fmstr-cmp-ffh-code__cmt\">&lt;!DOCTYPE html&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;html\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">lang\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"en\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;head&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;meta\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">charset\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"UTF-8\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;meta\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">name\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"viewport\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">content\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"width=device-width, initial-scale=1.0\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;title&gt;\u003C/span>Feedback Form\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/title&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;style&gt;\u003C/span>\nbody { font-family: system-ui, sans-serif; background: #f7f7f9; padding: 40px 16px; }\nform { max-width: 480px; margin: 0 auto; background: #fff; padding: 24px; border-radius: 12px; }\n.field { margin-bottom: 16px; }\nlabel { display: block; font-weight: 600; margin-bottom: 6px; }\ninput, select, textarea { width: 100%; padding: 10px 12px; border: 1px solid #d0d0d6; border-radius: 8px; box-sizing: border-box; }\ninput:focus, select:focus, textarea:focus { outline: 2px solid #5b6cff; border-color: #5b6cff; }\n[aria-invalid=\"true\"] { border-color: #d33; }\n.error { display: block; color: #d33; font-size: 0.8rem; margin-top: 4px; }\nbutton { width: 100%; padding: 12px; background: #5b6cff; color: #fff; font-weight: 600; border: none; border-radius: 8px; cursor: pointer; }\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/style&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/head&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;body&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;h1&gt;\u003C/span>Tell us what you think\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/h1&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;form\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">id\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"feedback-form\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">action\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"https://app.formester.com/api/v1/forms/YOUR_FORM_ID/submissions\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">method\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"post\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">novalidate\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;div\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">class\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"field\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;label\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">for\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"name\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>Name\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/label&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;input\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">type\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"text\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">id\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"name\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">name\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"name\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">autocomplete\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"name\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">required\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/div&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;div\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">class\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"field\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;label\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">for\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"email\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>Email\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/label&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;input\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">type\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"email\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">id\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"email\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">name\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"email\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">autocomplete\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"email\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">required\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/div&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;div\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">class\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"field\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;label\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">for\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"rating\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>How was your experience?\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/label&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;select\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">id\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"rating\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">name\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"rating\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">required\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;option\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">value\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>Pick one\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/option&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;option\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">value\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"5\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>Loved it\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/option&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;option\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">value\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"3\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>Okay\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/option&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;option\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">value\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"1\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>Bad\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/option&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/select&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/div&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;div\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">class\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"field\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;label\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">for\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"message\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>Your feedback\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/label&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;textarea\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">id\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"message\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">name\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"message\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">rows\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"5\"\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">required\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;&lt;/textarea&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/div&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;button\u003C/span> \u003Cspan class=\"fmstr-cmp-ffh-code__attr\">type\u003C/span>=\u003Cspan class=\"fmstr-cmp-ffh-code__str\">\"submit\"\u003C/span>\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&gt;\u003C/span>Send feedback\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/button&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/form&gt;\u003C/span>\n\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;script&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__cmt\">// Accessible inline validation: aria-invalid, aria-describedby, focus management\u003C/span>\nconst form = document.getElementById(\u003Cspan class=\"fmstr-cmp-ffh-code__str\">'feedback-form'\u003C/span>);\nform.addEventListener(\u003Cspan class=\"fmstr-cmp-ffh-code__str\">'submit'\u003C/span>, (e) =&gt; {\nlet firstInvalid = null;\n[...form.querySelectorAll(\u003Cspan class=\"fmstr-cmp-ffh-code__str\">'input, select, textarea'\u003C/span>)].forEach((input) =&gt; {\nconst valid = input.value.trim() &amp;&amp; (input.type !== \u003Cspan class=\"fmstr-cmp-ffh-code__str\">'email'\u003C/span> || /^\\S+@\\S+\\.\\S+$/.test(input.value));\ninput.setAttribute(\u003Cspan class=\"fmstr-cmp-ffh-code__str\">'aria-invalid'\u003C/span>, valid ? \u003Cspan class=\"fmstr-cmp-ffh-code__str\">'false'\u003C/span> : \u003Cspan class=\"fmstr-cmp-ffh-code__str\">'true'\u003C/span>);\nif (!valid &amp;&amp; !firstInvalid) firstInvalid = input;\n});\nif (firstInvalid) { e.preventDefault(); firstInvalid.focus(); }\n});\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/script&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/body&gt;\u003C/span>\n\u003Cspan class=\"fmstr-cmp-ffh-code__tag\">&lt;/html&gt;\u003C/span>\u003C/code>\u003C/pre>\n\u003C/div>\n\u003C/div>\n\n\u003Cp class=\"fmstr-cmp-ffh-code__foot\">The \u003Ccode>action\u003C/code> URL above points to \u003Ca href=\"https://formester.com/features/html-form-backend/\">Formester&rsquo;s HTML form backend\u003C/a>. Replace \u003Ccode>YOUR_FORM_ID\u003C/code> with your form&rsquo;s ID, or point it at your own server. Everything else stays the same.\u003C/p>\n\u003C/div>\n\u003C/section>\n\n\u003Csection class=\"fmstr-cmp-ffh-body\" aria-label=\"Common mistakes and variants\">\n\u003Cdiv class=\"fmstr-cmp-ffh-body__container\">\n\n\u003Ch2 class=\"fmstr-cmp-ffh-body__h2\">Common mistakes that break feedback forms\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>mailto:\u003C/code> as the action.\u003C/strong> Looks like the easy answer. Drops half your submissions because the user has to manually send the draft. Use a real backend.\u003C/li>\n\u003Cli>\u003Cstrong>Missing \u003Ccode>name\u003C/code> attributes.\u003C/strong> The form POSTs successfully but the server gets empty fields. \u003Ccode>id\u003C/code> is for CSS and labels; \u003Ccode>name\u003C/code> is what the server reads.\u003C/li>\n\u003Cli>\u003Cstrong>Removed focus outlines.\u003C/strong> \u003Ccode>outline: none\u003C/code> is the most copy-pasted CSS mistake on the web. It breaks keyboard navigation. Replace the outline; don't delete it.\u003C/li>\n\u003Cli>\u003Cstrong>Client-side validation only.\u003C/strong> A user with DevTools open can submit anything. Validate on the server too.\u003C/li>\n\u003Cli>\u003Cstrong>No spam protection.\u003C/strong> Public forms attract bots within hours. Add a honeypot field (a hidden input that bots fill and humans don't) or a CAPTCHA. \u003Ca href=\"https://formester.com/features/spam-protection/\">Formester's backend\u003C/a> does this automatically.\u003C/li>\n\u003Cli>\u003Cstrong>No confirmation page or message.\u003C/strong> The user submits, the page reloads, nothing visibly changes. They submit again. Add a \u003Ccode>&lt;p role=\"status\"&gt;Thanks, we got it&lt;/p&gt;\u003C/code> or redirect to a thank-you page.\u003C/li>\n\u003C/ul>\n\n\u003Ch2 class=\"fmstr-cmp-ffh-body__h2\">Variants of the feedback form\u003C/h2>\n\u003Cp>The base form covers most cases. Three common variants:\u003C/p>\n\u003Cdiv class=\"fmstr-cmp-ffh-body__variants\">\n\u003Cdiv class=\"fmstr-cmp-ffh-body__variant\">\n\u003Ch4>Customer feedback (with rating)\u003C/h4>\n\u003Cp>Add a 1-5 star scale instead of the dropdown. The \u003Ccode>&lt;input type=\"range\"&gt;\u003C/code> works, but a row of radio buttons styled as stars is clearer for screen readers. The \u003Ca href=\"https://formester.com/templates/customer-feedback-form-31840/\">customer feedback form template\u003C/a> ships this layout pre-built.\u003C/p>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-body__variant\">\n\u003Ch4>Product feedback (with feature picker)\u003C/h4>\n\u003Cp>Add a checkbox group: \"Which features did you use?\" with options like Onboarding, Search, Reporting. Use \u003Ccode>&lt;fieldset&gt;&lt;legend&gt;\u003C/code> around the group so screen readers announce it as one question. The \u003Ca href=\"https://formester.com/templates/categories/feedback-forms/\">feedback form templates library\u003C/a> has a fuller version.\u003C/p>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-body__variant\">\n\u003Ch4>Employee feedback (anonymous)\u003C/h4>\n\u003Cp>Drop the name and email fields entirely. Add a \"Department\" dropdown and a longer text area. If you collect this through Formester, turn off IP tracking in the form settings to keep submissions genuinely anonymous. The \u003Ca href=\"https://formester.com/templates/categories/feedback-forms/\">employee feedback templates\u003C/a> are preconfigured for this.\u003C/p>\n\u003C/div>\n\u003C/div>\n\n\u003C/div>\n\u003C/section>\n\n\u003Cstyle>\n/* host-link-override */\n.fmstr-cmp-ffh-a11y a { text-decoration: none !important; }\n.fmstr-cmp-ffh-a11y {\n--fmstr-cmp-ffh-a11y-bg-card: #ffffff;\n--fmstr-cmp-ffh-a11y-bg-code: #0f172a;\n--fmstr-cmp-ffh-a11y-fg-1: #101828;\n--fmstr-cmp-ffh-a11y-fg-2: #475467;\n--fmstr-cmp-ffh-a11y-fg-3: #697586;\n--fmstr-cmp-ffh-a11y-violet-500: #7f56d9;\n--fmstr-cmp-ffh-a11y-violet-600: #6941c6;\n--fmstr-cmp-ffh-a11y-tint: #f7f3ff;\n--fmstr-cmp-ffh-a11y-edge: #e4d7ff;\n--fmstr-cmp-ffh-a11y-border: #eaecf0;\n--fmstr-cmp-ffh-a11y-red-bg: #fef2f2;\n--fmstr-cmp-ffh-a11y-red-edge: #fecaca;\n--fmstr-cmp-ffh-a11y-red: #b91c1c;\n--fmstr-cmp-ffh-a11y-green-bg: #f0fdf4;\n--fmstr-cmp-ffh-a11y-green-edge: #bbf7d0;\n--fmstr-cmp-ffh-a11y-green: #15803d;\n--fmstr-cmp-ffh-a11y-shadow: 0 4px 20px rgba(16,24,40,.06), 0 2px 6px rgba(16,24,40,.04);\n\nbackground: transparent; padding: 56px 24px;\nfont-family: inherit; color: var(--fmstr-cmp-ffh-a11y-fg-1);\n}\n.fmstr-cmp-ffh-a11y *, .fmstr-cmp-ffh-a11y *::before, .fmstr-cmp-ffh-a11y *::after { box-sizing: border-box; }\n.fmstr-cmp-ffh-a11y__container { max-width: 820px; margin: 0 auto; }\n.fmstr-cmp-ffh-a11y__head { margin: 0 0 28px; }\n.fmstr-cmp-ffh-a11y__eyebrow {\ndisplay: inline-block; padding: 5px 12px; border-radius: 9999px;\nbackground: var(--fmstr-cmp-ffh-a11y-tint); color: var(--fmstr-cmp-ffh-a11y-violet-600);\nfont-size: 12px; font-weight: 600; letter-spacing: .04em;\ntext-transform: uppercase; border: 1px solid var(--fmstr-cmp-ffh-a11y-edge); margin: 0 0 14px;\n}\n.fmstr-cmp-ffh-a11y__h2 { font-size: clamp(26px, 3vw, 36px); font-weight: 700; line-height: 1.15; letter-spacing: -.02em; margin: 0; }\n.fmstr-cmp-ffh-a11y__intro { color: var(--fmstr-cmp-ffh-a11y-fg-3); font-size: 17px; line-height: 1.6; margin: 14px 0 0; }\n\n.fmstr-cmp-ffh-a11y__list { display: flex; flex-direction: column; gap: 16px; }\n.fmstr-cmp-ffh-a11y__item {\nbackground: var(--fmstr-cmp-ffh-a11y-bg-card);\nborder: 1px solid var(--fmstr-cmp-ffh-a11y-border);\nborder-radius: 16px; padding: 22px 24px;\ndisplay: grid; grid-template-columns: 44px 1fr 1fr; gap: 20px; align-items: start;\nbox-shadow: var(--fmstr-cmp-ffh-a11y-shadow);\n}\n.fmstr-cmp-ffh-a11y__num {\nwidth: 36px; height: 36px; border-radius: 10px;\nbackground: var(--fmstr-cmp-ffh-a11y-tint);\ncolor: var(--fmstr-cmp-ffh-a11y-violet-600);\ndisplay: grid; place-items: center;\nfont-weight: 700; font-size: 15px;\nborder: 1px solid var(--fmstr-cmp-ffh-a11y-edge);\n}\n\n.fmstr-cmp-ffh-a11y__copy h3 {\nfont-size: 17px; font-weight: 600; letter-spacing: -.01em;\ncolor: var(--fmstr-cmp-ffh-a11y-fg-1); margin: 0 0 6px;\n}\n.fmstr-cmp-ffh-a11y__copy p { color: var(--fmstr-cmp-ffh-a11y-fg-2); font-size: 14.5px; line-height: 1.6; margin: 0; }\n.fmstr-cmp-ffh-a11y__copy strong { color: var(--fmstr-cmp-ffh-a11y-fg-1); font-weight: 600; }\n\n.fmstr-cmp-ffh-a11y__pair { display: flex; flex-direction: column; gap: 10px; }\n.fmstr-cmp-ffh-a11y__codebox {\nbackground: var(--fmstr-cmp-ffh-a11y-bg-code);\nborder-radius: 8px; padding: 10px 12px;\nfont-family: ui-monospace, Menlo, Monaco, monospace;\nfont-size: 11.5px; line-height: 1.55;\ncolor: #e2e8f0; overflow-x: auto; margin: 0;\nwhite-space: pre; position: relative; padding-left: 50px;\n}\n.fmstr-cmp-ffh-a11y__codebox code { font-family: inherit; }\n.fmstr-cmp-ffh-a11y__codebox::before {\ncontent: \"\"; position: absolute; left: 10px; top: 11px;\nwidth: 14px; height: 14px; border-radius: 50%;\nbackground-repeat: no-repeat; background-position: center;\n}\n.fmstr-cmp-ffh-a11y__codebox--bad::before { background-color: var(--fmstr-cmp-ffh-a11y-red-bg); background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8' fill='none' stroke='%23b91c1c' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M1.5 1.5 L6.5 6.5 M6.5 1.5 L1.5 6.5'/%3E%3C/svg%3E\"); }\n.fmstr-cmp-ffh-a11y__codebox--good::before { background-color: var(--fmstr-cmp-ffh-a11y-green-bg); background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='9' viewBox='0 0 9 9' fill='none' stroke='%2315803d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M1.5 4.5 L3.5 6.5 L7 3'/%3E%3C/svg%3E\"); }\n.fmstr-cmp-ffh-a11y__codebox-label {\nposition: absolute; top: 11px; left: 28px;\nfont-size: 9px; font-weight: 700; letter-spacing: .08em;\ntext-transform: uppercase;\n}\n.fmstr-cmp-ffh-a11y__codebox--bad .fmstr-cmp-ffh-a11y__codebox-label { color: var(--fmstr-cmp-ffh-a11y-red); }\n.fmstr-cmp-ffh-a11y__codebox--good .fmstr-cmp-ffh-a11y__codebox-label { color: var(--fmstr-cmp-ffh-a11y-green); }\n\n.fmstr-cmp-ffh-a11y__codebox .t { color: #f472b6; }\n.fmstr-cmp-ffh-a11y__codebox .a { color: #a5b4fc; }\n.fmstr-cmp-ffh-a11y__codebox .s { color: #86efac; }\n\n.fmstr-cmp-ffh-a11y__foot {\nmargin: 28px auto 0; max-width: 760px; text-align: center;\ncolor: var(--fmstr-cmp-ffh-a11y-fg-3); font-size: 14.5px; line-height: 1.6;\n}\n.fmstr-cmp-ffh-a11y__foot a { color: var(--fmstr-cmp-ffh-a11y-violet-600) !important; font-weight: 600; }\n.fmstr-cmp-ffh-a11y__foot a:hover { text-decoration: underline !important; }\n\n@media (max-width: 880px) {\n.fmstr-cmp-ffh-a11y__item { grid-template-columns: 36px 1fr; gap: 16px; }\n.fmstr-cmp-ffh-a11y__pair { grid-column: 1 / -1; }\n}\n@media (max-width: 760px) {\n.fmstr-cmp-ffh-a11y { padding: 40px 16px; }\n.fmstr-cmp-ffh-a11y__item { padding: 18px; border-radius: 14px; }\n.fmstr-cmp-ffh-a11y__intro { font-size: 15.5px; }\n.fmstr-cmp-ffh-a11y__codebox { font-size: 11px; }\n}\n\u003C/style>\n\n\u003Csection class=\"fmstr-cmp-ffh-a11y\" aria-labelledby=\"fmstr-cmp-ffh-a11y-h2\">\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__container\">\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__head\">\n\u003Cspan class=\"fmstr-cmp-ffh-a11y__eyebrow\">Five flags worth catching\u003C/span>\n\u003Ch2 class=\"fmstr-cmp-ffh-a11y__h2\" id=\"fmstr-cmp-ffh-a11y-h2\">Accessibility checklist for an HTML feedback form\u003C/h2>\n\u003Cp class=\"fmstr-cmp-ffh-a11y__intro\">Every item below is something keyboard and screen-reader users actually hit. Skip these and a measurable chunk of your audience can&rsquo;t complete the form.\u003C/p>\n\u003C/div>\n\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__list\">\n\n\u003Carticle class=\"fmstr-cmp-ffh-a11y__item\">\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__num\">1\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__copy\">\n\u003Ch3>Pair every label with its input\u003C/h3>\n\u003Cp>The label&rsquo;s \u003Ccode>for\u003C/code> must match the input&rsquo;s \u003Ccode>id\u003C/code>. Click the label, focus the input. Screen readers announce the label out loud. Skip this and the form fails WCAG 2.1 and loses keyboard users.\u003C/p>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__pair\">\n\u003Cpre class=\"fmstr-cmp-ffh-a11y__codebox fmstr-cmp-ffh-a11y__codebox--bad\">\u003Cspan class=\"fmstr-cmp-ffh-a11y__codebox-label\">No\u003C/span>\u003Ccode>\u003Cspan class=\"t\">&lt;label&gt;\u003C/span>Email\u003Cspan class=\"t\">&lt;/label&gt;\u003C/span>\n\u003Cspan class=\"t\">&lt;input\u003C/span> \u003Cspan class=\"a\">type\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>\u003C/code>\u003C/pre>\n\u003Cpre class=\"fmstr-cmp-ffh-a11y__codebox fmstr-cmp-ffh-a11y__codebox--good\">\u003Cspan class=\"fmstr-cmp-ffh-a11y__codebox-label\">Yes\u003C/span>\u003Ccode>\u003Cspan class=\"t\">&lt;label\u003C/span> \u003Cspan class=\"a\">for\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>Email\u003Cspan class=\"t\">&lt;/label&gt;\u003C/span>\n\u003Cspan class=\"t\">&lt;input\u003C/span> \u003Cspan class=\"a\">id\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span> \u003Cspan class=\"a\">type\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>\u003C/code>\u003C/pre>\n\u003C/div>\n\u003C/article>\n\n\u003Carticle class=\"fmstr-cmp-ffh-a11y__item\">\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__num\">2\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__copy\">\n\u003Ch3>Connect errors with \u003Ccode>aria-describedby\u003C/code>\u003C/h3>\n\u003Cp>An invalid field needs \u003Ccode>aria-invalid=\"true\"\u003C/code> plus an \u003Ccode>aria-describedby\u003C/code> that points at the visible error message. Screen readers then announce the error along with the field name on focus.\u003C/p>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__pair\">\n\u003Cpre class=\"fmstr-cmp-ffh-a11y__codebox fmstr-cmp-ffh-a11y__codebox--bad\">\u003Cspan class=\"fmstr-cmp-ffh-a11y__codebox-label\">No\u003C/span>\u003Ccode>\u003Cspan class=\"t\">&lt;input\u003C/span> \u003Cspan class=\"a\">id\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>\n\u003Cspan class=\"t\">&lt;span&gt;\u003C/span>Invalid email\u003Cspan class=\"t\">&lt;/span&gt;\u003C/span>\u003C/code>\u003C/pre>\n\u003Cpre class=\"fmstr-cmp-ffh-a11y__codebox fmstr-cmp-ffh-a11y__codebox--good\">\u003Cspan class=\"fmstr-cmp-ffh-a11y__codebox-label\">Yes\u003C/span>\u003Ccode>\u003Cspan class=\"t\">&lt;input\u003C/span> \u003Cspan class=\"a\">id\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span>\n\u003Cspan class=\"a\">aria-invalid\u003C/span>=\u003Cspan class=\"s\">\"true\"\u003C/span>\n\u003Cspan class=\"a\">aria-describedby\u003C/span>=\u003Cspan class=\"s\">\"email-error\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>\n\u003Cspan class=\"t\">&lt;span\u003C/span> \u003Cspan class=\"a\">id\u003C/span>=\u003Cspan class=\"s\">\"email-error\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>Invalid email\u003Cspan class=\"t\">&lt;/span&gt;\u003C/span>\u003C/code>\u003C/pre>\n\u003C/div>\n\u003C/article>\n\n\u003Carticle class=\"fmstr-cmp-ffh-a11y__item\">\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__num\">3\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__copy\">\n\u003Ch3>Use \u003Ccode>autocomplete\u003C/code> tokens\u003C/h3>\n\u003Cp>One line per field. Browsers prefill from saved info, password managers behave, and assistive tech recognizes the field&rsquo;s purpose. Measurable lift in completion rate on mobile.\u003C/p>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__pair\">\n\u003Cpre class=\"fmstr-cmp-ffh-a11y__codebox fmstr-cmp-ffh-a11y__codebox--bad\">\u003Cspan class=\"fmstr-cmp-ffh-a11y__codebox-label\">No\u003C/span>\u003Ccode>\u003Cspan class=\"t\">&lt;input\u003C/span> \u003Cspan class=\"a\">type\u003C/span>=\u003Cspan class=\"s\">\"text\"\u003C/span> \u003Cspan class=\"a\">name\u003C/span>=\u003Cspan class=\"s\">\"name\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>\n\u003Cspan class=\"t\">&lt;input\u003C/span> \u003Cspan class=\"a\">type\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span> \u003Cspan class=\"a\">name\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>\u003C/code>\u003C/pre>\n\u003Cpre class=\"fmstr-cmp-ffh-a11y__codebox fmstr-cmp-ffh-a11y__codebox--good\">\u003Cspan class=\"fmstr-cmp-ffh-a11y__codebox-label\">Yes\u003C/span>\u003Ccode>\u003Cspan class=\"t\">&lt;input\u003C/span> \u003Cspan class=\"a\">type\u003C/span>=\u003Cspan class=\"s\">\"text\"\u003C/span> \u003Cspan class=\"a\">name\u003C/span>=\u003Cspan class=\"s\">\"name\"\u003C/span>\n\u003Cspan class=\"a\">autocomplete\u003C/span>=\u003Cspan class=\"s\">\"name\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>\n\u003Cspan class=\"t\">&lt;input\u003C/span> \u003Cspan class=\"a\">type\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span> \u003Cspan class=\"a\">name\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span>\n\u003Cspan class=\"a\">autocomplete\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>\u003C/code>\u003C/pre>\n\u003C/div>\n\u003C/article>\n\n\u003Carticle class=\"fmstr-cmp-ffh-a11y__item\">\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__num\">4\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__copy\">\n\u003Ch3>Keep focus outlines visible\u003C/h3>\n\u003Cp>\u003Ccode>outline: none\u003C/code> is the single most-copied CSS mistake on the web. It breaks keyboard navigation. Replace the default outline, never delete it. The visible ring is how a sighted keyboard user knows where they are.\u003C/p>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__pair\">\n\u003Cpre class=\"fmstr-cmp-ffh-a11y__codebox fmstr-cmp-ffh-a11y__codebox--bad\">\u003Cspan class=\"fmstr-cmp-ffh-a11y__codebox-label\">No\u003C/span>\u003Ccode>input:focus { outline: none; }\u003C/code>\u003C/pre>\n\u003Cpre class=\"fmstr-cmp-ffh-a11y__codebox fmstr-cmp-ffh-a11y__codebox--good\">\u003Cspan class=\"fmstr-cmp-ffh-a11y__codebox-label\">Yes\u003C/span>\u003Ccode>input:focus {\noutline: 2px solid #5b6cff;\noutline-offset: 1px;\n}\u003C/code>\u003C/pre>\n\u003C/div>\n\u003C/article>\n\n\u003Carticle class=\"fmstr-cmp-ffh-a11y__item\">\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__num\">5\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__copy\">\n\u003Ch3>Mark required fields semantically\u003C/h3>\n\u003Cp>The native \u003Ccode>required\u003C/code> attribute does two jobs at once: it tells the browser to block submission and tells screen readers the field is required. Don&rsquo;t fake it with just a red asterisk in the label.\u003C/p>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-a11y__pair\">\n\u003Cpre class=\"fmstr-cmp-ffh-a11y__codebox fmstr-cmp-ffh-a11y__codebox--bad\">\u003Cspan class=\"fmstr-cmp-ffh-a11y__codebox-label\">No\u003C/span>\u003Ccode>\u003Cspan class=\"t\">&lt;label&gt;\u003C/span>Email \u003Cspan class=\"t\">&lt;span&gt;\u003C/span>*\u003Cspan class=\"t\">&lt;/span&gt;&lt;/label&gt;\u003C/span>\n\u003Cspan class=\"t\">&lt;input\u003C/span> \u003Cspan class=\"a\">type\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>\u003C/code>\u003C/pre>\n\u003Cpre class=\"fmstr-cmp-ffh-a11y__codebox fmstr-cmp-ffh-a11y__codebox--good\">\u003Cspan class=\"fmstr-cmp-ffh-a11y__codebox-label\">Yes\u003C/span>\u003Ccode>\u003Cspan class=\"t\">&lt;label\u003C/span> \u003Cspan class=\"a\">for\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>Email (required)\u003Cspan class=\"t\">&lt;/label&gt;\u003C/span>\n\u003Cspan class=\"t\">&lt;input\u003C/span> \u003Cspan class=\"a\">id\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span> \u003Cspan class=\"a\">type\u003C/span>=\u003Cspan class=\"s\">\"email\"\u003C/span> \u003Cspan class=\"a\">required\u003C/span>\u003Cspan class=\"t\">&gt;\u003C/span>\u003C/code>\u003C/pre>\n\u003C/div>\n\u003C/article>\n\n\u003C/div>\n\n\u003Cp class=\"fmstr-cmp-ffh-a11y__foot\">For edge cases (fieldsets, error summaries, custom controls), the \u003Ca href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/form\">MDN \u003Ccode>&lt;form&gt;\u003C/code> reference\u003C/a> is the canonical source.\u003C/p>\n\u003C/div>\n\u003C/section>\n\n\u003Cstyle>\n/* host-link-override */\n.fmstr-cmp-ffh-faq a { text-decoration: none !important; }\n.fmstr-cmp-ffh-faq {\n--c-bg: #fafafb; --c-card: #ffffff;\n--c-fg-1: #101828; --c-fg-2: #475467;\n--c-violet-600: #6941c6; --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);\n}\n.fmstr-cmp-ffh-faq *, .fmstr-cmp-ffh-faq *::before, .fmstr-cmp-ffh-faq *::after { box-sizing: border-box; }\n.fmstr-cmp-ffh-faq__container { max-width: 820px; margin: 0 auto; }\n.fmstr-cmp-ffh-faq__h2 { font-size: clamp(26px, 3vw, 36px); font-weight: 700; line-height: 1.15; letter-spacing: -.02em; margin: 0; color: var(--c-fg-1); }\n.fmstr-cmp-ffh-faq__intro { color: #697586; font-size: 17px; line-height: 1.6; margin: 14px 0 28px; max-width: 760px; }\n.fmstr-cmp-ffh-faq__list { display: flex; flex-direction: column; gap: 12px; }\n.fmstr-cmp-ffh-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-ffh-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-ffh-faq__item > summary::-webkit-details-marker { display: none; }\n.fmstr-cmp-ffh-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/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' 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'/%3E%3C/svg%3E\");\nbackground-repeat: no-repeat; background-position: center;\ntransition: transform .15s ease, background-color .15s ease;\n}\n.fmstr-cmp-ffh-faq__item[open] > summary::before { transform: rotate(180deg); background-color: var(--c-tint); }\n.fmstr-cmp-ffh-faq__item[open] > summary { color: var(--c-violet-600); }\n.fmstr-cmp-ffh-faq__answer { padding: 0 22px 22px 64px; color: var(--c-fg-2); font-size: 15.5px; line-height: 1.7; }\n.fmstr-cmp-ffh-faq__answer a { color: var(--c-violet-600) !important; text-decoration: none !important; }\n.fmstr-cmp-ffh-faq__answer a:hover { text-decoration: underline !important; }\n.fmstr-cmp-ffh-faq__answer code {\nbackground: var(--c-chip-bg); padding: 1px 6px; border-radius: 4px;\nfont-family: ui-monospace, Menlo, Monaco, monospace; font-size: 13.5px;\ncolor: var(--c-violet-600);\n}\n\n@media (max-width: 760px) {\n.fmstr-cmp-ffh-faq { padding: 40px 16px; }\n.fmstr-cmp-ffh-faq__intro { font-size: 15.5px; }\n.fmstr-cmp-ffh-faq__item > summary { padding: 16px 16px; font-size: 15.5px; gap: 12px; }\n.fmstr-cmp-ffh-faq__item > summary::before { width: 26px; height: 26px; }\n.fmstr-cmp-ffh-faq__answer { padding: 0 16px 18px 16px; font-size: 15px; line-height: 1.65; }\n}\n\u003C/style>\n\n\u003Csection class=\"fmstr-cmp-ffh-faq\" aria-labelledby=\"fmstr-cmp-ffh-faq-h2\">\n\u003Cdiv class=\"fmstr-cmp-ffh-faq__container\">\n\u003Ch2 class=\"fmstr-cmp-ffh-faq__h2\" id=\"fmstr-cmp-ffh-faq-h2\">HTML feedback form FAQ\u003C/h2>\n\u003Cp class=\"fmstr-cmp-ffh-faq__intro\">Answers that mirror the FAQPage JSON-LD on the live page.\u003C/p>\n\u003Cdiv class=\"fmstr-cmp-ffh-faq__list\">\n\n\u003Cdetails class=\"fmstr-cmp-ffh-faq__item\">\n\u003Csummary>How do you add a feedback form in HTML?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-ffh-faq__answer\">Use a \u003Ccode>&lt;form&gt;\u003C/code> element with \u003Ccode>action\u003C/code> set to your submission endpoint and \u003Ccode>method=\"post\"\u003C/code>. Inside the form, add labeled \u003Ccode>&lt;input&gt;\u003C/code> and \u003Ccode>&lt;textarea&gt;\u003C/code> elements with \u003Ccode>name\u003C/code> attributes. Style with CSS, validate with JavaScript, and point the \u003Ccode>action\u003C/code> at a backend (your server, or a service like \u003Ca href=\"https://formester.com/features/html-form-backend/\">Formester&rsquo;s HTML form backend\u003C/a>). The complete copy-paste example above is the shortest working version.\u003C/div>\n\u003C/details>\n\n\u003Cdetails class=\"fmstr-cmp-ffh-faq__item\">\n\u003Csummary>How do I create a feedback form?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-ffh-faq__answer\">Decide what to ask (name, email, rating, open-ended feedback are the standard four). Write the HTML using a \u003Ccode>&lt;form&gt;\u003C/code> with one labeled input per question. Style it with CSS so it matches your site. Hook the \u003Ccode>action\u003C/code> to a backend that stores submissions. The full process is the six steps above, or skip ahead to \u003Ca href=\"https://formester.com/features/drag-and-drop-form-builder/\">Formester&rsquo;s drag-and-drop builder\u003C/a> if you&rsquo;d rather not write code.\u003C/div>\n\u003C/details>\n\n\u003Cdetails class=\"fmstr-cmp-ffh-faq__item\">\n\u003Csummary>How do I create an inquiry form in HTML?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-ffh-faq__answer\">Same pattern as a feedback form, with different field labels. Swap \"How was your experience?\" for \"What are you interested in?\" and \"Your feedback\" for \"Your message.\" Keep the name, email, and submit-button structure identical. For a longer inquiry form with subject lines and contact preferences, the \u003Ca href=\"https://formester.com/blog/contact-form-design-tips-best-practices-and-examples/\">contact form design best practices guide\u003C/a> covers the patterns.\u003C/div>\n\u003C/details>\n\n\u003Cdetails class=\"fmstr-cmp-ffh-faq__item\">\n\u003Csummary>How do you add a comment to a form in HTML?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-ffh-faq__answer\">Two meanings. (1) An HTML comment for developers: \u003Ccode>&lt;!-- this is the feedback section --&gt;\u003C/code> between elements. (2) A user-facing comment field: a \u003Ccode>&lt;textarea&gt;\u003C/code> with a label like \"Your comments.\" If you want comments to be optional, leave off the \u003Ccode>required\u003C/code> attribute. Use \u003Ccode>rows\u003C/code> and \u003Ccode>cols\u003C/code> (or CSS height) to size the box.\u003C/div>\n\u003C/details>\n\n\u003Cdetails class=\"fmstr-cmp-ffh-faq__item\">\n\u003Csummary>How do I add CSS to a feedback form?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-ffh-faq__answer\">Two options. Inline \u003Ccode>&lt;style&gt;\u003C/code> tags inside \u003Ccode>&lt;head&gt;\u003C/code> work fine for one-off pages. For any real site, link an external stylesheet with \u003Ccode>&lt;link rel=\"stylesheet\" href=\"styles.css\"&gt;\u003C/code>. Style the \u003Ccode>form\u003C/code>, \u003Ccode>label\u003C/code>, \u003Ccode>input\u003C/code>, \u003Ccode>textarea\u003C/code>, and \u003Ccode>button\u003C/code> selectors directly. Step 3 above ships a complete starter stylesheet you can paste, including focus rings and inline error styles.\u003C/div>\n\u003C/details>\n\n\u003Cdetails class=\"fmstr-cmp-ffh-faq__item\">\n\u003Csummary>How do I add JavaScript validation without breaking accessibility?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-ffh-faq__answer\">Use \u003Ccode>aria-invalid=\"true\"\u003C/code> on invalid fields, \u003Ccode>aria-describedby\u003C/code> to point at the inline error message, and move focus to the first invalid field on submit failure. Avoid \u003Ccode>alert()\u003C/code> boxes, they break screen-reader flow. The Step 4 JavaScript and the complete example above are accessibility-tested versions you can paste directly. Always re-validate on the server too, since a user with DevTools open can bypass client-side checks.\u003C/div>\n\u003C/details>\n\n\u003C/div>\n\u003C/div>\n\u003C/section>\n\n\u003Cstyle>\n/* host-link-override */\n.fmstr-cmp-ffh-vid a { text-decoration: none !important; }\n.fmstr-cmp-ffh-vid {\n--c-bg-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; --c-border: #eaecf0;\n--c-shadow: 0 4px 20px rgba(16,24,40,.06), 0 2px 6px rgba(16,24,40,.04);\n\nbackground: transparent; padding: 56px 24px;\nfont-family: inherit;\ncolor: var(--c-fg-1);\n}\n.fmstr-cmp-ffh-vid *, .fmstr-cmp-ffh-vid *::before, .fmstr-cmp-ffh-vid *::after { box-sizing: border-box; }\n.fmstr-cmp-ffh-vid__container { max-width: 820px; margin: 0 auto; }\n.fmstr-cmp-ffh-vid__head { margin: 0 0 24px; }\n.fmstr-cmp-ffh-vid__eyebrow {\ndisplay: inline-block; padding: 5px 12px; border-radius: 9999px;\nbackground: var(--c-tint); color: var(--c-violet-600);\nfont-size: 12px; font-weight: 600; letter-spacing: .04em;\ntext-transform: uppercase; border: 1px solid var(--c-edge); margin: 0 0 14px;\n}\n.fmstr-cmp-ffh-vid__h2 { font-size: clamp(24px, 2.8vw, 32px); font-weight: 700; line-height: 1.15; letter-spacing: -.02em; margin: 0; color: var(--c-fg-1); }\n.fmstr-cmp-ffh-vid__sub { color: var(--c-fg-3); font-size: 16px; line-height: 1.6; margin: 12px 0 0; }\n.fmstr-cmp-ffh-vid__frame {\nposition: relative; aspect-ratio: 16 / 9; border-radius: 20px; overflow: hidden;\nbackground: var(--c-tint); border: 1px solid var(--c-border); box-shadow: var(--c-shadow);\n}\n.fmstr-cmp-ffh-vid__frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }\n.fmstr-cmp-ffh-vid__caption { color: var(--c-fg-3); font-size: 14px; line-height: 1.6; text-align: center; margin: 16px 0 0; }\n.fmstr-cmp-ffh-vid__caption a { color: var(--c-violet-600) !important; text-decoration: none !important; }\n.fmstr-cmp-ffh-vid__caption a:hover { text-decoration: underline !important; }\n.fmstr-cmp-ffh-vid__caption code {\nbackground: var(--c-tint); padding: 1px 6px; border-radius: 4px;\nfont-family: ui-monospace, Menlo, Monaco, monospace; font-size: 13px;\ncolor: var(--c-violet-600);\n}\n\n@media (max-width: 760px) {\n.fmstr-cmp-ffh-vid { padding: 40px 16px; }\n.fmstr-cmp-ffh-vid__sub { font-size: 15px; }\n.fmstr-cmp-ffh-vid__frame { border-radius: 16px; }\n.fmstr-cmp-ffh-vid__caption { font-size: 13.5px; }\n}\n\u003C/style>\n\n\u003Csection class=\"fmstr-cmp-ffh-vid\" aria-labelledby=\"fmstr-cmp-ffh-vid-h2\">\n\u003Cdiv class=\"fmstr-cmp-ffh-vid__container\">\n\u003Cdiv class=\"fmstr-cmp-ffh-vid__head\">\n\u003Cspan class=\"fmstr-cmp-ffh-vid__eyebrow\">Three-minute walkthrough\u003C/span>\n\u003Ch2 class=\"fmstr-cmp-ffh-vid__h2\" id=\"fmstr-cmp-ffh-vid-h2\">Watch the full HTML feedback form built from scratch\u003C/h2>\n\u003Cp class=\"fmstr-cmp-ffh-vid__sub\">Structure, CSS, accessible validation, backend swap. All six steps in one short video.\u003C/p>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-vid__frame\">\n\u003Ciframe src=\"https://www.youtube.com/embed/8FC3c5Cv5ew\" title=\"How to make a feedback form in HTML\" loading=\"lazy\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen>\u003C/iframe>\n\u003C/div>\n\u003Cp class=\"fmstr-cmp-ffh-vid__caption\">Prefer reading? The full tutorial is below with copy-paste blocks. To skip the backend setup entirely, point the form&rsquo;s \u003Ccode>action\u003C/code> at \u003Ca href=\"https://formester.com/features/html-form-backend/\">Formester&rsquo;s HTML form backend\u003C/a>.\u003C/p>\n\u003C/div>\n\u003C/section>\n\n\u003Cstyle>\n/* host-link-override */\n.fmstr-cmp-ffh-rel a { text-decoration: none !important; }\n.fmstr-cmp-ffh-rel {\n--c-bg: #f4f4f7; --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; --c-border: #eaecf0;\n--c-shadow: 0 4px 20px rgba(16,24,40,.06);\n\nbackground: transparent; padding: 56px 24px;\nfont-family: inherit;\ncolor: var(--c-fg-1);\n}\n.fmstr-cmp-ffh-rel *, .fmstr-cmp-ffh-rel *::before, .fmstr-cmp-ffh-rel *::after { box-sizing: border-box; }\n.fmstr-cmp-ffh-rel__container { max-width: 820px; margin: 0 auto; }\n.fmstr-cmp-ffh-rel__head { margin: 0 0 28px; }\n.fmstr-cmp-ffh-rel__h2 { font-size: clamp(26px, 3vw, 36px); font-weight: 700; line-height: 1.15; letter-spacing: -.02em; margin: 0; }\n.fmstr-cmp-ffh-rel__intro { color: var(--c-fg-3); font-size: 17px; line-height: 1.6; margin: 14px 0 0; }\n.fmstr-cmp-ffh-rel__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }\n.fmstr-cmp-ffh-rel__card {\nbackground: var(--c-card); border: 1px solid var(--c-border);\nborder-radius: 14px; padding: 18px 20px; display: flex; align-items: center; gap: 14px;\ntext-decoration: none !important; color: inherit !important; transition: all .15s ease;\n}\n.fmstr-cmp-ffh-rel__card:hover { border-color: var(--c-edge); box-shadow: var(--c-shadow); transform: translateY(-1px); }\n.fmstr-cmp-ffh-rel__icon { width: 40px; height: 40px; border-radius: 10px; background: var(--c-tint); display: grid; place-items: center; flex-shrink: 0; font-size: 18px; border: 1px solid var(--c-edge); }\n.fmstr-cmp-ffh-rel__text { flex-grow: 1; }\n.fmstr-cmp-ffh-rel__text h4 { font-size: 14.5px; font-weight: 600; color: var(--c-fg-1); margin: 0; }\n.fmstr-cmp-ffh-rel__text small { font-size: 12.5px; color: var(--c-fg-3); display: block; margin-top: 2px; }\n.fmstr-cmp-ffh-rel__arrow { color: var(--c-violet-500); font-size: 18px; }\n\n@media (max-width: 880px) { .fmstr-cmp-ffh-rel__grid { grid-template-columns: 1fr 1fr; gap: 12px; } }\n@media (max-width: 760px) {\n.fmstr-cmp-ffh-rel { padding: 40px 16px; }\n.fmstr-cmp-ffh-rel__intro { font-size: 15.5px; }\n.fmstr-cmp-ffh-rel__card { padding: 16px; gap: 12px; }\n}\n@media (max-width: 540px) { .fmstr-cmp-ffh-rel__grid { grid-template-columns: 1fr; gap: 12px; } }\n\u003C/style>\n\n\u003Csection class=\"fmstr-cmp-ffh-rel\" aria-labelledby=\"fmstr-cmp-ffh-rel-h2\">\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__container\">\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__head\">\n\u003Ch2 class=\"fmstr-cmp-ffh-rel__h2\" id=\"fmstr-cmp-ffh-rel-h2\">More from Formester on HTML forms and feedback\u003C/h2>\n\u003Cp class=\"fmstr-cmp-ffh-rel__intro\">Pair this tutorial with the backend features, ready-made templates, and adjacent how-tos.\u003C/p>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__grid\">\n\n\u003Ca class=\"fmstr-cmp-ffh-rel__card\" href=\"https://formester.com/features/html-form-backend/\">\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__icon\" aria-hidden=\"true\">&#128229;\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__text\">\u003Ch4>HTML Form Backend\u003C/h4>\u003Csmall>One \u003Ccode>action\u003C/code> swap, no server\u003C/small>\u003C/div>\n\u003Cspan class=\"fmstr-cmp-ffh-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C/span>\n\u003C/a>\n\n\u003Ca class=\"fmstr-cmp-ffh-rel__card\" href=\"https://formester.com/features/embed-forms/\">\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__icon\" aria-hidden=\"true\">&#128279;\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__text\">\u003Ch4>Embed Forms\u003C/h4>\u003Csmall>Drop a form into any HTML page\u003C/small>\u003C/div>\n\u003Cspan class=\"fmstr-cmp-ffh-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C/span>\n\u003C/a>\n\n\u003Ca class=\"fmstr-cmp-ffh-rel__card\" href=\"https://formester.com/features/spam-protection/\">\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__icon\" aria-hidden=\"true\">&#128737;\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__text\">\u003Ch4>Spam Protection\u003C/h4>\u003Csmall>Honeypot + reCAPTCHA built in\u003C/small>\u003C/div>\n\u003Cspan class=\"fmstr-cmp-ffh-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C/span>\n\u003C/a>\n\n\u003Ca class=\"fmstr-cmp-ffh-rel__card\" href=\"https://formester.com/templates/customer-feedback-form-31840/\">\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__icon\" aria-hidden=\"true\">&#11088;\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__text\">\u003Ch4>Customer Feedback Form\u003C/h4>\u003Csmall>Pre-built template\u003C/small>\u003C/div>\n\u003Cspan class=\"fmstr-cmp-ffh-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C/span>\n\u003C/a>\n\n\u003Ca class=\"fmstr-cmp-ffh-rel__card\" href=\"https://formester.com/templates/categories/feedback-forms/\">\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__icon\" aria-hidden=\"true\">&#128196;\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__text\">\u003Ch4>All Feedback Templates\u003C/h4>\u003Csmall>Customer, product, employee\u003C/small>\u003C/div>\n\u003Cspan class=\"fmstr-cmp-ffh-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C/span>\n\u003C/a>\n\n\u003Ca class=\"fmstr-cmp-ffh-rel__card\" href=\"https://formester.com/ai-form-generator/\">\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__icon\" aria-hidden=\"true\">&#10024;\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__text\">\u003Ch4>AI Form Generator\u003C/h4>\u003Csmall>The no-code alternative\u003C/small>\u003C/div>\n\u003Cspan class=\"fmstr-cmp-ffh-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C/span>\n\u003C/a>\n\n\u003Ca class=\"fmstr-cmp-ffh-rel__card\" href=\"https://formester.com/blog/how-to-send-contact-form-data-to-google-sheets-free/\">\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__icon\" aria-hidden=\"true\">&#128203;\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__text\">\u003Ch4>Send form data to Google Sheets\u003C/h4>\u003Csmall>Free, step-by-step\u003C/small>\u003C/div>\n\u003Cspan class=\"fmstr-cmp-ffh-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C/span>\n\u003C/a>\n\n\u003Ca class=\"fmstr-cmp-ffh-rel__card\" href=\"https://formester.com/blog/contact-form-design-tips-best-practices-and-examples/\">\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__icon\" aria-hidden=\"true\">&#127912;\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__text\">\u003Ch4>Contact form design tips\u003C/h4>\u003Csmall>Best practices and examples\u003C/small>\u003C/div>\n\u003Cspan class=\"fmstr-cmp-ffh-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C/span>\n\u003C/a>\n\n\u003Ca class=\"fmstr-cmp-ffh-rel__card\" href=\"https://formester.com/blog/how-to-build-spam-free-contact-forms-for-your-website/\">\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__icon\" aria-hidden=\"true\">&#129302;\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-ffh-rel__text\">\u003Ch4>Build spam-free contact forms\u003C/h4>\u003Csmall>Stop bots before they hit your inbox\u003C/small>\u003C/div>\n\u003Cspan class=\"fmstr-cmp-ffh-rel__arrow\" aria-hidden=\"true\">&rarr;\u003C/span>\n\u003C/a>\n\n\u003C/div>\n\u003C/div>\n\u003C/section>","2024-06-27T06:19:40.031Z","2026-05-17T04:46:01.948Z","2026-05-17T04:46:01.940Z","https://formester-strapi.s3.ap-south-1.amazonaws.com/an_illustration_of_how_to_make_feedback_form_in_html_c6203dc935.png",[],[],365,{"text":65},"16 min read",{"title":67,"description":68,"metaTitle":69,"metaDescription":68,"keywords":70,"author":71,"authorProfile":72,"coverImgAlt":73,"featured":14,"slug":74,"body":75,"createdAt":76,"updatedAt":77,"publishedAt":78,"coverImg":79,"metaImage":80,"schema":81,"id":195,"coverImgWidth":44,"coverImgHeight":45,"readingStats":196},"Google Forms Right to Left: How to Make RTL Forms (and 3 Native Alternatives)","Google Forms has no official RTL setting. Here is the language workaround that flips your forms right to left, a language-by-language guide (Arabic, Hebrew, Urd","Google Forms Right to Left: How to Make RTL Forms","right to left forms,\nonline forms,\nmulti language forms,\n","Harsh Shah","https://linkedin.com/in/harshshahseo","a blog post cover about how to create right to left forms","how-to-create-right-to-left-forms","![a blog post cover about how to create right to left forms](https://formester-strapi.s3.ap-south-1.amazonaws.com/75_e6bfe24fc4.png)\n\n\u003Cstyle>\n/* batch-1 blog normalisation */\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/style>\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/style>\n\n\u003Cp class=\"fmstr-blog-lead\">Google Forms does not have a right-to-left toggle. Google's own help thread confirms there is \u003Ca href=\"https://support.google.com/docs/thread/198216419\">no official RTL setting\u003C/a>. The only workaround is to change the Forms account language to Hebrew or Arabic, which flips all your forms RTL, but only in your own view.\u003C/p>\n\n\u003Cp class=\"fmstr-blog-lead\">If you want every respondent to see the form in RTL, native to their script, you need a form builder that ships RTL as a setting.\u003C/p>\n\n\u003Cp class=\"fmstr-blog-lead\">This guide covers the Google Forms workaround, the limits you should know about before shipping, a language-by-language quick reference for Arabic, Hebrew, Urdu, Persian, Pashto, and Sindhi, and three builders with native RTL support (Formester, Jotform, Fillout).\u003C/p>\n\n\u003Cstyle>\n.fmstr-cmp-rtl-tldr a { text-decoration: none !important; }\n.fmstr-cmp-rtl-tldr a { color: #5b34b1 !important; }\n.fmstr-cmp-rtl-tldr a:hover { text-decoration: underline !important; }\n.fmstr-cmp-rtl-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-rtl-tldr *, .fmstr-cmp-rtl-tldr *::before, .fmstr-cmp-rtl-tldr *::after { box-sizing: border-box; }\n.fmstr-cmp-rtl-tldr__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-rtl-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: 10px;\n}\n.fmstr-cmp-rtl-tldr__label {\nfont-size: 12px;\nfont-weight: 700;\nletter-spacing: 0.08em;\ntext-transform: uppercase;\ncolor: var(--c-violet-700) !important;\ndisplay: inline-flex;\nalign-items: center;\ngap: 8px;\nmargin: 0;\n}\n.fmstr-cmp-rtl-tldr__label::before {\ncontent: \"\";\nwidth: 8px; height: 8px; border-radius: 9999px;\nbackground: var(--c-violet-500);\ndisplay: inline-block;\n}\n.fmstr-cmp-rtl-tldr__body {\nfont-size: 16px;\nline-height: 1.65;\ncolor: var(--c-fg-1);\nmargin: 0;\nfont-weight: 500;\n}\n.fmstr-cmp-rtl-tldr__body strong { color: var(--c-violet-700); font-weight: 700; }\n\n@media (max-width: 540px) {\n.fmstr-cmp-rtl-tldr { padding: 20px 0 28px; }\n.fmstr-cmp-rtl-tldr__card { padding: 18px 20px; }\n.fmstr-cmp-rtl-tldr__body { font-size: 15px; }\n}\n\n\n/* mobile-safety-v2 */\n.fmstr-cmp-rtl-tldr img, .fmstr-cmp-rtl-tldr table, .fmstr-cmp-rtl-tldr pre, .fmstr-cmp-rtl-tldr iframe, .fmstr-cmp-rtl-tldr video { max-width: 100%; }\n.fmstr-cmp-rtl-tldr > * { min-width: 0; }\n.fmstr-cmp-rtl-tldr [class*='__grid'] > *, .fmstr-cmp-rtl-tldr [class*='__list'] > *, .fmstr-cmp-rtl-tldr [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-rtl-tldr pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-rtl-tldr table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\u003C/style>\n\n\u003Csection class=\"fmstr-cmp-rtl-tldr\" aria-labelledby=\"fmstr-cmp-rtl-tldr-label\">\n\u003Cdiv class=\"fmstr-cmp-rtl-tldr__container\">\n\u003Cdiv class=\"fmstr-cmp-rtl-tldr__card\">\n\u003Cp class=\"fmstr-cmp-rtl-tldr__label\" id=\"fmstr-cmp-rtl-tldr-label\">Quick answer\u003C/p>\n\u003Cp class=\"fmstr-cmp-rtl-tldr__body\">\u003Cstrong>Google Forms does not have a right-to-left toggle.\u003C/strong> The only workaround is to change your Google account's Forms language to Hebrew or Arabic, which flips the form RTL in your editor view, but respondents still see it left-to-right.\u003C/p>\n\u003Cp class=\"fmstr-cmp-rtl-tldr__body\">For respondent-facing RTL, use a native builder: \u003Ca href=\"/form-builder/\">Formester\u003C/a> (toggle Multilanguage, pick Arabic, Hebrew, Urdu, Persian, Pashto, or Sindhi, AI translates and aligns), \u003Ca href=\"https://fillout.com/help/right-to-left-forms\">Fillout\u003C/a> (per-form RTL flag), or \u003Ca href=\"https://www.jotform.com/help/how-to-align-your-forms-to-a-right-to-left-direction/\">Jotform\u003C/a> (custom CSS).\u003C/p>\n\u003Cp class=\"fmstr-cmp-rtl-tldr__body\">For developers, \u003Ccode>dir=\"rtl\"\u003C/code> with the right \u003Ccode>lang\u003C/code> attribute is the W3C-documented approach.\u003C/p>\n\u003C/div>\n\u003C/div>\n\u003C/section>\n\n\n\u003Cstyle>\n.fmstr-cmp-rtl-cmp a { text-decoration: none !important; }\n.fmstr-cmp-rtl-cmp a { color: #5b34b1 !important; }\n.fmstr-cmp-rtl-cmp a:hover { text-decoration: underline !important; }\n.fmstr-cmp-rtl-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-rtl-cmp *, .fmstr-cmp-rtl-cmp *::before, .fmstr-cmp-rtl-cmp *::after { box-sizing: border-box; }\n.fmstr-cmp-rtl-cmp > *, .fmstr-cmp-rtl-cmp > * > * { min-width: 0; }\n.fmstr-cmp-rtl-cmp__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-rtl-cmp__head { margin: 0 0 28px; }\n.fmstr-cmp-rtl-cmp__h2 {\nfont-size: clamp(26px, 3vw, 36px); font-weight: 700; line-height: 1.15;\nletter-spacing: -.02em; margin: 0; color: var(--c-fg-1);\n}\n.fmstr-cmp-rtl-cmp__intro { color: var(--c-fg-3); font-size: 17px; line-height: 1.6; margin: 14px 0 0; }\n.fmstr-cmp-rtl-cmp__grid {\ndisplay: grid; grid-template-columns: repeat(3, 1fr); gap: 14px;\n}\n.fmstr-cmp-rtl-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-rtl-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-rtl-cmp__chip {\ndisplay: inline-flex; align-items: center;\nfont-size: 11px; font-weight: 700; letter-spacing: 0.08em;\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-rtl-cmp__name {\nfont-size: 18px; font-weight: 700; color: var(--c-fg-1);\nmargin: 0; line-height: 1.3;\n}\n.fmstr-cmp-rtl-cmp__best {\nfont-size: 13.5px; color: var(--c-fg-3); margin: 0;\n}\n.fmstr-cmp-rtl-cmp__best strong { color: var(--c-fg-1); font-weight: 600; }\n.fmstr-cmp-rtl-cmp__divider {\nheight: 1px; background: var(--c-border); margin: 4px 0; border: 0;\n}\n.fmstr-cmp-rtl-cmp__list {\nmargin: 0; padding: 0; list-style: none;\ndisplay: flex; flex-direction: column; gap: 8px;\n}\n.fmstr-cmp-rtl-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-rtl-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-rtl-cmp__item--con::before { content: \"\\2717\"; color: var(--c-bad); position: absolute; left: 0; top: 0.05em; font-weight: 700; }\n\n@media (max-width: 920px) {\n.fmstr-cmp-rtl-cmp__grid { grid-template-columns: 1fr; gap: 12px; }\n}\n@media (max-width: 540px) {\n.fmstr-cmp-rtl-cmp { padding: 36px 0; }\n.fmstr-cmp-rtl-cmp__card { padding: 18px 20px; }\n}\n\n\n/* mobile-safety-v2 */\n.fmstr-cmp-rtl-cmp img, .fmstr-cmp-rtl-cmp table, .fmstr-cmp-rtl-cmp pre, .fmstr-cmp-rtl-cmp iframe, .fmstr-cmp-rtl-cmp video { max-width: 100%; }\n.fmstr-cmp-rtl-cmp > * { min-width: 0; }\n.fmstr-cmp-rtl-cmp [class*='__grid'] > *, .fmstr-cmp-rtl-cmp [class*='__list'] > *, .fmstr-cmp-rtl-cmp [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-rtl-cmp pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-rtl-cmp table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\u003C/style>\n\n\u003Csection class=\"fmstr-cmp-rtl-cmp\" aria-labelledby=\"fmstr-cmp-rtl-cmp-h2\">\n\u003Cdiv class=\"fmstr-cmp-rtl-cmp__container\">\n\u003Cdiv class=\"fmstr-cmp-rtl-cmp__head\">\n\u003Ch2 class=\"fmstr-cmp-rtl-cmp__h2\" id=\"fmstr-cmp-rtl-cmp-h2\">Native RTL form builders compared\u003C/h2>\n\u003Cp class=\"fmstr-cmp-rtl-cmp__intro\">Three builders ship right-to-left support that actually reaches the respondent, not just the form editor. Pick on setup speed and translation depth.\u003C/p>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-rtl-cmp__grid\">\n\n\u003Cdiv class=\"fmstr-cmp-rtl-cmp__card fmstr-cmp-rtl-cmp__card--featured\">\n\u003Cspan class=\"fmstr-cmp-rtl-cmp__chip\">Best for translation\u003C/span>\n\u003Ch3 class=\"fmstr-cmp-rtl-cmp__name\">Formester\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-cmp__best\">\u003Cstrong>Best for:\u003C/strong> One form, many RTL languages, AI does the translation\u003C/p>\n\u003Chr class=\"fmstr-cmp-rtl-cmp__divider\">\n\u003Cul class=\"fmstr-cmp-rtl-cmp__list\">\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item\">Toggle Multilanguage in Advanced settings, add an RTL language, hit Translate with AI\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item\">RTL alignment auto-applies per language\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item\">AI translation across \u003Ca href=\"/ai-powered-multilingual-forms/\">180+ languages\u003C/a>\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item\">Built-in respondent language switcher\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item fmstr-cmp-rtl-cmp__item--con\">Free plan caps at 100 responses/month\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item fmstr-cmp-rtl-cmp__item--con\">Branding removal is Personal+\u003C/li>\n\u003C/ul>\n\u003C/div>\n\n\u003Cdiv class=\"fmstr-cmp-rtl-cmp__card\">\n\u003Cspan class=\"fmstr-cmp-rtl-cmp__chip\">Best for speed\u003C/span>\n\u003Ch3 class=\"fmstr-cmp-rtl-cmp__name\">\u003Ca href=\"https://fillout.com/help/right-to-left-forms\">Fillout\u003C/a>\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-cmp__best\">\u003Cstrong>Best for:\u003C/strong> A pure layout flip on a form you already wrote\u003C/p>\n\u003Chr class=\"fmstr-cmp-rtl-cmp__divider\">\n\u003Cul class=\"fmstr-cmp-rtl-cmp__list\">\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item\">Per-form Right-to-left toggle in settings\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item\">Quickest setup of the three\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item\">Layout flips for every field type\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item fmstr-cmp-rtl-cmp__item--con\">RTL is a layout flag, not a translation engine\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item fmstr-cmp-rtl-cmp__item--con\">You write the copy in the target language yourself\u003C/li>\n\u003C/ul>\n\u003C/div>\n\n\u003Cdiv class=\"fmstr-cmp-rtl-cmp__card\">\n\u003Cspan class=\"fmstr-cmp-rtl-cmp__chip\">Best if you're already in\u003C/span>\n\u003Ch3 class=\"fmstr-cmp-rtl-cmp__name\">\u003Ca href=\"https://www.jotform.com/help/how-to-align-your-forms-to-a-right-to-left-direction/\">Jotform\u003C/a>\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-cmp__best\">\u003Cstrong>Best for:\u003C/strong> Teams deep in Jotform who don't want to migrate\u003C/p>\n\u003Chr class=\"fmstr-cmp-rtl-cmp__divider\">\n\u003Cul class=\"fmstr-cmp-rtl-cmp__list\">\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item\">Paste a custom CSS block in the Form Designer\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item\">Works on any existing form\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item\">Covers labels, checkboxes, radios, matrix grids\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item fmstr-cmp-rtl-cmp__item--con\">You maintain the CSS by hand\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item fmstr-cmp-rtl-cmp__item--con\">Jotform updates can break alignment\u003C/li>\n\u003Cli class=\"fmstr-cmp-rtl-cmp__item fmstr-cmp-rtl-cmp__item--con\">Not toggle-based\u003C/li>\n\u003C/ul>\n\u003C/div>\n\n\u003C/div>\n\u003C/div>\n\u003C/section>\n\n\n\u003Cstyle>\n.fmstr-cmp-rtl-lang a { text-decoration: none !important; }\n.fmstr-cmp-rtl-lang a { color: #5b34b1 !important; }\n.fmstr-cmp-rtl-lang a:hover { text-decoration: underline !important; }\n.fmstr-cmp-rtl-lang {\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-row-alt: #fafafa;\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-rtl-lang *, .fmstr-cmp-rtl-lang *::before, .fmstr-cmp-rtl-lang *::after { box-sizing: border-box; }\n.fmstr-cmp-rtl-lang > *, .fmstr-cmp-rtl-lang > * > * { min-width: 0; }\n.fmstr-cmp-rtl-lang__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-rtl-lang__head { margin: 0 0 24px; }\n.fmstr-cmp-rtl-lang__h2 {\nfont-size: clamp(26px, 3vw, 36px); font-weight: 700; line-height: 1.15;\nletter-spacing: -.02em; margin: 0; color: var(--c-fg-1);\n}\n.fmstr-cmp-rtl-lang__intro { color: var(--c-fg-3); font-size: 17px; line-height: 1.6; margin: 14px 0 0; }\n\n.fmstr-cmp-rtl-lang__tablewrap {\nbackground: var(--c-card);\nborder: 1px solid var(--c-border);\nborder-radius: 14px;\nbox-shadow: var(--c-shadow);\noverflow-x: auto;\n}\n.fmstr-cmp-rtl-lang__table {\nwidth: 100%;\nborder-collapse: collapse;\nfont-size: 14.5px;\nline-height: 1.55;\n}\n.fmstr-cmp-rtl-lang__table thead th {\ntext-align: left;\nfont-weight: 700;\nfont-size: 12.5px;\nletter-spacing: 0.06em;\ntext-transform: uppercase;\ncolor: var(--c-violet-700);\nbackground: var(--c-tint);\npadding: 14px 18px;\nborder-bottom: 1px solid var(--c-edge);\nwhite-space: nowrap;\n}\n.fmstr-cmp-rtl-lang__table tbody td {\npadding: 16px 18px;\nvertical-align: top;\ncolor: var(--c-fg-2);\nborder-bottom: 1px solid var(--c-border);\n}\n.fmstr-cmp-rtl-lang__table tbody tr:last-child td { border-bottom: 0; }\n.fmstr-cmp-rtl-lang__table tbody tr:nth-child(even) td { background: var(--c-row-alt); }\n.fmstr-cmp-rtl-lang__table tbody td:first-child {\ncolor: var(--c-fg-1);\nfont-weight: 700;\nwhite-space: nowrap;\n}\n.fmstr-cmp-rtl-lang__script {\nfont-size: 18px;\ncolor: var(--c-fg-1);\nfont-weight: 600;\n}\n.fmstr-cmp-rtl-lang__speakers {\nfont-variant-numeric: tabular-nums;\ncolor: var(--c-fg-1);\nfont-weight: 600;\nwhite-space: nowrap;\n}\n\n.fmstr-cmp-rtl-lang__note {\nfont-size: 15px; line-height: 1.65;\ncolor: var(--c-fg-2); margin: 18px 0 0;\npadding: 14px 18px;\nbackground: var(--c-tint); border: 1px solid var(--c-edge);\nborder-radius: 10px;\n}\n.fmstr-cmp-rtl-lang__note strong { color: var(--c-violet-700); font-weight: 700; }\n.fmstr-cmp-rtl-lang__note code {\nbackground: #ffffff; padding: 2px 6px; border-radius: 6px;\nborder: 1px solid var(--c-border);\nfont-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\nfont-size: 13.5px;\n}\n\n@media (max-width: 760px) {\n.fmstr-cmp-rtl-lang { padding: 36px 0; }\n.fmstr-cmp-rtl-lang__table { font-size: 13.5px; }\n.fmstr-cmp-rtl-lang__table thead th,\n.fmstr-cmp-rtl-lang__table tbody td { padding: 12px 14px; }\n}\n\n\n/* mobile-safety-v2 */\n.fmstr-cmp-rtl-lang img, .fmstr-cmp-rtl-lang table, .fmstr-cmp-rtl-lang pre, .fmstr-cmp-rtl-lang iframe, .fmstr-cmp-rtl-lang video { max-width: 100%; }\n.fmstr-cmp-rtl-lang > * { min-width: 0; }\n.fmstr-cmp-rtl-lang [class*='__grid'] > *, .fmstr-cmp-rtl-lang [class*='__list'] > *, .fmstr-cmp-rtl-lang [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-rtl-lang pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-rtl-lang table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\u003C/style>\n\n\u003Csection class=\"fmstr-cmp-rtl-lang\" aria-labelledby=\"fmstr-cmp-rtl-lang-h2\">\n\u003Cdiv class=\"fmstr-cmp-rtl-lang__container\">\n\u003Cdiv class=\"fmstr-cmp-rtl-lang__head\">\n\u003Ch2 class=\"fmstr-cmp-rtl-lang__h2\" id=\"fmstr-cmp-rtl-lang-h2\">RTL languages: what you need to know before shipping\u003C/h2>\n\u003Cp class=\"fmstr-cmp-rtl-lang__intro\">Six RTL scripts cover almost every audience you will hit. Each one has its own font and numeral gotcha that the form builder needs to handle correctly.\u003C/p>\n\u003C/div>\n\n\u003Cdiv class=\"fmstr-cmp-rtl-lang__tablewrap\">\n\u003Ctable class=\"fmstr-cmp-rtl-lang__table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Language\u003C/th>\n\u003Cth>Native script\u003C/th>\n\u003Cth>Speakers (millions)\u003C/th>\n\u003Cth>Common form use cases\u003C/th>\n\u003Cth>Key gotcha\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Arabic\u003C/td>\n\u003Ctd>\u003Cspan class=\"fmstr-cmp-rtl-lang__script\">العربية\u003C/span>\u003C/td>\n\u003Ctd>\u003Cspan class=\"fmstr-cmp-rtl-lang__speakers\">380+\u003C/span>\u003C/td>\n\u003Ctd>Customer service, government, education, e-commerce checkout in MENA\u003C/td>\n\u003Ctd>Numerals are usually Western (0-9), not Eastern Arabic. Set them per field.\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Hebrew\u003C/td>\n\u003Ctd>\u003Cspan class=\"fmstr-cmp-rtl-lang__script\">עברית\u003C/span>\u003C/td>\n\u003Ctd>\u003Cspan class=\"fmstr-cmp-rtl-lang__speakers\">9\u003C/span>\u003C/td>\n\u003Ctd>Israeli public sector, fintech onboarding, NGO surveys\u003C/td>\n\u003Ctd>Mixed Hebrew + English content needs \u003Ccode>bdi\u003C/code> or \u003Ccode>bdo\u003C/code> tags or labels break.\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Urdu\u003C/td>\n\u003Ctd>\u003Cspan class=\"fmstr-cmp-rtl-lang__script\">اردو\u003C/span>\u003C/td>\n\u003Ctd>\u003Cspan class=\"fmstr-cmp-rtl-lang__speakers\">230+\u003C/span>\u003C/td>\n\u003Ctd>Pakistani government forms, Indian academic surveys, NGO outreach\u003C/td>\n\u003Ctd>Nastaliq script needs a font that supports it (Noto Nastaliq Urdu is safe).\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Persian (Farsi, Dari)\u003C/td>\n\u003Ctd>\u003Cspan class=\"fmstr-cmp-rtl-lang__script\">فارسی\u003C/span>\u003C/td>\n\u003Ctd>\u003Cspan class=\"fmstr-cmp-rtl-lang__speakers\">110+\u003C/span>\u003C/td>\n\u003Ctd>Iranian banking, Afghan diaspora services, academic intake\u003C/td>\n\u003Ctd>Numerals can be Persian (۰-۹) or Western. Confirm with the audience.\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Pashto\u003C/td>\n\u003Ctd>\u003Cspan class=\"fmstr-cmp-rtl-lang__script\">پښتو\u003C/span>\u003C/td>\n\u003Ctd>\u003Cspan class=\"fmstr-cmp-rtl-lang__speakers\">60+\u003C/span>\u003C/td>\n\u003Ctd>Afghan government, refugee intake, education\u003C/td>\n\u003Ctd>Limited font support outside Noto Sans Pashto. Test on mobile.\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Sindhi\u003C/td>\n\u003Ctd>\u003Cspan class=\"fmstr-cmp-rtl-lang__script\">سنڌي\u003C/span>\u003C/td>\n\u003Ctd>\u003Cspan class=\"fmstr-cmp-rtl-lang__speakers\">25+\u003C/span>\u003C/td>\n\u003Ctd>Pakistani provincial forms, Indian academic\u003C/td>\n\u003Ctd>Arabic-Sindhi script differs from standard Arabic. Use a Sindhi font.\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\n\u003C/div>\n\n\u003Cp class=\"fmstr-cmp-rtl-lang__note\">\u003Cstrong>The fix is the same at a layout level:\u003C/strong> \u003Ccode>dir=\"rtl\"\u003C/code> on the form root and a font that supports the script. The complexity sits downstream in numerals, mixed-direction text, and font availability on mobile.\u003C/p>\n\n\u003C/div>\n\u003C/section>\n\n\n\u003Cstyle>\n.fmstr-cmp-rtl-steps a { text-decoration: none !important; }\n.fmstr-cmp-rtl-steps a { color: #5b34b1 !important; }\n.fmstr-cmp-rtl-steps a:hover { text-decoration: underline !important; }\n.fmstr-cmp-rtl-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-rtl-steps *, .fmstr-cmp-rtl-steps *::before, .fmstr-cmp-rtl-steps *::after { box-sizing: border-box; }\n.fmstr-cmp-rtl-steps > *, .fmstr-cmp-rtl-steps > * > * { min-width: 0; }\n.fmstr-cmp-rtl-steps__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-rtl-steps__block { margin: 0 0 36px; }\n.fmstr-cmp-rtl-steps__block:last-child { margin-bottom: 0; }\n.fmstr-cmp-rtl-steps__head { margin: 0 0 20px; }\n.fmstr-cmp-rtl-steps__eyebrow {\ndisplay: inline-flex; align-items: center;\nfont-size: 11px; font-weight: 700; letter-spacing: 0.08em;\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; margin-bottom: 10px;\n}\n.fmstr-cmp-rtl-steps__h2 {\nfont-size: clamp(22px, 2.4vw, 28px); font-weight: 700; line-height: 1.2;\nletter-spacing: -.02em; margin: 0; color: var(--c-fg-1);\n}\n.fmstr-cmp-rtl-steps__intro { color: var(--c-fg-3); font-size: 16px; line-height: 1.6; margin: 10px 0 0; }\n.fmstr-cmp-rtl-steps__list {\ndisplay: flex; flex-direction: column; gap: 12px;\nmargin: 0; padding: 0; list-style: none;\n}\n.fmstr-cmp-rtl-steps__item {\nbackground: var(--c-card);\nborder: 1px solid var(--c-border);\nborder-radius: 14px;\npadding: 20px 22px;\nbox-shadow: var(--c-shadow);\ndisplay: flex; gap: 12px;\nalign-items: flex-start;\nmin-width: 0;\n}\n.fmstr-cmp-rtl-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-rtl-steps__main { flex: 1; min-width: 0; }\n.fmstr-cmp-rtl-steps__title {\nfont-size: 16.5px; font-weight: 700; line-height: 1.3;\ncolor: var(--c-fg-1); margin: 0 0 6px;\n}\n.fmstr-cmp-rtl-steps__body {\nfont-size: 15px; line-height: 1.6;\ncolor: var(--c-fg-2); margin: 0;\n}\n.fmstr-cmp-rtl-steps__code {\nbackground: var(--c-code-bg);\ncolor: var(--c-code-fg);\nborder-radius: 14px;\npadding: 20px 22px;\nfont-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\nfont-size: 13.5px;\nline-height: 1.65;\noverflow-x: auto;\nwhite-space: pre;\nmargin: 14px 0 0;\n}\n.fmstr-cmp-rtl-steps__note {\nfont-size: 14.5px; line-height: 1.65;\ncolor: var(--c-fg-2); margin: 14px 0 0;\npadding: 14px 16px;\nbackground: var(--c-tint); border: 1px solid var(--c-edge);\nborder-radius: 10px;\n}\n.fmstr-cmp-rtl-steps__note strong { color: var(--c-violet-700); font-weight: 700; }\n\n@media (max-width: 540px) {\n.fmstr-cmp-rtl-steps { padding: 36px 0; }\n.fmstr-cmp-rtl-steps__item { padding: 18px 20px; gap: 14px; }\n.fmstr-cmp-rtl-steps__num { width: 34px; height: 34px; font-size: 15px; }\n.fmstr-cmp-rtl-steps__title { font-size: 15.5px; }\n.fmstr-cmp-rtl-steps__body { font-size: 14.5px; }\n.fmstr-cmp-rtl-steps__code { font-size: 12.5px; padding: 16px; border-radius: 12px; }\n}\n\n\n/* mobile-safety-v2 */\n.fmstr-cmp-rtl-steps img, .fmstr-cmp-rtl-steps table, .fmstr-cmp-rtl-steps pre, .fmstr-cmp-rtl-steps iframe, .fmstr-cmp-rtl-steps video { max-width: 100%; }\n.fmstr-cmp-rtl-steps > * { min-width: 0; }\n.fmstr-cmp-rtl-steps [class*='__grid'] > *, .fmstr-cmp-rtl-steps [class*='__list'] > *, .fmstr-cmp-rtl-steps [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-rtl-steps pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-rtl-steps table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\n\n\n/* mobile-inline-num */\n@media (max-width: 540px) {\n  .fmstr-cmp-rtl-steps__item { padding: 18px 16px; gap: 10px; flex-direction: row; align-items: flex-start; }\n  .fmstr-cmp-rtl-steps__num { width: 28px; height: 28px; font-size: 13px; border-radius: 8px; }\n}\n\n/* step-inline-num-restructure */\n.fmstr-cmp-rtl-steps__item { display: block !important; }\n.fmstr-cmp-rtl-steps__title { display: block; }\n.fmstr-cmp-rtl-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-rtl-steps__num { font-size: 11.5px !important; padding: 2px 7px; margin-right: 6px; }\n}\n\u003C/style>\n\n\u003Csection class=\"fmstr-cmp-rtl-steps\" aria-labelledby=\"fmstr-cmp-rtl-steps-h2\">\n\u003Cdiv class=\"fmstr-cmp-rtl-steps__container\">\n\n\u003Cdiv class=\"fmstr-cmp-rtl-steps__block\">\n\u003Cdiv class=\"fmstr-cmp-rtl-steps__head\">\n\u003Cspan class=\"fmstr-cmp-rtl-steps__eyebrow\">Option 1, Google Forms\u003C/span>\n\u003Ch2 class=\"fmstr-cmp-rtl-steps__h2\" id=\"fmstr-cmp-rtl-steps-h2\">How to flip Google Forms to RTL (the language workaround)\u003C/h2>\n\u003Cp class=\"fmstr-cmp-rtl-steps__intro\">Five steps. Flips the editor and your own preview to RTL. Does not change what respondents see.\u003C/p>\n\u003C/div>\n\u003Col class=\"fmstr-cmp-rtl-steps__list\">\n\n\u003Cli class=\"fmstr-cmp-rtl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-rtl-steps__title\">\u003Cspan class=\"fmstr-cmp-rtl-steps__num\" aria-hidden=\"true\">1\u003C/span>Open Google Forms\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-steps__body\">Sign in to \u003Ca href=\"https://forms.google.com\">forms.google.com\u003C/a> with the Google account you build forms with.\u003C/p>\n\u003C/li>\n\n\u003Cli class=\"fmstr-cmp-rtl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-rtl-steps__title\">\u003Cspan class=\"fmstr-cmp-rtl-steps__num\" aria-hidden=\"true\">2\u003C/span>Open your Google Account settings\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-steps__body\">Click your profile icon in the top-right corner of any Google product (Gmail, Drive, Forms).\u003C/p>\n\u003C/li>\n\n\u003Cli class=\"fmstr-cmp-rtl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-rtl-steps__title\">\u003Cspan class=\"fmstr-cmp-rtl-steps__num\" aria-hidden=\"true\">3\u003C/span>Go to Personal info, then Language\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-steps__body\">Click \"Manage your Google Account\", then \"Personal info\", then \"Language\".\u003C/p>\n\u003C/li>\n\n\u003Cli class=\"fmstr-cmp-rtl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-rtl-steps__title\">\u003Cspan class=\"fmstr-cmp-rtl-steps__num\" aria-hidden=\"true\">4\u003C/span>Add an RTL language and set it as primary\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-steps__body\">Pick Arabic, Hebrew, Urdu, or Persian, then set it as your primary language.\u003C/p>\n\u003C/li>\n\n\u003Cli class=\"fmstr-cmp-rtl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-rtl-steps__title\">\u003Cspan class=\"fmstr-cmp-rtl-steps__num\" aria-hidden=\"true\">5\u003C/span>Refresh Google Forms\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-steps__body\">Reload the tab. The editor and every form you open or create is now right-to-left aligned.\u003C/p>\n\u003C/li>\n\n\u003C/ol>\n\u003Cp class=\"fmstr-cmp-rtl-steps__note\">\u003Cstrong>Limit:\u003C/strong> this only flips your own view. Respondents on default-English Google accounts still see a left-to-right form. There is no per-form RTL setting and no public link parameter that forces direction. Google's help thread \u003Ca href=\"https://support.google.com/docs/thread/198216419\">confirms this\u003C/a>.\u003C/p>\n\u003C/div>\n\n\u003Cdiv class=\"fmstr-cmp-rtl-steps__block\">\n\u003Cdiv class=\"fmstr-cmp-rtl-steps__head\">\n\u003Cspan class=\"fmstr-cmp-rtl-steps__eyebrow\">Option 2, Formester native\u003C/span>\n\u003Ch2 class=\"fmstr-cmp-rtl-steps__h2\">How to make a native RTL form in Formester (4 steps)\u003C/h2>\n\u003Cp class=\"fmstr-cmp-rtl-steps__intro\">Under two minutes if you start from a finished English form. Every respondent sees the form in their own script, with proper alignment, no CSS.\u003C/p>\n\u003C/div>\n\u003Col class=\"fmstr-cmp-rtl-steps__list\">\n\n\u003Cli class=\"fmstr-cmp-rtl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-rtl-steps__title\">\u003Cspan class=\"fmstr-cmp-rtl-steps__num\" aria-hidden=\"true\">1\u003C/span>Build your base form in your primary language\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-steps__body\">Log in to Formester. Start from scratch with the \u003Ca href=\"/ai-form-generator/\">AI form builder\u003C/a> (paste a prompt or a list of questions) or open an existing form. Build it in whichever language is easiest for you; AI translation handles the rest.\u003C/p>\n\u003C/li>\n\n\u003Cli class=\"fmstr-cmp-rtl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-rtl-steps__title\">\u003Cspan class=\"fmstr-cmp-rtl-steps__num\" aria-hidden=\"true\">2\u003C/span>Toggle Multilanguage on\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-steps__body\">Open the form's Advanced settings panel. Find the Multilanguage toggle and switch it on. This unlocks the language picker and adds a dropdown for respondents.\u003C/p>\n\u003C/li>\n\n\u003Cli class=\"fmstr-cmp-rtl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-rtl-steps__title\">\u003Cspan class=\"fmstr-cmp-rtl-steps__num\" aria-hidden=\"true\">3\u003C/span>Add an RTL language and let AI translate\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-steps__body\">Click Add Language. Pick Arabic, Hebrew, Urdu, Persian, Pashto, or any of the 180+ supported languages. Click Translate with AI. The pass runs across every question, option, placeholder, and helper text. Alignment flips to RTL where it needs to. Review, edit, save.\u003C/p>\n\u003C/li>\n\n\u003Cli class=\"fmstr-cmp-rtl-steps__item\">\n\u003Ch3 class=\"fmstr-cmp-rtl-steps__title\">\u003Cspan class=\"fmstr-cmp-rtl-steps__num\" aria-hidden=\"true\">4\u003C/span>Preview, test on mobile, share\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-steps__body\">Hit Preview. Switch to Arabic or Hebrew from the language picker; alignment flips, the submit button moves to the left of the row. Test on mobile (RTL is where most builders fail). Share by public link, QR code, or one of the \u003Ca href=\"/features/embed-forms/\">six embed modes\u003C/a> on your site, WordPress, Webflow, Shopify, Wix, or Canva.\u003C/p>\n\u003C/li>\n\n\u003C/ol>\n\u003C/div>\n\n\u003Cdiv class=\"fmstr-cmp-rtl-steps__block\">\n\u003Cdiv class=\"fmstr-cmp-rtl-steps__head\">\n\u003Cspan class=\"fmstr-cmp-rtl-steps__eyebrow\">Option 3, developers\u003C/span>\n\u003Ch2 class=\"fmstr-cmp-rtl-steps__h2\">Building your own form? The dir=\"rtl\" snippet\u003C/h2>\n\u003Cp class=\"fmstr-cmp-rtl-steps__intro\">Plain HTML. The \u003Ca href=\"https://www.w3.org/International/questions/qa-html-dir\">W3C-documented attribute\u003C/a> is \u003Ccode>dir=\"rtl\"\u003C/code> on the form element (or a parent like \u003Ccode>body\u003C/code>).\u003C/p>\n\u003C/div>\n\u003Cpre class=\"fmstr-cmp-rtl-steps__code\">&lt;form dir=\"rtl\" lang=\"ar\"&gt;\n  &lt;label for=\"name\"&gt;الاسم&lt;/label&gt;\n  &lt;input type=\"text\" id=\"name\" name=\"name\" /&gt;\n\n  &lt;label for=\"email\"&gt;البريد الإلكتروني&lt;/label&gt;\n  &lt;input type=\"email\" id=\"email\" name=\"email\" /&gt;\n\n  &lt;button type=\"submit\"&gt;إرسال&lt;/button&gt;\n&lt;/form&gt;\u003C/pre>\n\u003Cp class=\"fmstr-cmp-rtl-steps__note\">\u003Cstrong>The \u003Ccode>lang\u003C/code> attribute matters as much as \u003Ccode>dir\u003C/code>.\u003C/strong> Screen readers, search engines, and font-fallback all read it. Use \u003Ccode>lang=\"ar\"\u003C/code> for Arabic, \u003Ccode>lang=\"he\"\u003C/code> for Hebrew, \u003Ccode>lang=\"ur\"\u003C/code> for Urdu, \u003Ccode>lang=\"fa\"\u003C/code> for Persian. For mixed-direction content (a Latin-script brand name inside Arabic body), wrap it in \u003Ccode>&lt;bdi&gt;\u003C/code> so the bidirectional algorithm does not flip it incorrectly.\u003C/p>\n\u003C/div>\n\n\u003C/div>\n\u003C/section>\n\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/style>\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\">Native RTL\u003C/span>\n\u003Ch2 class=\"fmstr-cmp-tmpl-midcta__h2\" id=\"fmstr-cmp-tmpl-midcta-h2\">Build RTL forms in Arabic, Hebrew, Urdu and 180 more languages\u003C/h2>\n\u003Cp class=\"fmstr-cmp-tmpl-midcta__body\">Toggle multilanguage, AI translates and aligns RTL automatically. Built-in language switcher for respondents.\u003C/p>\n\u003Ca class=\"fmstr-cmp-tmpl-midcta__cta\" href=\"https://app.formester.com/users/sign_up\" style=\"background: #7f56d9 !important; color: #ffffff !important; border-color: #7f56d9 !important; text-decoration: none !important;\">Start free on Formester\u003C/a>\n\u003Cp class=\"fmstr-cmp-tmpl-midcta__strip\">Free forever plan\u003Cspan>&bull;\u003C/span>No credit card\u003Cspan>&bull;\u003C/span>Setup in 2 minutes\u003C/p>\n\u003C/div>\n\u003C/div>\n\u003C/div>\n\u003C/section>\n\n\u003Cstyle>\n/* host-link-override */\n.fmstr-cmp-rtl-faq a { text-decoration: none !important; }\n.fmstr-cmp-rtl-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-rtl-faq *, .fmstr-cmp-rtl-faq *::before, .fmstr-cmp-rtl-faq *::after { box-sizing: border-box; }\n.fmstr-cmp-rtl-faq__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-rtl-faq__h2 { font-size: clamp(26px, 3vw, 36px); font-weight: 700; line-height: 1.15; letter-spacing: -.02em; margin: 0; color: var(--c-fg-1); text-align: left; }\n.fmstr-cmp-rtl-faq__intro { color: var(--c-fg-3); font-size: 17px; line-height: 1.6; margin: 14px 0 28px; text-align: left; }\n.fmstr-cmp-rtl-faq__list { display: flex; flex-direction: column; gap: 12px; }\n.fmstr-cmp-rtl-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-rtl-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-rtl-faq__item > summary::-webkit-details-marker { display: none; }\n.fmstr-cmp-rtl-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/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' 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'/%3E%3C/svg%3E\");\nbackground-repeat: no-repeat; background-position: center;\ntransition: transform .15s ease, background-color .15s ease;\n}\n.fmstr-cmp-rtl-faq__item[open] > summary::before { transform: rotate(180deg); background-color: var(--c-tint); }\n.fmstr-cmp-rtl-faq__item[open] > summary { color: var(--c-violet-600) !important; }\n.fmstr-cmp-rtl-faq__answer { padding: 0 22px 22px 64px; color: var(--c-fg-2); font-size: 15.5px; line-height: 1.7; }\n.fmstr-cmp-rtl-faq__answer a { color: var(--c-violet-600) !important; text-decoration: none !important; }\n.fmstr-cmp-rtl-faq__answer a:hover { text-decoration: underline !important; }\n.fmstr-cmp-rtl-faq__answer code {\nbackground: var(--c-chip-bg); padding: 2px 6px; border-radius: 6px;\nfont-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\nfont-size: 13.5px;\n}\n\n@media (max-width: 760px) {\n.fmstr-cmp-rtl-faq { padding: 40px 16px; }\n.fmstr-cmp-rtl-faq__intro { font-size: 15.5px; text-align: left; }\n.fmstr-cmp-rtl-faq__item > summary { padding: 16px 16px; font-size: 15.5px; gap: 12px; }\n.fmstr-cmp-rtl-faq__item > summary::before { width: 26px; height: 26px; }\n.fmstr-cmp-rtl-faq__answer { padding: 0 16px 18px 16px; font-size: 15px; line-height: 1.65; }\n}\n\n\n/* mobile-safety-v2 */\n.fmstr-cmp-rtl-faq img, .fmstr-cmp-rtl-faq table, .fmstr-cmp-rtl-faq pre, .fmstr-cmp-rtl-faq iframe, .fmstr-cmp-rtl-faq video { max-width: 100%; }\n.fmstr-cmp-rtl-faq > * { min-width: 0; }\n.fmstr-cmp-rtl-faq [class*='__grid'] > *, .fmstr-cmp-rtl-faq [class*='__list'] > *, .fmstr-cmp-rtl-faq [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-rtl-faq pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-rtl-faq table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\u003C/style>\n\n\u003Csection class=\"fmstr-cmp-rtl-faq\" aria-labelledby=\"fmstr-cmp-rtl-faq-h2\">\n\u003Cdiv class=\"fmstr-cmp-rtl-faq__container\">\n\u003Ch2 class=\"fmstr-cmp-rtl-faq__h2\" id=\"fmstr-cmp-rtl-faq-h2\">Frequently asked questions\u003C/h2>\n\u003Cp class=\"fmstr-cmp-rtl-faq__intro\">The most-searched questions on Google Forms RTL, native RTL builders, and mixing English with Arabic, Hebrew, Urdu, or Persian in a single form.\u003C/p>\n\u003Cdiv class=\"fmstr-cmp-rtl-faq__list\">\n\n\u003Cdetails class=\"fmstr-cmp-rtl-faq__item\">\n\u003Csummary>Does Google Forms officially support right to left?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-rtl-faq__answer\">No. Google has not shipped an RTL setting. The only workaround is to change your Google account's Forms language to Hebrew or Arabic, which flips the form direction in your own editor and preview. Respondents on default-English Google accounts still see a left-to-right form. The Google help thread confirms this.\u003C/div>\n\u003C/details>\n\n\u003Cdetails class=\"fmstr-cmp-rtl-faq__item\">\n\u003Csummary>What other form builders support RTL natively?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-rtl-faq__answer\">Three with first-class RTL support: Formester (toggle Multilanguage, pick an RTL language, AI translates and aligns), Fillout (per-form Right-to-left toggle in settings), and Jotform (paste a custom CSS block in the Form Designer). forms.app and Gravity Forms also have RTL support but require setup beyond a single toggle.\u003C/div>\n\u003C/details>\n\n\u003Cdetails class=\"fmstr-cmp-rtl-faq__item\">\n\u003Csummary>How do I add a Hebrew or Arabic form to my website?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-rtl-faq__answer\">Build the form in a native RTL builder (Formester, Fillout, or Jotform), then embed it. In Formester, click Share, pick one of the six embed modes, and paste the snippet into your site or CMS. The form keeps its RTL alignment inside the iframe.\u003C/div>\n\u003C/details>\n\n\u003Cdetails class=\"fmstr-cmp-rtl-faq__item\">\n\u003Csummary>Can I have one form with both English and Arabic versions?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-rtl-faq__answer\">Yes, in any builder with a multilanguage feature. Formester ships a language picker that lets the respondent switch between English, Arabic, Hebrew, or any combination of the 180+ supported languages. Google Forms does not have a native multilanguage feature, so you would build separate forms per language.\u003C/div>\n\u003C/details>\n\n\u003Cdetails class=\"fmstr-cmp-rtl-faq__item\">\n\u003Csummary>Does the Google Forms language hack work for respondents too?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-rtl-faq__answer\">No. The account-language setting is per-Google-account. Each respondent sees the form in their own account's language, not yours. There is no documented way to force RTL on the respondent's view through Google Forms.\u003C/div>\n\u003C/details>\n\n\u003Cdetails class=\"fmstr-cmp-rtl-faq__item\">\n\u003Csummary>Which RTL languages does Formester support?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-rtl-faq__answer\">Formester's AI translation covers 180+ languages, including Arabic, Hebrew, Urdu, Persian (Farsi and Dari), Pashto, Sindhi, and Kurdish (Sorani). The RTL alignment applies automatically whenever the selected language is RTL.\u003C/div>\n\u003C/details>\n\n\u003Cdetails class=\"fmstr-cmp-rtl-faq__item\">\n\u003Csummary>Will my form work on mobile in RTL?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-rtl-faq__answer\">Yes, in any builder with native RTL. The Formester layout adjusts at every breakpoint: touch targets, submit button placement, and label alignment all stay correct. The Google Forms workaround works on mobile too, but only for your own view; respondents on default-LTR accounts still see LTR.\u003C/div>\n\u003C/details>\n\n\u003Cdetails class=\"fmstr-cmp-rtl-faq__item\">\n\u003Csummary>Can I use dir=\"rtl\" in HTML to make my own form RTL?\u003C/summary>\n\u003Cdiv class=\"fmstr-cmp-rtl-faq__answer\">Yes. Set \u003Ccode>dir=\"rtl\"\u003C/code> on the \u003Ccode>form\u003C/code> element (or a parent) and pair it with the right \u003Ccode>lang\u003C/code> attribute (\u003Ccode>ar\u003C/code>, \u003Ccode>he\u003C/code>, \u003Ccode>ur\u003C/code>, \u003Ccode>fa\u003C/code>). The W3C documentation covers edge cases like mixed-direction content (use \u003Ccode>&lt;bdi&gt;\u003C/code> for Latin-script names inside an RTL body).\u003C/div>\n\u003C/details>\n\n\u003C/div>\n\u003C/div>\n\u003C/section>\n\n\n\u003Cstyle>\n/* host-link-override */\n.fmstr-cmp-rtl-rel a { text-decoration: none !important; }\n.fmstr-cmp-rtl-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-rtl-rel *, .fmstr-cmp-rtl-rel *::before, .fmstr-cmp-rtl-rel *::after { box-sizing: border-box; }\n.fmstr-cmp-rtl-rel__container { max-width: 1200px; margin: 0 auto; }\n.fmstr-cmp-rtl-rel__head { margin: 0 0 28px; text-align: left; }\n.fmstr-cmp-rtl-rel__h2 { font-size: clamp(26px, 3vw, 36px); font-weight: 700; line-height: 1.15; letter-spacing: -.02em; margin: 0; color: var(--c-fg-1); text-align: left; }\n.fmstr-cmp-rtl-rel__intro { color: var(--c-fg-3); font-size: 17px; line-height: 1.6; margin: 14px 0 0; text-align: left; }\n\n.fmstr-cmp-rtl-rel__grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }\n.fmstr-cmp-rtl-rel__card {\nbackground: var(--c-card); border: 1px solid var(--c-border);\nborder-radius: 14px; padding: 22px 24px; display: flex; flex-direction: column; gap: 8px;\ntext-decoration: none !important; color: inherit !important; transition: all .15s ease;\nposition: relative;\n}\n.fmstr-cmp-rtl-rel__card:hover { border-color: var(--c-edge); box-shadow: var(--c-shadow); transform: translateY(-1px); }\n.fmstr-cmp-rtl-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) !important; font-size: 11.5px; font-weight: 600; letter-spacing: .02em;\ntext-transform: uppercase; align-self: flex-start;\nmargin-bottom: 2px;\n}\n.fmstr-cmp-rtl-rel__title {\nfont-size: 17px; font-weight: 700; color: var(--c-fg-1); margin: 0; line-height: 1.3; text-align: left; }\n.fmstr-cmp-rtl-rel__body { font-size: 14.5px; line-height: 1.55; color: var(--c-fg-2); margin: 0; }\n.fmstr-cmp-rtl-rel__arrow {\nmargin-top: 6px; color: var(--c-violet-600) !important; font-size: 14px; font-weight: 600;\ndisplay: inline-flex; align-items: center; gap: 6px;\n}\n.fmstr-cmp-rtl-rel__arrow::after {\ncontent: \"\\2192\"; transition: transform .15s ease; display: inline-block;\n}\n.fmstr-cmp-rtl-rel__card:hover .fmstr-cmp-rtl-rel__arrow::after { transform: translateX(3px); }\n\n@media (max-width: 540px) {\n.fmstr-cmp-rtl-rel { padding: 40px 16px; }\n.fmstr-cmp-rtl-rel__grid { grid-template-columns: 1fr; gap: 12px; }\n.fmstr-cmp-rtl-rel__card { padding: 20px 22px; }\n}\n\n\n/* mobile-safety-v2 */\n.fmstr-cmp-rtl-rel img, .fmstr-cmp-rtl-rel table, .fmstr-cmp-rtl-rel pre, .fmstr-cmp-rtl-rel iframe, .fmstr-cmp-rtl-rel video { max-width: 100%; }\n.fmstr-cmp-rtl-rel > * { min-width: 0; }\n.fmstr-cmp-rtl-rel [class*='__grid'] > *, .fmstr-cmp-rtl-rel [class*='__list'] > *, .fmstr-cmp-rtl-rel [class*='__cards'] > * { min-width: 0; max-width: 100%; }\n@media (max-width: 540px) {\n  .fmstr-cmp-rtl-rel pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }\n  .fmstr-cmp-rtl-rel table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }\n}\n\u003C/style>\n\n\u003Csection class=\"fmstr-cmp-rtl-rel\" aria-labelledby=\"fmstr-cmp-rtl-rel-h2\">\n\u003Cdiv class=\"fmstr-cmp-rtl-rel__container\">\n\u003Cdiv class=\"fmstr-cmp-rtl-rel__head\">\n\u003Ch2 class=\"fmstr-cmp-rtl-rel__h2\" id=\"fmstr-cmp-rtl-rel-h2\">Keep reading\u003C/h2>\n\u003Cp class=\"fmstr-cmp-rtl-rel__intro\">Sister guides on multilingual forms, Google Forms alternatives, and embedding forms across the stack.\u003C/p>\n\u003C/div>\n\u003Cdiv class=\"fmstr-cmp-rtl-rel__grid\">\n\n\u003Ca class=\"fmstr-cmp-rtl-rel__card\" href=\"/ai-powered-multilingual-forms/\">\n\u003Cspan class=\"fmstr-cmp-rtl-rel__chip\">Feature page\u003C/span>\n\u003Ch3 class=\"fmstr-cmp-rtl-rel__title\">AI-powered multilingual forms (180+ languages)\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-rel__body\">The full breakdown of how Formester's translation pass works, every supported language, and the language switcher respondents see.\u003C/p>\n\u003Cspan class=\"fmstr-cmp-rtl-rel__arrow\">Read the guide\u003C/span>\n\u003C/a>\n\n\u003Ca class=\"fmstr-cmp-rtl-rel__card\" href=\"/google-forms-alternative/\">\n\u003Cspan class=\"fmstr-cmp-rtl-rel__chip\">Switching guide\u003C/span>\n\u003Ch3 class=\"fmstr-cmp-rtl-rel__title\">Google Forms alternatives\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-rel__body\">Side-by-side comparison of the builders worth switching to when Google Forms falls short on RTL, branding, conditional logic, or payments.\u003C/p>\n\u003Cspan class=\"fmstr-cmp-rtl-rel__arrow\">Compare builders\u003C/span>\n\u003C/a>\n\n\u003Ca class=\"fmstr-cmp-rtl-rel__card\" href=\"/blog/how-to-add-conditional-questions-in-google-forms/\">\n\u003Cspan class=\"fmstr-cmp-rtl-rel__chip\">Google Forms cluster\u003C/span>\n\u003Ch3 class=\"fmstr-cmp-rtl-rel__title\">How to add conditional logic in Google Forms\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-rel__body\">Walk-through for branching a Google Form by answer, plus where the section-based logic hits its limits.\u003C/p>\n\u003Cspan class=\"fmstr-cmp-rtl-rel__arrow\">Read the tutorial\u003C/span>\n\u003C/a>\n\n\u003Ca class=\"fmstr-cmp-rtl-rel__card\" href=\"/blog/how-to-embed-forms-in-wix-studio/\">\n\u003Cspan class=\"fmstr-cmp-rtl-rel__chip\">Embed guide\u003C/span>\n\u003Ch3 class=\"fmstr-cmp-rtl-rel__title\">How to embed forms in Wix, WordPress, and Webflow\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-rel__body\">Six embed modes (inline, popup, sidebar, side tab, popover, fullscreen), what each one does, and which one fits your page.\u003C/p>\n\u003Cspan class=\"fmstr-cmp-rtl-rel__arrow\">Read the guide\u003C/span>\n\u003C/a>\n\n\u003Ca class=\"fmstr-cmp-rtl-rel__card\" href=\"/features/conditional-logic/\">\n\u003Cspan class=\"fmstr-cmp-rtl-rel__chip\">Feature page\u003C/span>\n\u003Ch3 class=\"fmstr-cmp-rtl-rel__title\">Conditional logic in Formester\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-rel__body\">Show or hide sections based on the language a respondent picks, then route follow-ups to the right team.\u003C/p>\n\u003Cspan class=\"fmstr-cmp-rtl-rel__arrow\">See how it works\u003C/span>\n\u003C/a>\n\n\u003Ca class=\"fmstr-cmp-rtl-rel__card\" href=\"/features/autoresponder-email/\">\n\u003Cspan class=\"fmstr-cmp-rtl-rel__chip\">Feature page\u003C/span>\n\u003Ch3 class=\"fmstr-cmp-rtl-rel__title\">Autoresponder emails\u003C/h3>\n\u003Cp class=\"fmstr-cmp-rtl-rel__body\">Send the confirmation, receipt, or follow-up in the same language the respondent filled the form in.\u003C/p>\n\u003Cspan class=\"fmstr-cmp-rtl-rel__arrow\">See how it works\u003C/span>\n\u003C/a>\n\n\u003C/div>\n\u003C/div>\n\u003C/section>\n\n","2025-07-31T17:39:19.111Z","2026-06-15T04:46:55.621Z","2026-06-15T04:46:55.613Z","https://formester-strapi.s3.ap-south-1.amazonaws.com/75_e6bfe24fc4.png",[],[82],{"id":83,"type":84},176,{"@graph":85,"@context":194},[86,100,115,134,150,187],{"@id":87,"@type":88,"image":79,"author":89,"headline":67,"publisher":92,"description":96,"dateModified":97,"datePublished":98,"mainEntityOfPage":99},"https://formester.com/blog/how-to-create-right-to-left-forms/#article","BlogPosting",{"name":90,"@type":91},"Formester","Organization",{"logo":93,"name":90,"@type":91},{"url":94,"@type":95},"https://formester.com/logo.png","ImageObject","Google Forms has no official RTL setting. Here is the language workaround that flips your forms right to left, a language-by-language guide (Arabic, Hebrew, Urdu, Persian, Pashto), and three form builders with native RTL support.","2026-06-11","2025-07-31","https://formester.com/blog/how-to-create-right-to-left-forms/",{"@id":101,"@type":102,"itemListElement":103},"https://formester.com/blog/how-to-create-right-to-left-forms/#breadcrumb","BreadcrumbList",[104,109,113],{"item":105,"name":106,"@type":107,"position":108},"https://formester.com/","Home","ListItem",1,{"item":110,"name":111,"@type":107,"position":112},"https://formester.com/blog/","Blog",2,{"item":99,"name":69,"@type":107,"position":114},3,{"name":116,"step":117,"@type":132,"description":133},"How to flip Google Forms to right to left (language workaround)",[118,122,125,128],{"name":119,"text":120,"@type":121,"position":108},"Open Google Forms","Sign in to forms.google.com with the Google account you build forms with.","HowToStep",{"name":123,"text":124,"@type":121,"position":112},"Open Google Account settings","Click your profile icon, then Manage your Google Account, then Personal info, then Language.",{"name":126,"text":127,"@type":121,"position":114},"Add an RTL language","Add Arabic, Hebrew, Urdu, or Persian and set it as primary.",{"name":129,"text":130,"@type":121,"position":131},"Refresh Google Forms","Reload forms.google.com. The editor and every form you open or create defaults to RTL.",4,"HowTo","Change your Google account's Forms language to an RTL language (Arabic, Hebrew, Urdu, Persian) to flip the form editor to right-to-left alignment.",{"name":135,"step":136,"@type":132,"description":149},"How to make a native RTL form in Formester",[137,140,143,146],{"name":138,"text":139,"@type":121,"position":108},"Build your base form","Use the AI form builder or open an existing form.",{"name":141,"text":142,"@type":121,"position":112},"Toggle Multilanguage on","Open Advanced settings and switch Multilanguage on.",{"name":144,"text":145,"@type":121,"position":114},"Add an RTL language and translate","Click Add Language, pick Arabic, Hebrew, Urdu, or Persian, then click Translate with AI.",{"name":147,"text":148,"@type":121,"position":131},"Preview and share","Hit Preview, test on mobile, then share by link, QR code, or one of the six embed modes.","Build a form once, add Arabic, Hebrew, Urdu, or Persian as a language, AI translates and aligns RTL.",{"@type":151,"mainEntity":152},"FAQPage",[153,159,163,167,171,175,179,183],{"name":154,"@type":155,"acceptedAnswer":156},"Does Google Forms officially support right to left?","Question",{"text":157,"@type":158},"No. Google has not shipped an RTL setting. The only workaround is to change your Google account's Forms language to an RTL language, which flips the form direction in your own editor and preview. Respondents on default-English Google accounts still see a left-to-right form.","Answer",{"name":160,"@type":155,"acceptedAnswer":161},"What other form builders support RTL natively?",{"text":162,"@type":158},"Formester (toggle Multilanguage, pick an RTL language, AI translates and aligns), Fillout (per-form Right-to-left toggle), and Jotform (paste a custom CSS block) all support RTL. forms.app and Gravity Forms also offer RTL with setup beyond a single toggle.",{"name":164,"@type":155,"acceptedAnswer":165},"How do I add a Hebrew or Arabic form to my website?",{"text":166,"@type":158},"Build the form in a native RTL builder (Formester, Fillout, or Jotform), then embed it. In Formester, click Share and pick from six embed modes (inline, popup, sidebar, side tab, popover, fullscreen). The form keeps its RTL alignment inside the iframe.",{"name":168,"@type":155,"acceptedAnswer":169},"Can I have one form with both English and Arabic versions?",{"text":170,"@type":158},"Yes, in any builder with a multilanguage feature. Formester ships a language picker that lets respondents switch between English, Arabic, Hebrew, or any combination of 180+ languages. Google Forms does not have a native multilanguage feature.",{"name":172,"@type":155,"acceptedAnswer":173},"Does the Google Forms language hack work for respondents?",{"text":174,"@type":158},"No. The account-language setting is per-Google-account. Each respondent sees the form in their own account's language, not yours.",{"name":176,"@type":155,"acceptedAnswer":177},"Which RTL languages does Formester support?",{"text":178,"@type":158},"Formester's AI translation covers 180+ languages including Arabic, Hebrew, Urdu, Persian (Farsi and Dari), Pashto, Sindhi, and Kurdish (Sorani). RTL alignment applies automatically when the language is RTL.",{"name":180,"@type":155,"acceptedAnswer":181},"Will my form work on mobile in RTL?",{"text":182,"@type":158},"Yes, in any builder with native RTL. Touch targets, submit button placement, and label alignment all stay correct at every breakpoint.",{"name":184,"@type":155,"acceptedAnswer":185},"Can I use dir=rtl in HTML to make my own form RTL?",{"text":186,"@type":158},"Yes. Set dir=rtl on the form element (or a parent) and pair it with the right lang attribute (ar, he, ur, fa). For mixed-direction content like Latin-script brand names inside an RTL body, wrap them in bdi tags.",{"name":188,"@type":189,"embedUrl":190,"contentUrl":191,"uploadDate":98,"description":192,"thumbnailUrl":193},"How to Create Right to Left Forms in Formester","VideoObject","https://www.youtube.com/embed/ccDNyDT8XDw","https://www.youtube.com/watch?v=ccDNyDT8XDw","4-step walkthrough of building a multilingual RTL form in Formester with AI translation.","https://i.ytimg.com/vi/ccDNyDT8XDw/hqdefault.jpg","https://schema.org",1570,{"text":197},"9 min read",{"title":199,"description":200,"metaTitle":201,"metaDescription":202,"keywords":203,"author":71,"authorProfile":72,"coverImgAlt":204,"featured":14,"slug":205,"body":206,"createdAt":207,"updatedAt":208,"publishedAt":209,"coverImg":210,"metaImage":211,"schema":212,"id":213,"coverImgWidth":44,"coverImgHeight":45,"readingStats":214},"How to Embed Forms in Wix Studio (Step-by-Step Guide!)","Learn how to embed forms in wix studio, whether it’s a simple contact form or an online order form, after this tutorial you’ll be able to add any kind of form to your wix website.","How to Embed Forms in Wix Studio? | Formester","Learn how to embed forms in wix studio, after this guide you’ll be able to add any kind of form to your wix website.\n","how to embed forms in wix studio,\nwix forms,\nwix form builder,\nembed forms,\nadd forms to wix website,\n","an illustration of how to embed forms in wix studio","how-to-embed-forms-in-wix-studio","\u003Cp style=\"font-size: inherit;\">There are two ways to put a form on a Wix or Wix Studio site: use the form tool Wix ships with, or embed a form built somewhere else. The first is fast for a basic contact form. The second wins the moment you need file uploads, multiple pages, or payments.\u003C/p>\n\n\u003Cp>This guide walks both. You will see the native Wix steps, the Formester embed steps, and a plain comparison so you can pick without guessing. If you just want the short version: native Wix is fine for simple forms, and an embedded form builder covers everything Wix locks behind a plan.\u003C/p>\n\n\u003Ch2>Why Embed a Form Instead of Linking Out\u003C/h2>\n\n\u003Cp>Every time you send a visitor to an off-site form, you lose people. A new tab, a slow load, a mismatched design: each one is a reason to abandon. An embedded form keeps the action on the page the visitor already trusts.\u003C/p>\n\n\u003Cp>The jobs are familiar. Contact requests, order placements, customer feedback, event signups. The difference is whether your form builder can handle them without forcing an upgrade or a redirect. Pick the \u003Ca href=\"https://formester.com/blog/best-form-builders-for-wix-website/\">right form builder for Wix\u003C/a> and these interactions just work.\u003C/p>\n\n\u003Ch2>Native Wix Forms vs a Third-Party Builder\u003C/h2>\n\n\u003Cp>Wix's built-in builder is the right call when the form is short and the goal is speed. Drag it in, label the fields, publish. Done.\u003C/p>\n\n\u003Cp>A third-party builder earns its place the moment the form grows up. Multi-page flows, file uploads, conditional logic, payment collection, and analytics that show where people drop off. Here is the honest split before the steps:\u003C/p>\n\n\u003Cdiv class=\"table-wrap\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\u003Cth>Capability\u003C/th>\u003Cth>Native Wix forms\u003C/th>\u003Cth>Formester\u003C/th>\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\u003Ctd>Form pages\u003C/td>\u003Ctd>Single-page only\u003C/td>\u003Ctd>Multi-page forms with one field per page and progress indicators\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd>File uploads\u003C/td>\u003Ctd>Premium-only\u003C/td>\u003Ctd>Included on every plan, with admin-set file types, size limits, and camera capture\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd>Free-plan cap\u003C/td>\u003Ctd>Four forms\u003C/td>\u003Ctd>10 forms and 100 responses a month\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd>Payments\u003C/td>\u003Ctd>Routes through its own checkout\u003C/td>\u003Ctd>Stripe or PayPal fields directly in the form\u003C/td>\u003C/tr>\n\u003Ctr>\u003Ctd>Analytics\u003C/td>\u003Ctd>Shows submissions\u003C/td>\u003Ctd>Completion rate, drop-off pages, and per-field summaries\u003C/td>\u003C/tr>\n\u003C/tbody>\n\u003C/table>\n\u003C/div>\n\n\u003Cp>Neither is wrong. The table just tells you which job you are doing.\u003C/p>\n\n\u003Ch2>Method 1: Build a Form With Wix's Native Builder\u003C/h2>\n\n\u003Ch3>Step 1: Add a form section\u003C/h3>\n\n\u003Cp>Open the Wix Studio Editor, click \"+ Add,\" and choose \"Section.\" Go to \"Contact and Forms,\" then pick a template or start from scratch. Customize the fields, labels, and settings to fit the page.\u003C/p>\n\n\u003Ch3>Step 2: Place an existing form\u003C/h3>\n\n\u003Cp>Already have a form? Select it, drag it where you want it, then resize it to fit your layout. Wix's drag-and-drop keeps the placement simple.\u003C/p>\n\n\u003Ch3>Step 3: Know the limits before you commit\u003C/h3>\n\n\u003Cp>Wix's native builder is friendly but boxed in. File uploads and e-signatures need a premium plan. Forms are single-page only, which is tight for anything longer than a contact request. The free plan caps you at four forms.\u003C/p>\n\n\u003Ch3>Step 4: Review submissions\u003C/h3>\n\n\u003Cp>Go to your Wix Dashboard, open \"Customers and Leads,\" then \"Forms and Submissions\" to see what came in. You get the raw responses, but not drop-off or completion analytics.\u003C/p>\n\n\u003Ch2>Method 2: Embed a Formester Form in Wix Studio\u003C/h2>\n\n\u003Cp>If you need the things Wix locks down, build the form in Formester and embed it. The form lives on your Wix page, but the builder, the fields, and the analytics all come from Formester.\u003C/p>\n\n\u003Ch3>Step 1: Build the form in Formester\u003C/h3>\n\n\u003Cp>Add the fields you need: text, dropdowns, checkboxes, file upload, payment, signature, scheduler. Match your brand with custom colors, fonts, and layout, or use a saved branding kit so every form stays on-brand.\u003C/p>\n\n\u003Ch3>Step 2: Copy the embed code\u003C/h3>\n\n\u003Cp>Open the \"Share\" or \"Embed\" section in Formester and pick a mode: standard, popup, sidebar, side tab, popover, or fullscreen. Copy the generated snippet.\u003C/p>\n\n\u003Ch3>Step 3: Paste it into Wix\u003C/h3>\n\n\u003Cp>In the Wix Studio Editor, add an \"Embedded HTML\" element where you want the form, then paste the Formester code. Publish, and the form renders inline on your live page. Formester also ships a native Wix share option if you prefer a guided connect over raw HTML.\u003C/p>\n\n\u003Ch3>Step 4: Read the results\u003C/h3>\n\n\u003Cp>Open the \"Results\" tab in Formester to see submissions, completion rate, and drop-off pages. That is the difference from native Wix: you can see not just who submitted, but where people quit.\u003C/p>\n\n\u003Ch2>Which Should You Use\u003C/h2>\n\n\u003Cp>Use native Wix when the form is short, the fields are basic, and you want it live in five minutes.\u003C/p>\n\n\u003Cp>Use an embedded \u003Ca href=\"https://formester.com/plugins/wix-forms/\">Formester form\u003C/a> when you need multi-page forms, file uploads, payments, conditional logic, or analytics that show where people drop off. The embed takes the same five minutes; you just get a lot more form.\u003C/p>\n\n\u003Ch2>Forms for Specific Jobs on Wix\u003C/h2>\n\n\u003Ch3>Contact and lead forms\u003C/h3>\n\n\u003Cp>For a standard inquiry form, either tool works. If you want spam protection and instant routing to email or a CRM, embed a Formester form and connect it to HubSpot, Google Sheets, or Slack. Start from a \u003Ca href=\"https://formester.com/templates/categories/contact-forms/\">contact form template\u003C/a>.\u003C/p>\n\n\u003Ch3>Forms with file uploads\u003C/h3>\n\n\u003Cp>Wix gates file uploads behind a premium plan. A \u003Ca href=\"https://formester.com/features/file-upload-forms/\">Formester file upload form\u003C/a> includes uploads on every plan, with admin-set file types, size limits, and camera capture, then embeds into Wix the same way.\u003C/p>\n\n\u003Ch3>Payment and order forms\u003C/h3>\n\n\u003Cp>To take money on a Wix page without sending people to a separate checkout, add a Stripe or PayPal field in Formester and embed the form. See \u003Ca href=\"https://formester.com/features/online-payments/\">online payments\u003C/a> for the field setup.\u003C/p>\n\n\u003Ch3>Multi-page and dynamic forms\u003C/h3>\n\n\u003Cp>Wix forms are single-page. When you need a longer flow that adapts to answers, build a multi-page form with conditional logic in Formester and embed it. The visitor sees one clean form; you keep the logic behind it.\u003C/p>\n\n\u003Ch2>Pick the Right Form for the Job\u003C/h2>\n\n\u003Cp>Match the tool to the task. Simple contact form, basic fields, fast turnaround: Wix's native builder does the job. Multi-page flows, file uploads, payments, or analytics that show where people drop off: build it in Formester and embed it.\u003C/p>\n\n\u003Cp>Either way, embedding keeps the form on the page your visitors already trust, which is where conversions actually happen. \u003Ca href=\"https://app.formester.com/users/sign_up/\">Build your first form free\u003C/a> and embed it on your Wix site in minutes.\u003C/p>\n\n\u003Csection class=\"faq\">\n\u003Ch2>Wix Forms FAQ\u003C/h2>\n\u003Cdetails>\u003Csummary>Can you embed a third-party form in Wix Studio?\u003C/summary>\u003Cdiv>Yes. Add an Embedded HTML element to your Wix Studio page, paste the embed code from your form builder, and the form renders inline. Formester gives you standard, popup, sidebar, side tab, popover, and fullscreen embed modes to choose from.\u003C/div>\u003C/details>\n\u003Cdetails>\u003Csummary>What are the limits of Wix's built-in form builder?\u003C/summary>\u003Cdiv>Wix's native forms are single-page only, file uploads and e-signatures need a premium plan, and the free plan caps you at four forms. For multi-page forms, file uploads, or detailed analytics, a third-party builder is usually the better fit.\u003C/div>\u003C/details>\n\u003Cdetails>\u003Csummary>How do I add a contact form with file upload to Wix?\u003C/summary>\u003Cdiv>Build the form in a tool that supports a file upload field, then embed it in Wix with an Embedded HTML element. Formester supports file upload fields with admin-set file types and size limits, plus camera capture, on every plan.\u003C/div>\u003C/details>\n\u003Cdetails>\u003Csummary>Can I collect payments through a form on my Wix site?\u003C/summary>\u003Cdiv>Yes. Build a payment form with a Stripe or PayPal field, then embed it in Wix. The visitor pays without leaving your page, and you keep all the submission data in one dashboard.\u003C/div>\u003C/details>\n\u003Cdetails>\u003Csummary>Is Wix's form builder free?\u003C/summary>\u003Cdiv>Wix offers a free form builder, but it limits you to four forms and keeps file uploads and e-signatures behind a paid plan. Formester's free plan includes 10 forms, all field types, and embed on any site.\u003C/div>\u003C/details>\n\u003C/section>\n","2025-02-03T03:43:45.751Z","2026-06-22T05:06:27.443Z","2026-06-22T05:06:22.803Z","https://formester-strapi.s3.ap-south-1.amazonaws.com/1214630_1_733d626350.png",[],[],926,{"text":215},"7 min read",1783661433501]