[{"data":1,"prerenderedAt":321},["ShallowReactive",2],{"blog-how-to\u002Ftrack-javascript-errors-without-sentry":3},{"id":4,"title":5,"body":6,"category":291,"date":292,"dateModified":293,"description":294,"draft":295,"extension":296,"faq":297,"featured":295,"keywords":304,"meta":305,"navigation":306,"ogDescription":307,"ogTitle":308,"path":309,"readTime":310,"schemaType":311,"seo":312,"sitemap":313,"stem":314,"tags":315,"twitterCard":319,"__hash__":320},"blog\u002Fblog\u002Fhow-to\u002Ftrack-javascript-errors-without-sentry.md","JavaScript Error Tracking Without Sentry: Set Up in Minutes",{"type":7,"value":8,"toc":284},"minimark",[9,18,24,29,32,55,64,77,116,120,135,161,173,177,180,186,190,193,203,216,259],[10,11,12,13,17],"p",{},"A visitor on Safari hits a ",[14,15,16],"code",{},"TypeError"," on your signup form. The button does nothing, they leave, and you have no idea it happened because you never installed Sentry. At $26\u002Fmonth for the team plan, it always felt like the wrong tool to add before you had a single paying customer.",[19,20,21],"tldr",{},[10,22,23],{},"OperatorStack's script tag already listens for uncaught exceptions and unhandled promise rejections on your page. Errors are deduplicated, PII-scrubbed, and tagged by source before they land in a triage dashboard where you can mark them active, ignored, or fixed. No separate install, no per-seat pricing.",[25,26,28],"h2",{"id":27},"how-error-capture-works","How error capture works",[10,30,31],{},"If you already added the OperatorStack script tag for analytics, a waitlist, or forms, error tracking is already running. There is nothing extra to install.",[33,34,36],"step",{"number":35},"1",[10,37,38,42,43,46,47,50,51,54],{},[39,40,41],"strong",{},"Two listeners attach automatically."," ",[14,44,45],{},"window.addEventListener(\"error\", ...)"," catches uncaught exceptions with their message, source file, line, and column. ",[14,48,49],{},"window.addEventListener(\"unhandledrejection\", ...)"," catches promise rejections that never got a ",[14,52,53],{},".catch()",". Both fire before your own code can react, so nothing slips through.",[33,56,58],{"number":57},"2",[10,59,60,63],{},[39,61,62],{},"Errors that happen before the script finishes loading aren't lost."," An early listener buffers up to 10 errors (message, source, line, column, stack) the instant the page starts executing, before OperatorStack's config has even loaded. Once config resolves, the buffer drains into full error capture, so a crash in the first 100ms of page load still shows up.",[33,65,67],{"number":66},"3",[10,68,69,72,73,76],{},[39,70,71],{},"Every error is fingerprinted for dedup."," OperatorStack hashes the message, source file, and line number into a short fingerprint. Repeats of the same fingerprint within a 5-second window get dropped, and total captures are capped at 50 per rolling 60-second window. A broken ",[14,74,75],{},"setInterval"," throwing the same error 1,000 times a minute cannot flood your dashboard.",[33,78,80],{"number":79},"4",[10,81,82,85,86,89,90,93,94,97,98,97,101,97,104,107,108,111,112,115],{},[39,83,84],{},"Stack traces and messages are scrubbed before they leave the browser."," Email addresses become ",[14,87,88],{},"[EMAIL]",", JWT-shaped tokens become ",[14,91,92],{},"[TOKEN]",", and any ",[14,95,96],{},"token=",", ",[14,99,100],{},"key=",[14,102,103],{},"secret=",[14,105,106],{},"password=",", or ",[14,109,110],{},"auth="," query parameter becomes ",[14,113,114],{},"[REDACTED]",". Stack traces are also truncated to 2,000 characters.",[25,117,119],{"id":118},"reading-the-dashboard","Reading the dashboard",[10,121,122,123,126,127,130,131,134],{},"Every captured error shows up under the project's Errors tab, tagged ",[14,124,125],{},"error_source: site"," or ",[14,128,129],{},"error_source: operatorstack"," depending on whether the stack trace points into your own code or into ",[14,132,133],{},"os.js",". That split matters: a bug in your landing page's JavaScript should never get mistaken for a platform issue, and vice versa.",[10,136,137,138,97,141,97,144,97,147,150,151,97,154,107,157,160],{},"From there you can filter by status (",[14,139,140],{},"active",[14,142,143],{},"ignored",[14,145,146],{},"fixed",[14,148,149],{},"regressed",") and sort by ",[14,152,153],{},"count",[14,155,156],{},"recent",[14,158,159],{},"first_seen",". Sorting by count first is the fastest way to find the one error hitting 40% of your visitors versus the one that fired once on a bot's user agent string.",[162,163,164],"tip-box",{},[10,165,166,167,169,170,172],{},"Mark noisy but harmless errors (a third-party ad script throwing on an ad blocker, for example) as ",[14,168,143],{},". They stay out of your active count without deleting the history, and if the same fingerprint reappears after a deploy, OperatorStack flags it ",[14,171,149],{}," instead of silently re-opening it as new.",[25,174,176],{"id":175},"what-you-lose-versus-sentry","What you lose versus Sentry",[10,178,179],{},"Be honest about the tradeoff before you cut Sentry entirely.",[181,182,183],"warning-box",{},[10,184,185],{},"OperatorStack does not unminify stack traces with source maps, does not track deploys\u002Freleases to correlate an error spike with a specific commit, and has no Slack\u002FPagerDuty alerting yet. If you are shipping multiple releases a day with a team, Sentry's release tooling still earns its price. For a pre-launch solo founder watching one or two deploys a week, the built-in tracking covers what actually matters: knowing an error exists, how often it fires, and whether it is your bug or a third-party script's.",[25,187,189],{"id":188},"testing-it-end-to-end","Testing it end to end",[10,191,192],{},"Confirm capture is working before you trust it. Open your browser console on a page running the OperatorStack script tag and run:",[194,195,201],"pre",{"className":196,"code":198,"language":199,"meta":200},[197],"language-js","throw new Error(\"test-error-tracking\");\n","js","",[14,202,198],{"__ignoreMap":200},[10,204,205,206,209,210,212,213,215],{},"Refresh the Errors tab in your OperatorStack dashboard a few seconds later. You should see ",[14,207,208],{},"test-error-tracking"," listed with ",[14,211,125],{},", a fingerprint, and a first-seen timestamp. Mark it ",[14,214,146],{}," once you have confirmed it, so it does not skew your active error count.",[217,218,219,226,232,238,244],"faq-section",{},[220,221,223],"faq-item",{"question":222},"Does OperatorStack replace Sentry completely?",[10,224,225],{},"For a solo founder's pre-launch site, yes. You get automatic capture of uncaught exceptions and unhandled promise rejections, deduplication, and a triage dashboard. Sentry's release tracking, source map unminifying, and team alerting are built for larger engineering teams shipping multiple times a day.",[220,227,229],{"question":228},"Do I need to add any code to start tracking errors?",[10,230,231],{},"No. The moment the OperatorStack script tag loads, it attaches a window error listener and an unhandledrejection listener. Every uncaught exception or rejected promise on the page gets captured automatically.",[220,233,235],{"question":234},"Will this track errors from other scripts on my page, or just OperatorStack's own code?",[10,236,237],{},"Both, and the dashboard tells them apart. Each captured error is tagged error_source: site or error_source: operatorstack based on whether the stack trace points into os.js, so a bug in your own code never gets misread as a platform issue.",[220,239,241],{"question":240},"What happens if my page throws the same error 200 times in a minute?",[10,242,243],{},"It gets deduplicated. OperatorStack fingerprints each error from its message, source file, and line number, then suppresses repeats of the same fingerprint for 5 seconds and caps total captures at 50 per rolling 60-second window, so a broken loop cannot flood your dashboard or your event quota.",[220,245,247],{"question":246},"Does error tracking send any personal data?",[10,248,249,250,254,255,258],{},"No. Before an error is sent, OperatorStack strips email addresses, JWT-style tokens, and any token\u002Fkey\u002Fsecret\u002Fpassword\u002Fauth query parameter from the message and stack trace, replacing them with placeholders like ",[251,252,253],"span",{},"EMAIL"," and ",[251,256,257],{},"REDACTED",".",[260,261,262,263],"content-related-articles",{},"\n  ",[264,265,262,269],"contentrelatedcard",{"href":266,"title":267,"description":268},"\u002Fblog\u002Fhow-to\u002Fwhich-javascript-errors-to-ignore","Which JavaScript Errors to Ignore","Once errors are flowing in, sort extension and third-party noise from the two error types that cost you signups.",[264,270,262,274],{"href":271,"title":272,"description":273},"\u002Fblog\u002Fhow-to\u002Fcustom-events-analytics","Custom Events: Track Product Analytics Beyond Page Views","Use trackEvent() to log button clicks and feature usage with the same script tag that now also tracks your errors.",[264,275,279],{"href":276,"title":277,"description":278},"\u002Fblog\u002Fguides\u002Fai-advisor-launch-readiness","AI Advisor Launch Readiness: How Red, Yellow, Green Work","The errors tab you just set up feeds its own AI Advisor section, scored separately from analytics, signups, and the other seven cards.",[280,281],"cta-box",{"href":282,"label":283},"\u002F","Get Started Free",{"title":200,"searchDepth":285,"depth":285,"links":286},2,[287,288,289,290],{"id":27,"depth":285,"text":28},{"id":118,"depth":285,"text":119},{"id":175,"depth":285,"text":176},{"id":188,"depth":285,"text":189},"how-to","2026-07-07","2026-09-22","Catch uncaught exceptions and promise rejections with OperatorStack's built-in error tracking. No separate script tag, no per-seat Sentry pricing.",false,"md",[298,299,300,301,302],{"question":222,"answer":225},{"question":228,"answer":231},{"question":234,"answer":237},{"question":240,"answer":243},{"question":246,"answer":303},"No. Before an error is sent, OperatorStack strips email addresses, JWT-style tokens, and any token\u002Fkey\u002Fsecret\u002Fpassword\u002Fauth query parameter from the message and stack trace, replacing them with placeholders like [EMAIL] and [REDACTED].","javascript error tracking,error tracking without sentry,sentry alternative,catch javascript errors,client side error monitoring",{},true,"Catch uncaught exceptions and promise rejections with the same script tag that runs your analytics and waitlist. No Sentry install required.","JavaScript Error Tracking Without Sentry","\u002Fblog\u002Fhow-to\u002Ftrack-javascript-errors-without-sentry","6 min","HowTo",{"title":5,"description":294},{"loc":309},"blog\u002Fhow-to\u002Ftrack-javascript-errors-without-sentry",[316,317,318],"error-tracking","javascript","debugging","summary_large_image","bPaV2grg5ipuWqda3Ul6QW2gR1aAjfc7ONzdjiTMck0",1793355878557]