{"id":79166,"date":"2026-04-03T12:04:46","date_gmt":"2026-04-03T06:34:46","guid":{"rendered":"https:\/\/www.tothenew.com\/blog\/?p=79166"},"modified":"2026-05-22T11:35:29","modified_gmt":"2026-05-22T06:05:29","slug":"adobe-analytics-health-check-using-analytics-network-callb-ss-using-postman","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/adobe-analytics-health-check-using-analytics-network-callb-ss-using-postman\/","title":{"rendered":"Adobe Analytics Health Check: Parsing b\/ss Network Calls with Postman"},"content":{"rendered":"<p>If you\u2019ve worked with Adobe Analytics, you\u2019ve probably done this more times than you\u2019d like to admit:<\/p>\n<p>Open DevTools \u2192 Network \u2192 filter b\/ss \u2192 click \u2192 scroll.<\/p>\n<p>Everything is technically there, but reading it isn\u2019t exactly smooth. It\u2019s one long URL, parameters packed together, values encoded, and no real structure to guide your eyes.<\/p>\n<p>Debugger extensions help, and they do a good job of organizing things. But even then, I\u2019ve noticed situations where they can be slightly confusing. Sometimes it looks like multiple calls are firing, when in reality it\u2019s just one request being interpreted differently.<\/p>\n<p>Because of that, I usually fall back to one thing: The actual <strong>b\/ss network call<\/strong>. That\u2019s the closest thing to the source of truth.<\/p>\n<h2>A Simple Idea<\/h2>\n<p>What if instead of trying to inspect that raw URL every time, you could just:<\/p>\n<p>Copy the request URL, paste it somewhere, and see everything in a clean, structured format?<\/p>\n<ul>\n<li>No scrolling through a long string.<\/li>\n<li>No decoding values mentally.<\/li>\n<\/ul>\n<p>Just something that is:<\/p>\n<ul>\n<li>readable<\/li>\n<li>consistent<\/li>\n<li>easy to scan<\/li>\n<\/ul>\n<p>That\u2019s what we\u2019re going to build using Postman.<\/p>\n<h2>Quick Note on Postman<\/h2>\n<p>If you haven\u2019t used Postman before, it\u2019s basically a tool used to send and test API requests. In simple language, Postman is a simple tool that lets you \u201ctalk\u201d to apps and websites behind the scenes to see how they work.<br \/>\nIt helps you send requests and instantly view responses, making it easier to understand and test digital services without needing deep technical skills.<\/p>\n<p>We\u2019re just using it to <strong>process the request itself.<\/strong><\/p>\n<h2>What We\u2019re Building<\/h2>\n<p>We\u2019ll create a simple setup inside Postman that:<\/p>\n<ul>\n<li>takes an Adobe Analytics beacon (b\/ss URL)<\/li>\n<li>parses all parameters<\/li>\n<li>formats them into a clean structure<\/li>\n<li>highlights a few things that might be worth a look<\/li>\n<\/ul>\n<p>After setting it up once, the workflow is simple: <strong>copy \u2192 paste \u2192 run \u2192 review.<\/strong><\/p>\n<h2>What the Output Looks Like<\/h2>\n<p>Instead of reading a long query string, you\u2019ll see something like:<\/p>\n<pre>pageName \u00a0 : homepage\r\n\r\nevents \u00a0 \u00a0 : event1,event2\r\n\r\nv1 \u00a0 \u00a0 \u00a0 \u00a0 : logged in\r\n\r\nc54\u00a0 \u00a0 \u00a0 \u00a0 : NO VALUE SET<\/pre>\n<p>Everything is aligned.<br \/>\nEverything is in one place.<\/p>\n<p>You can quickly scan the output.&#8221; or &#8220;Your eyes can quickly scan the data.<\/p>\n<h2>Not a Validator \u2014 Just a Better Way to Read<\/h2>\n<p>This is important to understand.<\/p>\n<p>This setup isn\u2019t meant to decide whether something is right or wrong.<\/p>\n<p>The reason is that if any eVar or prop shows as \u201cunspecified\u201d or has no value set, it will still be highlighted. However, that doesn\u2019t automatically mean there\u2019s an issue. In some cases, those variables are not supposed to capture any value for that particular page load or user action.<\/p>\n<p>So, while the setup helps you quickly spot these cases, you\u2019ll still need to check and decide whether it\u2019s actually a problem or expected behavior.<\/p>\n<p>It simply helps you notice things like:<\/p>\n<ul>\n<li>empty values<\/li>\n<li>placeholder values<\/li>\n<li>generic names<\/li>\n<li>unusual patterns<\/li>\n<\/ul>\n<p>For example:<\/p>\n<ul>\n<li>NO VALUE SET might be completely expected<\/li>\n<li>An empty eVar might be intentional<\/li>\n<\/ul>\n<p>But when everything is laid out clearly, it\u2019s easier to spot what you want to look into.<\/p>\n<div id=\"attachment_79165\" style=\"width: 1696px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-79165\" decoding=\"async\" loading=\"lazy\" class=\" wp-image-79165\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_4.png\" alt=\"Console Log Unspecified values\" width=\"1686\" height=\"758\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_4.png 1904w, \/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_4-300x135.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_4-1024x460.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_4-768x345.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_4-1536x691.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_4-624x281.png 624w\" sizes=\"(max-width: 1686px) 100vw, 1686px\" \/><p id=\"caption-attachment-79165\" class=\"wp-caption-text\">Post UI<\/p><\/div>\n<h2>It becomes useful in situations like these:<\/h2>\n<ul>\n<li><strong>Checking multiple pages<\/strong><br \/>\nHomepage, product page, checkout\u2026<\/li>\n<\/ul>\n<p>You\u2019re looking at similar beacons again and again.<\/p>\n<p>Having the same structured format every time makes it easier to stay consistent.<\/p>\n<ul>\n<li><strong>During release cycles<\/strong><br \/>\nLet\u2019s say your team pushes updates every month.<\/li>\n<\/ul>\n<p>Now you want to quickly check:<\/p>\n<ul>\n<li>Did anything change?<\/li>\n<li>Is something missing?<\/li>\n<li>Does anything look different?<\/li>\n<\/ul>\n<p>Instead of manually scanning everything again, you can:<\/p>\n<ul>\n<li>Take a beacon before release<\/li>\n<li>Take a beacon after release<\/li>\n<li>Run both through the same setup<\/li>\n<\/ul>\n<p>It gives you a quick, high-level sanity check.<\/p>\n<p>Sometimes nothing is clearly broken, but something doesn\u2019t look right. This helps you see those small differences more easily.<\/p>\n<p>&nbsp;<\/p>\n<h2>How to Set It Up (One-Time Setup)<\/h2>\n<p><strong>Step 1: Create a Collection<\/strong><\/p>\n<ul>\n<li>Open Postman.<\/li>\n<li>Click New \u2192 Collection.<\/li>\n<li>Name it something like Adobe Analytics Beacon Parser.<\/li>\n<\/ul>\n<div id=\"attachment_79162\" style=\"width: 1831px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-79162\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-79162\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_1.png\" alt=\"Postman collection Screeshot \" width=\"1821\" height=\"876\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_1.png 1821w, \/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_1-300x144.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_1-1024x493.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_1-768x369.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_1-1536x739.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2026\/03\/Screenshot_1-624x300.png 624w\" sizes=\"(max-width: 1821px) 100vw, 1821px\" \/><p id=\"caption-attachment-79162\" class=\"wp-caption-text\">Postman UI and collection code details<\/p><\/div>\n<p><strong>Step 2: Add the Script<\/strong><br \/>\nOpen the collection \u2192 go to the Tests tab \u2192 paste this:<\/p>\n<p>let url = pm.request.url.toString();<\/p>\n<p>\/\/ &#8212;&#8212;&#8211; PARSE &#8212;&#8212;&#8211;<\/p>\n<p>let query = {};<\/p>\n<p>if (url.includes(&#8220;?&#8221;)) {<\/p>\n<p>url.split(&#8216;?&#8217;)[1].split(&#8216;&amp;&#8217;).forEach(param =&gt; {<\/p>\n<p>let [key, value] = param.split(&#8216;=&#8217;);<\/p>\n<p>try {<\/p>\n<p>query[key] = decodeURIComponent(value || &#8221;);<\/p>\n<p>} catch (e) {<\/p>\n<p>query[key] = value || &#8221;;<\/p>\n<p>}<\/p>\n<p>});<\/p>\n<p>}<\/p>\n<p>\/\/ &#8212;&#8212;&#8211; STORAGE &#8212;&#8212;&#8211;<\/p>\n<p>let critical = [];<\/p>\n<p>let warning = [];<\/p>\n<p>let info = [];<\/p>\n<p>function addCritical(msg) {<\/p>\n<p>critical.push(msg);<\/p>\n<p>}<\/p>\n<p>function addWarning(msg) {<\/p>\n<p>warning.push(msg);<\/p>\n<p>}<\/p>\n<p>function addInfo(msg) {<\/p>\n<p>info.push(msg);<\/p>\n<p>}<\/p>\n<p>\/\/ &#8212;&#8212;&#8211; RULES &#8212;&#8212;&#8211;<\/p>\n<p>let badValues = [<br \/>\n&#8220;&#8221;,<br \/>\n&#8220;undefined&#8221;,<br \/>\n&#8220;null&#8221;,<br \/>\n&#8220;unspecified&#8221;,<br \/>\n&#8220;no value set&#8221;<br \/>\n];<\/p>\n<p>let detailed = [];<\/p>\n<p>let maxKeyLength = Math.max(<br \/>\n&#8230;Object.keys(query).map(k =&gt; k.length)<br \/>\n);<\/p>\n<p>\/\/ Visitor ID<\/p>\n<p>if (!query[&#8220;mid&#8221;]) {<\/p>\n<p>addCritical(&#8220;mid (Visitor ID) is missing&#8221;);<\/p>\n<p>}<\/p>\n<p>\/\/ Loop variables<\/p>\n<p>for (let key in query) {<\/p>\n<p>let val = query[key];<\/p>\n<p>let lower = (val || &#8220;&#8221;).toLowerCase();<\/p>\n<p>let label = &#8220;\u2705&#8221;;<\/p>\n<p>if (badValues.includes(lower)) {<\/p>\n<p>label = &#8220;\ud83d\udd34&#8221;;<\/p>\n<p>addCritical(`${key} = ${val}`);<\/p>\n<p>}<\/p>\n<p>else if (key.startsWith(&#8220;v&#8221;) &amp;&amp; lower.includes(&#8220;no value&#8221;)) {<\/p>\n<p>label = &#8220;\ud83d\udfe1&#8221;;<\/p>\n<p>addWarning(`${key} = ${val}`);<\/p>\n<p>}<\/p>\n<p>else if (key.startsWith(&#8220;c&#8221;) &amp;&amp; lower.includes(&#8220;no value&#8221;)) {<\/p>\n<p>label = &#8220;\ud83d\udfe1&#8221;;<\/p>\n<p>addWarning(`${key} = ${val}`);<\/p>\n<p>}<\/p>\n<p>else if (<br \/>\nkey === &#8220;pageName&#8221; &amp;&amp;<br \/>\n[&#8220;home&#8221;, &#8220;homepage&#8221;, &#8220;en&#8221;, &#8220;index&#8221;].includes(lower)<br \/>\n) {<\/p>\n<p>label = &#8220;\ud83d\udfe1&#8221;;<\/p>\n<p>addWarning(`Weak pageName: ${val}`);<\/p>\n<p>}<\/p>\n<p>\/\/ Events check<\/p>\n<p>if (key === &#8220;events&#8221;) {<\/p>\n<p>let matches = val.match(\/event\\d+=(\\d+(\\.\\d+)?)\/g) || [];<\/p>\n<p>matches.forEach(e =&gt; {<\/p>\n<p>if (e.includes(&#8220;=0&#8221;)) {<\/p>\n<p>addCritical(`Zero event: ${e}`);<\/p>\n<p>label = &#8220;\ud83d\udd34&#8221;;<\/p>\n<p>}<\/p>\n<p>});<\/p>\n<p>}<\/p>\n<p>let paddedKey = key.padEnd(maxKeyLength, &#8221; &#8220;);<\/p>\n<p>detailed.push({<br \/>\nline: `${paddedKey} : ${val}`,<br \/>\nlabel<br \/>\n});<\/p>\n<p>}<\/p>\n<p>\/\/ &#8212;&#8212;&#8211; SCORE &#8212;&#8212;&#8211;<\/p>\n<p>let score = 100;<\/p>\n<p>score -= critical.length * 10;<\/p>\n<p>score -= warning.length * 5;<\/p>\n<p>score -= info.length * 2;<\/p>\n<p>if (score &lt; 0) {<\/p>\n<p>score = 0;<\/p>\n<p>}<\/p>\n<p>\/\/ &#8212;&#8212;&#8211; BUILD DASHBOARD &#8212;&#8212;&#8211;<\/p>\n<p>let report = &#8220;&#8221;;<\/p>\n<p>report += &#8220;\\n\ud83d\udcca ANALYTICS HEALTH DASHBOARD\\n&#8221;;<\/p>\n<p>report += &#8220;================================================\\n\\n&#8221;;<\/p>\n<p>\/\/ PAYLOAD<\/p>\n<p>report += &#8220;\ud83d\udce6 PAYLOAD\\n&#8221;;<\/p>\n<p>report += &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\\n&#8221;;<\/p>\n<p>detailed.forEach(item =&gt; {<\/p>\n<p>report += `${item.line} ${item.label}\\n`;<\/p>\n<p>});<\/p>\n<p>\/\/ SUMMARY<\/p>\n<p>report += &#8220;\\n\ud83d\udea8 ISSUES SUMMARY\\n&#8221;;<\/p>\n<p>report += &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\\n&#8221;;<\/p>\n<p>report += `\ud83d\udd34 Critical (${critical.length})\\n`;<\/p>\n<p>critical.length<br \/>\n? critical.forEach(i =&gt; report += ` &#8211; ${i}\\n`)<br \/>\n: report += &#8221; None\\n&#8221;;<\/p>\n<p>report += `\\n\ud83d\udfe1 Warning (${warning.length})\\n`;<\/p>\n<p>warning.length<br \/>\n? warning.forEach(i =&gt; report += ` &#8211; ${i}\\n`)<br \/>\n: report += &#8221; None\\n&#8221;;<\/p>\n<p>report += `\\n\ud83d\udd35 Info (${info.length})\\n`;<\/p>\n<p>info.length<br \/>\n? info.forEach(i =&gt; report += ` &#8211; ${i}\\n`)<br \/>\n: report += &#8221; None\\n&#8221;;<\/p>\n<p>\/\/ SCORE<\/p>\n<p>report += &#8220;\\n\ud83d\udcca FINAL SCORE\\n&#8221;;<\/p>\n<p>report += &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;\\n&#8221;;<\/p>\n<p>report += `Score: ${score}\/100\\n`;<\/p>\n<p>report += &#8220;================================================\\n&#8221;;<\/p>\n<p>\/\/ &#8212;&#8212;&#8211; PRINT TO CONSOLE (ALWAYS) &#8212;&#8212;&#8211;<\/p>\n<p>console.log(report);<\/p>\n<p>\/\/ &#8212;&#8212;&#8211; TEST RESULT (CLEAN STATUS ONLY) &#8212;&#8212;&#8211;<\/p>\n<p>pm.test(&#8220;Analytics Health Check&#8221;, function () {<\/p>\n<p>if (critical.length &gt; 0) {<\/p>\n<p>pm.expect.fail(<br \/>\n`\u274c ${critical.length} Critical Issues | Score: ${score}`<br \/>\n);<\/p>\n<p>} else if (warning.length &gt; 0) {<\/p>\n<p>pm.expect(true).to.be.true;<\/p>\n<p>console.log(&#8220;\u26a0\ufe0f Passed with warnings&#8221;);<\/p>\n<p>} else {<\/p>\n<p>pm.expect(true).to.be.true;<\/p>\n<p>console.log(&#8220;\u2705 All checks passed&#8221;);<\/p>\n<p>}<\/p>\n<p>});<\/p>\n<p>Set the method to GET.<\/p>\n<ul>\n<li>Paste your<span style=\"color: #008000;\"><em> b\/ss<\/em><\/span> URL (which should look like &#8211; <span style=\"color: #ff0000;\">https:\/\/abc.sc.omtrdc.net\/b\/ss\/rsid\/10\/JS-2.22.0-LEWM\/s19464469134963?AQB=1&amp;ndh=1&amp;pf=1&amp;et=1&amp;t=2&#8230;&#8230;..<span style=\"color: #000000;\">)<\/span><\/span><\/li>\n<\/ul>\n<div id=\"attachment_79402\" style=\"width: 1755px\" class=\"wp-caption alignnone\"><img aria-describedby=\"caption-attachment-79402\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-79402\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2026\/04\/Screenshot_3.png\" alt=\"Get Request URL Reference\" width=\"1745\" height=\"336\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2026\/04\/Screenshot_3.png 1745w, \/blog\/wp-ttn-blog\/uploads\/2026\/04\/Screenshot_3-300x58.png 300w, \/blog\/wp-ttn-blog\/uploads\/2026\/04\/Screenshot_3-1024x197.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2026\/04\/Screenshot_3-768x148.png 768w, \/blog\/wp-ttn-blog\/uploads\/2026\/04\/Screenshot_3-1536x296.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2026\/04\/Screenshot_3-624x120.png 624w\" sizes=\"(max-width: 1745px) 100vw, 1745px\" \/><p id=\"caption-attachment-79402\" class=\"wp-caption-text\">b\/ss network call URL<\/p><\/div>\n<p><strong>Step 4: Run It<\/strong><\/p>\n<ul>\n<li>Click Send<\/li>\n<li>Open Postman Console<br \/>\nYou\u2019ll see the parsed output.<\/li>\n<\/ul>\n<h2><\/h2>\n<h2>Final Thought<\/h2>\n<p>This is not a replacement for debugging tools; it just makes one part easier: reading the beacon.<\/p>\n<p>Essentially, we are taking the most reliable debugging method\u2014the raw beacon\u2014and making it readable for quick analysis. This is especially useful when you\u2019re doing a high-level sanity check. For example, going through key pages like the homepage, product page, or checkout, and validating important interactions as form submits, search, or purchase events.<\/p>\n<p>And that&#8217;s where this can become useful, just simply copy and paste the request URL, keep on adding new requests under one collection, and review the output in a consistent format. Another small advantage is that everything stays saved. So if you want to revisit a specific check later, you don\u2019t have to capture it again \u2014 it\u2019s already there.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you\u2019ve worked with Adobe Analytics, you\u2019ve probably done this more times than you\u2019d like to admit: Open DevTools \u2192 Network \u2192 filter b\/ss \u2192 click \u2192 scroll. Everything is technically there, but reading it isn\u2019t exactly smooth. It\u2019s one long URL, parameters packed together, values encoded, and no real structure to guide your eyes. [&hellip;]<\/p>\n","protected":false},"author":1979,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":11},"categories":[5868],"tags":[1522,5409,8538,6946,1397,4983,8539],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/79166"}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/1979"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=79166"}],"version-history":[{"count":20,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/79166\/revisions"}],"predecessor-version":[{"id":79847,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/79166\/revisions\/79847"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=79166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=79166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=79166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}