[{"data":1,"prerenderedAt":420},["ShallowReactive",2],{"blog-how-to\u002Fform-abandonment-field":3},{"id":4,"title":5,"body":6,"category":389,"date":390,"dateModified":390,"description":391,"draft":392,"extension":393,"faq":394,"featured":392,"keywords":403,"meta":404,"navigation":405,"ogDescription":406,"ogTitle":407,"path":408,"readTime":409,"schemaType":410,"seo":411,"sitemap":412,"stem":413,"tags":414,"twitterCard":418,"__hash__":419},"blog\u002Fblog\u002Fhow-to\u002Fform-abandonment-field.md","Form Abandonment: Find the Field Where Signups Quit",{"type":7,"value":8,"toc":379},"minimark",[9,13,21,31,36,39,46,55,59,66,102,121,131,135,138,146,161,164,168,179,187,190,196,200,203,209,212,215,218,224,230,236,240,243,271,274,278,287,293,299,356],[10,11,12],"p",{},"Forty visitors click into your signup form. Nine submit it. The other 31 saw the form, started it, and quit, and your Analytics tab cannot tell you where, because a form abandoned at question four looks the same as a form nobody wanted.",[10,14,15,16,20],{},"The fix is one ",[17,18,19],"code",{},"trackEvent()"," call per input and a funnel with one step per field. This post builds both, then shows how to read the result so you remove the right question.",[22,23,24],"tldr",{},[10,25,26,27,30],{},"OperatorStack does not track per-field form activity on its own, so you add it: fire ",[17,28,29],{},"OperatorStack.trackEvent(\"form_field_company\")"," the first time each field gets focus. Then open Analytics, go to Settings, and build a funnel with one custom step per field. The step with the largest drop from the previous one is where visitors quit.",[32,33,35],"h2",{"id":34},"what-you-can-and-cannot-see-today","What You Can and Cannot See Today",[10,37,38],{},"Your form conversion rate is one number: submissions divided by visitors who saw the page. If it reads 4%, you know the form underperforms. You do not know whether people balk at the first field, the phone number, or the submit button.",[10,40,41,42,45],{},"The embedded forms widget sends a single request to ",[17,43,44],{},"\u002Fv1\u002Fprojects\u002F{projectKey}\u002Fforms\u002F{formId}\u002Fsubmit"," when someone finishes. Nothing is sent for the people who start and stop, so the data you need does not exist until you create it.",[10,47,48,49,54],{},"Page-level drop off is a different question. If you have not ruled out the page itself, start with ",[50,51,53],"a",{"href":52},"\u002Fblog\u002Fhow-to\u002Ffind-signup-drop-off-page","finding the page that loses your signups",". Come back here once you know the page converts people into form starters but not into submitters.",[32,56,58],{"id":57},"step-1-fire-one-event-per-field","Step 1: Fire One Event per Field",[10,60,61,62,65],{},"The pattern is a ",[17,63,64],{},"focus"," listener on each input that fires its own named event once. Use a separate event name per field, because a funnel step matches an event name and not a property.",[67,68,70,85,95],"step",{"number":69},"1",[10,71,72,76,77,80,81,84],{},[73,74,75],"strong",{},"Add this script after your form."," It assumes inputs with ",[17,78,79],{},"name"," attributes and a form with the id ",[17,82,83],{},"signup",".",[86,87,93],"pre",{"className":88,"code":90,"language":91,"meta":92},[89],"language-html","\u003Cscript>\n  const form = document.getElementById(\"signup\");\n  const seen = new Set();\n\n  form.querySelectorAll(\"input, select, textarea\").forEach((el) => {\n    el.addEventListener(\"focus\", () => {\n      if (seen.has(el.name)) return;\n      seen.add(el.name);\n      window.OperatorStack.trackEvent(\"form_field_\" + el.name);\n    });\n  });\n\u003C\u002Fscript>\n","html","",[17,94,90],{"__ignoreMap":92},[10,96,97,98,101],{},"The ",[17,99,100],{},"seen"," set matters. Without it, a visitor who clicks into a field three times counts three times, and your funnel steps stop being nested.",[10,103,104,105,108,109,112,113,116,117,120],{},"If your form is a framework component, put the same listener in whatever runs after mount (",[17,106,107],{},"useEffect"," in React, ",[17,110,111],{},"onMount"," in Svelte, ",[17,114,115],{},"onMounted"," in Vue). Guard it so it never runs on the server, where ",[17,118,119],{},"window.OperatorStack"," does not exist.",[122,123,124],"warning-box",{},[10,125,126,127,130],{},"Send the field name only. Do not pass ",[17,128,129],{},"el.value"," in the metadata. An email address or a phone number in an event property is personal data you did not need and cannot easily remove later.",[32,132,134],{"id":133},"step-2-fire-the-last-event-on-submit","Step 2: Fire the Last Event on Submit",[10,136,137],{},"Focus on the final field is not the same as submitting. Add a closing event to your submit handler so the funnel ends on the real outcome:",[86,139,144],{"className":140,"code":142,"language":143,"meta":92},[141],"language-javascript","form.addEventListener(\"submit\", async (e) => {\n  e.preventDefault();\n  const data = Object.fromEntries(new FormData(form));\n\n  await window.OperatorStack.submitForm(\"your_form_key\", data);\n  window.OperatorStack.trackEvent(\"form_submitted\");\n});\n","javascript",[17,145,142],{"__ignoreMap":92},[10,147,148,151,152,156,157,160],{},[17,149,150],{},"submitForm"," takes the form key and an object of string values, and the SDK attaches the visitor id for you. If you build the form without the SDK, ",[50,153,155],{"href":154},"\u002Fblog\u002Fhow-to\u002Fcustom-forms-without-builder","posting JSON to the form endpoint directly"," works the same way. Fire ",[17,158,159],{},"form_submitted"," after either.",[10,162,163],{},"Custom events batch in short windows before sending, so allow a few seconds, up to about 30 for a brand-new event name, before you expect to see them.",[32,165,167],{"id":166},"step-3-build-the-field-funnel","Step 3: Build the Field Funnel",[10,169,170,171,174,175,178],{},"Open Analytics, then the ",[73,172,173],{},"Settings"," tab. The funnel builder lets you set steps to any event, and a custom event is written as ",[17,176,177],{},"custom:"," plus its name. Build the steps in the order the fields appear on the page:",[86,180,185],{"className":181,"code":183,"language":184},[182],"language-text","custom:form_field_email\ncustom:form_field_name\ncustom:form_field_company\ncustom:form_field_phone\ncustom:form_submitted\n","text",[17,186,183],{"__ignoreMap":92},[10,188,189],{},"Each step counts visitors who reached it, so the numbers fall left to right. The funnel is only as good as the order you type, so match your DOM order, not your database column order.",[191,192,193],"tip-box",{},[10,194,195],{},"Start the funnel with your first field, not with page views. The question here is how many of the people who started the form finished it. A page view step only repeats the page-level number you already have.",[32,197,199],{"id":198},"step-4-read-the-drop","Step 4: Read the Drop",[10,201,202],{},"Say 100 visitors started the form. The funnel reads:",[86,204,207],{"className":205,"code":206,"language":184},[182],"form_field_email      100   (start)\nform_field_name        91   -9\nform_field_company     74   -17\nform_field_phone       31   -43\nform_submitted         29   -2\n",[17,208,206],{"__ignoreMap":92},[10,210,211],{},"Two things stand out. The drop from company to phone is 43 visitors, nearly five times any other step. And once visitors passed the phone field, 29 of 31 submitted, so the button and the rest of the form are fine.",[10,213,214],{},"That reads as one decision: the phone field. Make it optional or delete it, and the form should recover most of those 43.",[10,216,217],{},"Compare a different shape:",[86,219,222],{"className":220,"code":221,"language":184},[182],"form_field_email      100\nform_field_name        96\nform_field_company     93\nform_field_phone       90\nform_submitted         12   -78\n",[17,223,221],{"__ignoreMap":92},[10,225,226,227,229],{},"Here no field is the problem. Visitors fill everything in and then do not submit. Look at the button, the submit handler, and any error shown after a failed request, not at the questions. Open the browser console first, because a thrown error in ",[17,228,150],{}," is the cheapest explanation.",[231,232,233],"info-box",{},[10,234,235],{},"A focus event means a visitor clicked into a field, not that they typed. A step can also be skipped: someone who tabs past a field still triggers focus, and someone who clicks straight to the third input never triggers the second. Treat a small dip as noise and a 30-plus point drop as a decision.",[32,237,239],{"id":238},"what-to-change-in-order","What to Change, in Order",[10,241,242],{},"When a field is the culprit, work down this list and change one thing at a time so you can credit the result.",[244,245,246,253,259,265],"ul",{},[247,248,249,252],"li",{},[73,250,251],{},"Make it optional."," You keep the data from people who want to give it and stop blocking those who do not.",[247,254,255,258],{},[73,256,257],{},"Move it after submit."," Ask for the phone number on the confirmation screen. By then you already have the email.",[247,260,261,264],{},[73,262,263],{},"Delete it."," If you could not name what you will do with the answer this week, you do not need it yet.",[247,266,267,270],{},[73,268,269],{},"Rename the label."," \"Company\" stops people who freelance. \"Company or project\" does not.",[10,272,273],{},"The rule that follows from the funnel is simple: every field should earn its drop. A field that loses 5 points has to be worth 5 points of signups to you.",[32,275,277],{"id":276},"common-mistakes","Common Mistakes",[10,279,280,283,284,286],{},[73,281,282],{},"Counting repeat focus."," Skip the ",[17,285,100],{}," check and the funnel inflates, which hides real drop-offs.",[10,288,289,292],{},[73,290,291],{},"Reading a small sample."," At 40 starters, one visitor is 2.5 points. Wait for about 100 before you delete a field.",[10,294,295,298],{},[73,296,297],{},"Judging mobile and desktop together."," A phone field that loses 43 visitors on mobile, where the keyboard switches layout, may lose almost none on desktop. If the split matters, compare the funnel across the 7d and 30d ranges after you ship a change to see which way it moved.",[300,301,302,309,318,336,350],"faq-section",{},[303,304,306],"faq-item",{"question":305},"How do I find out which form field people abandon?",[10,307,308],{},"Fire a distinct custom event the first time each field receives focus, then build a funnel in Analytics Settings with one step per field. The step with the biggest drop from the one before it is the field visitors quit on.",[303,310,312],{"question":311},"Does OperatorStack track form abandonment automatically?",[10,313,314,315,317],{},"No. The embedded forms widget sends a submission when someone completes it, but it does not emit per-field events. You add a few lines of JavaScript that call ",[17,316,19],{}," on focus, as shown in this post.",[303,319,321],{"question":320},"Why use a different event name for every field instead of one event with a field property?",[10,322,323,324,327,328,331,332,335],{},"A funnel step matches an event name, not a property value. One ",[17,325,326],{},"form_field_focus"," event with a ",[17,329,330],{},"field"," property would count every field together. Separate names like ",[17,333,334],{},"form_field_company"," let each field be its own funnel step.",[303,337,339],{"question":338},"Is it safe to track which field someone focused?",[10,340,341,342,345,346,349],{},"Yes, as long as you send only the field name. Never put what the visitor typed into the event metadata. Names like ",[17,343,344],{},"company"," or ",[17,347,348],{},"phone"," are safe. The value of the email field is not.",[303,351,353],{"question":352},"How many visitors do I need before a field drop-off is real?",[10,354,355],{},"Aim for 100 visitors who start the form. Below that, two or three people swing a step by several points and you will remove a field that was fine.",[357,358,359,360],"content-related-articles",{},"\n  ",[361,362,359,365],"contentrelatedcard",{"href":52,"title":363,"description":364},"Landing Page Drop Off: Find the Page Losing Your Signups","Rule out the page itself before you blame a field, using the Pages report.",[361,366,359,370],{"href":367,"title":368,"description":369},"\u002Fblog\u002Fhow-to\u002Fcustom-events-analytics","Custom Events for Product Analytics: Track What Matters Before Launch","The trackEvent() basics behind every per-field event in this post.",[361,371,374],{"href":154,"title":372,"description":373},"Custom Forms Without a Builder","Post JSON to the form endpoint from your own markup and keep full control of the fields.",[375,376],"cta-box",{"href":377,"label":378},"\u002F","Get Started Free",{"title":92,"searchDepth":380,"depth":380,"links":381},2,[382,383,384,385,386,387,388],{"id":34,"depth":380,"text":35},{"id":57,"depth":380,"text":58},{"id":133,"depth":380,"text":134},{"id":166,"depth":380,"text":167},{"id":198,"depth":380,"text":199},{"id":238,"depth":380,"text":239},{"id":276,"depth":380,"text":277},"how-to","2026-10-06","Find your form abandonment field with one trackEvent call per input and a custom funnel. See which question loses the most visitors before submit.",false,"md",[395,396,398,400,402],{"question":305,"answer":308},{"question":311,"answer":397},"No. The embedded forms widget sends a submission when someone completes it, but it does not emit per-field events. You add a few lines of JavaScript that call trackEvent() on focus, as shown in this post.",{"question":320,"answer":399},"A funnel step matches an event name, not a property value. One form_field_focus event with a field property would count every field together. Separate names like form_field_company let each field be its own funnel step.",{"question":338,"answer":401},"Yes, as long as you send only the field name. Never put what the visitor typed into the event metadata. Names like company or phone are safe. The value of the email field is not.",{"question":352,"answer":355},"form abandonment,form field drop off,which form field loses signups,form abandonment tracking,track form field interaction,form conversion rate",{},true,"Six fields, 40 visitors start the form, 9 submit. Which field did the other 31 quit on? One trackEvent call per input answers it.","Form Abandonment: Find the Field Losing Signups","\u002Fblog\u002Fhow-to\u002Fform-abandonment-field","7 min","HowTo",{"title":5,"description":391},{"loc":408},"blog\u002Fhow-to\u002Fform-abandonment-field",[415,416,417],"forms","analytics","conversion","summary_large_image","2ksNsQsldkTbbmtBpRXt_MtpwLr1RJ8F4hpvWxz_wZM",1793197856076]