[{"data":1,"prerenderedAt":424},["ShallowReactive",2],{"blog-how-to\u002Fverify-embed-script-firing":3},{"id":4,"title":5,"body":6,"category":397,"date":398,"dateModified":398,"description":399,"draft":400,"extension":401,"faq":402,"featured":400,"keywords":411,"meta":412,"navigation":413,"ogDescription":414,"ogTitle":5,"path":415,"readTime":416,"schemaType":417,"seo":418,"sitemap":419,"stem":420,"tags":421,"twitterCard":422,"__hash__":423},"blog\u002Fblog\u002Fhow-to\u002Fverify-embed-script-firing.md","Verify the Embed Script Is Working: 4 Checks in 2 Minutes",{"type":7,"value":8,"toc":389},"minimark",[9,13,16,35,40,43,53,68,75,88,99,107,111,118,126,129,196,202,206,213,216,246,252,256,259,265,272,278,284,293,297,300,306,313,321,365],[10,11,12],"p",{},"A script tag that fails does not throw an error you can search for. The page loads, the form never appears, and you find out when a week of launch traffic produced zero signups. The embed script is built to fail quietly so it never breaks your site, which is also why you have to check that it works on purpose.",[10,14,15],{},"These four checks take about two minutes and cover every point where the install can break: the tag itself, the config request, the page view, and the widget.",[17,18,19],"tldr",{},[10,20,21,22,26,27,30,31,34],{},"Check 1: ",[23,24,25],"code",{},"OperatorStack"," exists in the Console. Check 2: the ",[23,28,29],{},"\u002Fconfig"," request returns 200. Check 3: a page view reaches the dashboard. Check 4: your widget container renders. Add ",[23,32,33],{},"data-dev=\"true\""," to the script tag to see each step logged.",[36,37,39],"h2",{"id":38},"check-1-the-script-loaded-and-found-your-project-key","Check 1: The Script Loaded and Found Your Project Key",[10,41,42],{},"Open your live page (not the editor preview), open DevTools, and type this in the Console:",[44,45,51],"pre",{"className":46,"code":48,"language":49,"meta":50},[47],"language-js","OperatorStack;\n","js","",[23,52,48],{"__ignoreMap":50},[10,54,55,56,59,60,63,64,67],{},"If it returns an object with methods like ",[23,57,58],{},"joinWaitlist"," and ",[23,61,62],{},"trackEvent",", the script ran. The script puts the SDK on ",[23,65,66],{},"window"," immediately, before it finishes initializing.",[10,69,70,71,74],{},"If it returns ",[23,72,73],{},"ReferenceError: OperatorStack is not defined",", the file never executed. The usual causes:",[76,77,78,82,85],"ul",{},[79,80,81],"li",{},"The tag was pasted into a preview-only or draft environment, not the published page.",[79,83,84],{},"A content security policy blocks the script host. The Console shows a red CSP violation.",[79,86,87],{},"An ad blocker stripped it. Test in a private window with extensions disabled.",[10,89,90,91,94,95,98],{},"If the object exists but you see ",[23,92,93],{},"[OperatorStack] No data-project attribute found on script tag",", the tag is missing its key. The script looks for ",[23,96,97],{},"script[data-project]",", so the attribute name must match exactly:",[44,100,105],{"className":101,"code":103,"language":104,"meta":50},[102],"language-html","\u003Cscript src=\"https:\u002F\u002Foperatorstack.dev\u002Fos.js\" data-project=\"pk_abc123\">\u003C\u002Fscript>\n","html",[23,106,103],{"__ignoreMap":50},[36,108,110],{"id":109},"check-2-the-config-request-returns-200","Check 2: The Config Request Returns 200",[10,112,113,114,117],{},"Open the Network tab, reload, and filter for ",[23,115,116],{},"config",". You are looking for one request to:",[44,119,124],{"className":120,"code":122,"language":123},[121],"language-text","\u002Fv1\u002Fprojects\u002Fpk_abc123\u002Fconfig\n","text",[23,125,122],{"__ignoreMap":50},[10,127,128],{},"A 200 means the script reached the API, your project key is valid, and your settings loaded. Everything after this point depends on that response. If it fails, the script aborts without rendering anything.",[130,131,132,148],"table",{},[133,134,135],"thead",{},[136,137,138,142,145],"tr",{},[139,140,141],"th",{},"Status",[139,143,144],{},"Meaning",[139,146,147],{},"Fix",[149,150,151,163,174,185],"tbody",{},[136,152,153,157,160],{},[154,155,156],"td",{},"200",[154,158,159],{},"Config loaded",[154,161,162],{},"Move to check 3",[136,164,165,168,171],{},[154,166,167],{},"404",[154,169,170],{},"Project key not found",[154,172,173],{},"Copy the key again from the project page",[136,175,176,179,182],{},[154,177,178],{},"Failed \u002F CORS error",[154,180,181],{},"Your domain is not allowed",[154,183,184],{},"Check the landing page URL set on the project",[136,186,187,190,193],{},[154,188,189],{},"No request at all",[154,191,192],{},"Script never ran",[154,194,195],{},"Back to check 1",[197,198,199],"tip-box",{},[10,200,201],{},"The script caches config for five minutes. After you change a setting in the dashboard, hard-reload or wait before concluding the change did not apply.",[36,203,205],{"id":204},"check-3-a-page-view-reaches-the-dashboard","Check 3: A Page View Reaches the Dashboard",[10,207,208,209,212],{},"Visit the page in a normal tab, then open the project's Analytics view. Your visit should appear within a minute or so. In the Network tab you will also see a POST to ",[23,210,211],{},"\u002Fevents\u002Fbatch",", which carries the queued events.",[10,214,215],{},"If the config returned 200 but no page view arrives, the script skipped tracking on purpose. Three silent causes:",[217,218,219,234,240],"ol",{},[79,220,221,225,226,229,230,233],{},[222,223,224],"strong",{},"Do Not Track is on."," The script checks ",[23,227,228],{},"navigator.doNotTrack"," and tracks nothing when it equals ",[23,231,232],{},"\"1\"",". This is the most common reason a founder cannot see their own visits, because privacy-minded builders often have it enabled.",[79,235,236,239],{},[222,237,238],{},"The path is excluded."," If you added excluded path prefixes in project settings, any URL starting with one is skipped.",[79,241,242,245],{},[222,243,244],{},"Analytics is switched off"," for the project.",[247,248,249],"warning-box",{},[10,250,251],{},"Do not trust a missing page view from your own browser as proof of a broken install. Test once from a phone on mobile data or a fresh profile with Do Not Track off.",[36,253,255],{"id":254},"check-4-the-widget-renders","Check 4: The Widget Renders",[10,257,258],{},"The script only draws a widget when two things are true: the page has a container, and that feature is enabled in the project. A missing container produces no error.",[44,260,263],{"className":261,"code":262,"language":104,"meta":50},[102],"\u003Cdiv data-os-widget=\"waitlist\">\u003C\u002Fdiv>\n",[23,264,262],{"__ignoreMap":50},[10,266,267,268,271],{},"For forms the attribute is ",[23,269,270],{},"data-os-form"," instead. In the Console, confirm the container exists:",[44,273,276],{"className":274,"code":275,"language":49,"meta":50},[47],"document.querySelectorAll(\"[data-os-widget]\").length;\n",[23,277,275],{"__ignoreMap":50},[10,279,280,283],{},[23,281,282],{},"0"," means the div never made it into the published HTML. Page builders and React apps often strip or defer unknown attributes, so view the page source of the deployed URL and search for it. If the count is 1 or more and nothing renders, open the project's Waitlist settings and confirm the waitlist is enabled.",[10,285,286,287,292],{},"Once it renders, submit a test email and confirm it appears in the dashboard. The full end-to-end test lives in the ",[288,289,291],"a",{"href":290},"\u002Fblog\u002Fhow-to\u002Ftest-waitlist-before-launch","pre-launch waitlist test",".",[36,294,296],{"id":295},"turn-on-dev-mode-to-see-every-step","Turn On Dev Mode to See Every Step",[10,298,299],{},"When the four checks do not explain it, add one attribute:",[44,301,304],{"className":302,"code":303,"language":104,"meta":50},[102],"\u003Cscript src=\"https:\u002F\u002Foperatorstack.dev\u002Fos.js\" data-project=\"pk_abc123\" data-dev=\"true\">\u003C\u002Fscript>\n",[23,305,303],{"__ignoreMap":50},[10,307,308,309,312],{},"The Console then prints lines prefixed ",[23,310,311],{},"[OperatorStack]",": the project key it initialized with, whether config loaded, \"Page view tracked\" or the reason it was skipped (\"DNT enabled, skipping tracking\", \"Page excluded from tracking\"), and each event flush. The line you are missing tells you which stage broke.",[247,314,315],{},[10,316,317,318,320],{},"Remove ",[23,319,33],{}," before launch. It is harmless to visitors but fills their Console with your debug output.",[322,323,324,337,347,353],"faq-section",{},[325,326,328],"faq-item",{"question":327},"How do I know if my OperatorStack script tag is working?",[10,329,330,331,333,334,336],{},"Type ",[23,332,25],{}," in the Console and confirm it returns an object, then check the Network tab for a 200 on the ",[23,335,29],{}," request. A page view in the dashboard confirms the full path.",[325,338,340],{"question":339},"Why does the widget not show up even though the script loaded?",[10,341,342,343,346],{},"The widget needs a ",[23,344,345],{},"[data-os-widget]"," container on the page and the feature enabled in project settings. A loaded script with a disabled waitlist renders nothing and logs no error unless dev mode is on.",[325,348,350],{"question":349},"Why are my page views not showing in the dashboard?",[10,351,352],{},"Check Do Not Track in your own browser, excluded paths in project settings, and whether analytics is enabled. The script skips tracking silently in all three cases.",[325,354,356],{"question":355},"How do I turn on debug logging?",[10,357,358,359,361,362,364],{},"Add ",[23,360,33],{}," to the script tag. Each step logs to the Console with an ",[23,363,311],{}," prefix. Remove it before launch.",[366,367,368,369],"content-related-articles",{},"\n  ",[370,371,368,374],"contentrelatedcard",{"href":290,"title":372,"description":373},"Test Your Waitlist Before Launch: A Fake Signup Checklist","Once the script is confirmed, run a real signup through the whole flow before you send traffic.",[370,375,368,379],{"href":376,"title":377,"description":378},"\u002Fblog\u002Fhow-to\u002Ftrack-javascript-errors-without-sentry","JavaScript Error Tracking Without Sentry: Set Up in Minutes","Catch the runtime errors that break your page after the install check passes.",[370,380,384],{"href":381,"title":382,"description":383},"\u002Fblog\u002Fhow-to\u002Fstatic-html-landing-page","Static HTML Landing Page With a Waitlist","Where the script tag and widget container go on a plain HTML page.",[385,386],"cta-box",{"href":387,"label":388},"\u002F","Get Started Free",{"title":50,"searchDepth":390,"depth":390,"links":391},2,[392,393,394,395,396],{"id":38,"depth":390,"text":39},{"id":109,"depth":390,"text":110},{"id":204,"depth":390,"text":205},{"id":254,"depth":390,"text":255},{"id":295,"depth":390,"text":296},"how-to","2026-11-02","Confirm the OperatorStack script tag loaded, fetched your config, and sent a page view. Four browser checks using the Network tab, dev mode, and the dashboard.",false,"md",[403,405,407,409],{"question":327,"answer":404},"Open DevTools, type OperatorStack in the Console and confirm it returns an object, then check the Network tab for a 200 response from the \u002Fconfig request. A page view event in the dashboard confirms the full path.",{"question":339,"answer":406},"The widget only renders if the matching feature is enabled in your project settings and the page has a [data-os-widget] container. A loaded script with a disabled waitlist renders nothing and shows no error.",{"question":349,"answer":408},"Check for Do Not Track in your own browser, an excluded path in project settings, and analytics being switched off. The script skips tracking silently in all three cases.",{"question":355,"answer":410},"Add data-dev=\"true\" to the script tag. The script then logs each step to the Console with an [OperatorStack] prefix. Remove it before you launch.","verify embed script is working,script tag not loading,os.js not working,check analytics script installed,data-dev debug mode",{},true,"A script tag that fails silently costs you a launch. Four checks that prove it loaded, fetched config, and tracked a page view.","\u002Fblog\u002Fhow-to\u002Fverify-embed-script-firing","5 min","HowTo",{"title":5,"description":399},{"loc":415},"blog\u002Fhow-to\u002Fverify-embed-script-firing",[],"summary_large_image","pxZExVwK4kOmzbh8ed2Cxq_UImNjCBIV33MbgjKg4AU",1793618049989]