[{"data":1,"prerenderedAt":445},["ShallowReactive",2],{"blog-how-to\u002Ftrack-blog-signups":3},{"id":4,"title":5,"body":6,"category":416,"date":417,"dateModified":418,"description":419,"draft":420,"extension":421,"faq":422,"featured":420,"keywords":431,"meta":432,"navigation":433,"ogDescription":434,"ogTitle":435,"path":436,"readTime":437,"schemaType":438,"seo":439,"sitemap":440,"stem":441,"tags":442,"twitterCard":443,"__hash__":444},"blog\u002Fblog\u002Fhow-to\u002Ftrack-blog-signups.md","Track Which Blog Posts Drive the Most Signups",{"type":7,"value":8,"toc":404},"minimark",[9,13,21,28,42,47,50,80,83,87,90,93,103,114,117,126,130,136,139,145,148,156,159,162,168,171,176,179,185,188,192,198,249,252,256,270,286,302,314,318,321,327,334,379],[10,11,12],"p",{},"Your blog is getting traffic. Three posts are pulling in visitors from search and social, and you are writing more each week. But when someone clicks \"Join Waitlist\" after reading your schema-on-write explainer, your dashboard counts it as a signup. It does not tell you it came from that post.",[10,14,15,16,20],{},"Your Analytics tab shows Top Pages with visit counts per URL. You can see ",[17,18,19],"code",{},"\u002Fblog\u002Fguides\u002Fschema-on-write"," had 80 visits this week. What you cannot see is how many of those 80 people signed up.",[10,22,23,24,27],{},"Closing that gap takes two steps: tagging your CTAs with either UTM parameters or a ",[17,25,26],{},"trackEvent()"," call, and reading the results in your Analytics tab.",[29,30,31],"tldr",{},[10,32,33,34,37,38,41],{},"OperatorStack logs every blog post visit automatically. To track conversions, tag your blog CTAs with ",[17,35,36],{},"?utm_source=blog&utm_content=post-slug"," (simple) or fire ",[17,39,40],{},"OperatorStack.trackEvent(\"blog_cta_click\", { post: \"post-slug\" })"," on click (precise). Both approaches appear in your Analytics tab within seconds.",[43,44,46],"h2",{"id":45},"what-you-get-without-extra-setup","What You Get Without Extra Setup",[10,48,49],{},"When the OperatorStack script tag is on your blog, it tracks every pageview. The Analytics tab shows:",[51,52,53,68,74],"ul",{},[54,55,56,60,61,64,65,67],"li",{},[57,58,59],"strong",{},"Top Pages"," -- visits per URL, so you can see ",[17,62,63],{},"\u002Fblog\u002Fhow-to\u002Fset-up-waitlist"," had 200 visits and ",[17,66,19],{}," had 80",[54,69,70,73],{},[57,71,72],{},"Referral sources"," -- where those blog visitors came from (search, Twitter, newsletters)",[54,75,76,79],{},[57,77,78],{},"Unique visitors"," -- how many distinct people hit each post",[10,81,82],{},"This is enough to know which posts attract an audience. It does not tell you which posts convert that audience into signups.",[43,84,86],{"id":85},"approach-1-utm-parameters-on-cta-links","Approach 1: UTM Parameters on CTA Links",[10,88,89],{},"The simplest approach requires no code changes to your blog. Add UTM parameters to any link that points visitors toward your signup flow.",[10,91,92],{},"If your blog post ends with a link to your landing page:",[94,95,101],"pre",{"className":96,"code":98,"language":99,"meta":100},[97],"language-html","\u003C!-- Without tracking -->\n\u003Ca href=\"https:\u002F\u002Fyoursite.com\">Start for Free\u003C\u002Fa>\n\n\u003C!-- With UTM tracking -->\n\u003Ca href=\"https:\u002F\u002Fyoursite.com?utm_source=blog&utm_content=schema-on-write&utm_medium=cta\">\n  Start for Free\n\u003C\u002Fa>\n","html","",[17,102,98],{"__ignoreMap":100},[10,104,105,106,109,110,113],{},"When a visitor clicks that link and signs up, the signup is attributed to ",[17,107,108],{},"utm_source=blog"," in your Analytics tab. The ",[17,111,112],{},"utm_content"," value (the post slug) appears under Traffic Sources so you can compare conversions per post.",[10,115,116],{},"You can also use this pattern for in-line text links within the post body, not just the closing CTA.",[118,119,120],"tip-box",{},[10,121,122,123,125],{},"Use consistent ",[17,124,112],{}," values -- the post slug is ideal. This lets you sort by content value in the Analytics tab and rank posts by signup contribution, not just traffic.",[43,127,129],{"id":128},"approach-2-custom-events-on-cta-clicks","Approach 2: Custom Events on CTA Clicks",[10,131,132,133,135],{},"UTM parameters require a page navigation to capture attribution. If your blog posts have a waitlist widget on the page itself (not a link to a separate landing page), use ",[17,134,26],{}," to fire a custom event when the visitor clicks the signup CTA.",[10,137,138],{},"Add the script tag to your blog layout if it is not there already:",[94,140,143],{"className":141,"code":142,"language":99,"meta":100},[97],"\u003Cscript src=\"https:\u002F\u002Foperatorstack.dev\u002Fos.js\" data-project=\"pk_your_key\" defer>\u003C\u002Fscript>\n",[17,144,142],{"__ignoreMap":100},[10,146,147],{},"Then attach an event handler to your CTA button:",[94,149,154],{"className":150,"code":152,"language":153,"meta":100},[151],"language-javascript","await OperatorStack.ready;\n\ndocument.querySelector(\"#blog-cta\").addEventListener(\"click\", () => {\n  OperatorStack.trackEvent(\"blog_cta_click\", {\n    post: \"guides\u002Fschema-on-write\",\n    category: \"guides\",\n    keyword: \"schema-on-write\",\n  });\n});\n","javascript",[17,155,152],{"__ignoreMap":100},[10,157,158],{},"This fires the event the moment someone clicks, regardless of whether they complete the signup. You get click intent data even from visitors who abandon the form.",[10,160,161],{},"To track completed signups specifically, fire a second event inside the signup callback:",[94,163,166],{"className":164,"code":165,"language":153,"meta":100},[151],"const result = await OperatorStack.joinWaitlist({\n  email: emailInput.value,\n});\n\nif (result.success) {\n  OperatorStack.trackEvent(\"blog_signup_completed\", {\n    post: \"guides\u002Fschema-on-write\",\n    category: \"guides\",\n  });\n}\n",[17,167,165],{"__ignoreMap":100},[10,169,170],{},"Both events appear in the Events section of your Analytics tab with their properties.",[172,173,175],"h3",{"id":174},"using-the-post-url-automatically","Using the Post URL Automatically",[10,177,178],{},"If you have multiple blog posts using the same template, read the post slug from the URL rather than hardcoding it:",[94,180,183],{"className":181,"code":182,"language":153,"meta":100},[151],"await OperatorStack.ready;\n\nconst postSlug = window.location.pathname.replace(\"\u002Fblog\u002F\", \"\").replace(\u002F\\\u002F$\u002F, \"\");\n\ndocument.querySelector(\"#blog-cta\").addEventListener(\"click\", () => {\n  OperatorStack.trackEvent(\"blog_cta_click\", { post: postSlug });\n});\n",[17,184,182],{"__ignoreMap":100},[10,186,187],{},"Add this once to your blog post layout component (Nuxt, Next.js, Astro, or plain HTML template) and every post automatically tags its own clicks.",[43,189,191],{"id":190},"approach-3-combining-both","Approach 3: Combining Both",[10,193,194,195,197],{},"For the most complete picture, use UTM parameters on outbound links and ",[17,196,26],{}," on in-page CTAs. The two approaches track different moments:",[199,200,201,214],"table",{},[202,203,204],"thead",{},[205,206,207,211],"tr",{},[208,209,210],"th",{},"Signal",[208,212,213],{},"What it captures",[215,216,217,228,239],"tbody",{},[205,218,219,225],{},[220,221,222],"td",{},[17,223,224],{},"utm_content=post-slug",[220,226,227],{},"Visitor navigated away from your blog to the landing page from a specific post",[205,229,230,236],{},[220,231,232,235],{},[17,233,234],{},"blog_cta_click"," event",[220,237,238],{},"Visitor clicked a CTA on the post (intent, before signup)",[205,240,241,246],{},[220,242,243,235],{},[17,244,245],{},"blog_signup_completed",[220,247,248],{},"Visitor signed up directly from the post",[10,250,251],{},"The combination tells you which posts attract browsers vs. which ones convert browsers into signups.",[43,253,255],{"id":254},"reading-the-results","Reading the Results",[257,258,260],"step",{"number":259},"1",[10,261,262,265,266,269],{},[57,263,264],{},"Open your Analytics tab."," Go to your project in OperatorStack and click Analytics. The Top Pages panel shows visit counts per URL. Posts with ",[17,267,268],{},"\u002Fblog\u002F"," in the path are your blog content.",[257,271,273],{"number":272},"2",[10,274,275,278,279,282,283,285],{},[57,276,277],{},"Check Traffic Sources for UTM attribution."," If you used UTM parameters, the Traffic Sources panel shows rows like ",[17,280,281],{},"blog"," under utm_source. Click through to see ",[17,284,112],{}," values (your post slugs) ranked by visits and conversion rate.",[257,287,289],{"number":288},"3",[10,290,291,294,295,297,298,301],{},[57,292,293],{},"Check Events for custom event data."," The Events panel lists every unique event name. Click ",[17,296,234],{}," to see a count and a breakdown of the ",[17,299,300],{},"post"," property -- which posts triggered the most clicks.",[257,303,305],{"number":304},"4",[10,306,307,310,311,313],{},[57,308,309],{},"Compare traffic to conversions per post."," A post with 200 visits and 2 ",[17,312,245],{}," events converts at 1%. A post with 80 visits and 8 completions converts at 10%. The second post is ten times more valuable per visitor, even with less traffic. That is the insight that tells you what to write next.",[43,315,317],{"id":316},"common-setup-for-nuxt-content-blogs","Common Setup for Nuxt Content Blogs",[10,319,320],{},"If your blog runs on Nuxt Content (the same stack this blog uses), add the script tag to your default layout and the event handler to a composable:",[94,322,325],{"className":323,"code":324,"language":153,"meta":100},[151],"\u002F\u002F composables\u002FuseBlogTracking.ts\nexport function useBlogTracking() {\n  const route = useRoute();\n\n  onMounted(async () => {\n    if (!window.OperatorStack) return;\n    await window.OperatorStack.ready;\n\n    const postSlug = route.path.replace(\"\u002Fblog\u002F\", \"\").replace(\u002F\\\u002F$\u002F, \"\");\n\n    document.querySelector(\"#blog-cta\")?.addEventListener(\"click\", () => {\n      window.OperatorStack.trackEvent(\"blog_cta_click\", { post: postSlug });\n    });\n  });\n}\n",[17,326,324],{"__ignoreMap":100},[10,328,329,330,333],{},"Call ",[17,331,332],{},"useBlogTracking()"," in your blog post layout component, and every post on the site gets automatic CTA click tracking with zero repeated code.",[335,336,337,344,354,364,373],"faq-section",{},[338,339,341],"faq-item",{"question":340},"Does OperatorStack automatically track blog post visits?",[10,342,343],{},"Yes. The embed script records a pageview for every URL, including blog post URLs. Your Analytics tab shows visit counts per page under Top Pages. That tells you which posts get traffic, but not which ones convert visitors into signups.",[338,345,347],{"question":346},"What is the simplest way to track which blog post drove a signup?",[10,348,349,350,353],{},"Add UTM parameters to every CTA link on your blog posts. Use ",[17,351,352],{},"?utm_source=blog&utm_content=your-post-slug"," on any link that points to your signup page or waitlist widget. The signup will be attributed to that source in your Analytics tab.",[338,355,357],{"question":356},"Can I track CTA clicks without a page reload?",[10,358,359,360,363],{},"Yes. Use ",[17,361,362],{},"OperatorStack.trackEvent()"," to fire a custom event on the click, with the post slug as a property. This captures the intent even if the visitor does not complete the signup.",[338,365,367],{"question":366},"How do I see the custom event data in the dashboard?",[10,368,369,370,372],{},"Custom events fired via ",[17,371,26],{}," appear in the Events section of your Analytics tab. Each event name shows a count and any properties you passed, including the post slug or category.",[338,374,376],{"question":375},"What if my blog is on a separate subdomain from my landing page?",[10,377,378],{},"Add the same OperatorStack script tag to your blog. The project key is the same regardless of domain. Analytics events from your blog and your landing page all feed into the same project dashboard.",[380,381,382,383],"content-related-articles",{},"\n  ",[384,385,382,389],"contentrelatedcard",{"href":386,"title":387,"description":388},"\u002Fblog\u002Fhow-to\u002Ftrack-utm-without-google-analytics","Track UTM Parameters Without Google Analytics","Why utm_content needs a trackEvent() call to show up in a breakdown, and how to build the per-campaign report.",[384,390,382,394],{"href":391,"title":392,"description":393},"\u002Fblog\u002Fhow-to\u002Ftrack-podcast-youtube-signups","Track Podcast and YouTube Signups Without a Clickable Link","Attribution for channels with no link to tag: vanity redirect paths, the 30-day first-touch cookie, and the trackEvent bridge onto a signup.",[384,395,399],{"href":396,"title":397,"description":398},"\u002Fblog\u002Fhow-to\u002Fpages-that-drive-signups","Which Pages Drive Signups: Attribute Conversions by Path and Referrer","The same attribution applied to every page on your site, not just the blog posts.",[400,401],"cta-box",{"href":402,"label":403},"\u002F","Get Started Free",{"title":100,"searchDepth":405,"depth":405,"links":406},2,[407,408,409,413,414,415],{"id":45,"depth":405,"text":46},{"id":85,"depth":405,"text":86},{"id":128,"depth":405,"text":129,"children":410},[411],{"id":174,"depth":412,"text":175},3,{"id":190,"depth":405,"text":191},{"id":254,"depth":405,"text":255},{"id":316,"depth":405,"text":317},"how-to","2026-05-29","2026-07-29","Your Analytics tab shows page views per blog post. Here is how to go further -- tag CTAs with custom events so you know which posts actually convert visitors into waitlist signups.",false,"md",[423,424,426,428,430],{"question":340,"answer":343},{"question":346,"answer":425},"Add UTM parameters to every CTA link on your blog posts. Use ?utm_source=blog&utm_content=your-post-slug on any link that points to your signup page or waitlist widget. The signup will be attributed to that source in your Analytics tab.",{"question":356,"answer":427},"Yes. Use OperatorStack.trackEvent() to fire a custom event on the click, with the post slug as a property. This captures the intent even if the visitor does not complete the signup.",{"question":366,"answer":429},"Custom events fired via trackEvent() appear in the Events section of your Analytics tab. Each event name shows a count and any properties you passed, including the post slug or category.",{"question":375,"answer":378},"track blog conversions,blog post conversion tracking,which blog posts drive signups,content analytics,track cta clicks,blog conversion rate",{},true,"See which blog posts drive signups, not just traffic. Tag your CTAs with trackEvent() and read the breakdown in your Analytics tab.","Track Blog Post Conversions With OperatorStack","\u002Fblog\u002Fhow-to\u002Ftrack-blog-signups","6 min","HowTo",{"title":5,"description":419},{"loc":436},"blog\u002Fhow-to\u002Ftrack-blog-signups",[],"summary_large_image","YKW7fGjYxY36Sawqyf6KxJZHZvuEev9IthTMHgV076o",1793355878557]