{"id":64320,"date":"2025-02-02T12:39:36","date_gmt":"2025-02-02T12:39:36","guid":{"rendered":"https:\/\/peraltafinancing.com\/analytics\/debug-guide-for-web-analytics-and-tag-management\/"},"modified":"2025-02-02T12:39:36","modified_gmt":"2025-02-02T12:39:36","slug":"debug-guide-for-web-analytics-and-tag-management","status":"publish","type":"post","link":"https:\/\/fivemor.com\/?p=64320","title":{"rendered":"Debug Guide For Web Analytics And Tag Management"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div>\n<p>One of the key skills for <em>anyone<\/em> working with <strong>web analytics<\/strong> and <strong>tag management<\/strong> is understanding how to identify where things went wrong, why they went wrong, and ideally how to fix them.<\/p>\n<p>There are plenty of excellent browser extensions for helping you debug, and we\u2019ll discuss these in the guide, too. But most of all we\u2019re going to use <strong>browsers\u2019 own developer tools<\/strong>, as they are always the best source of truth for anything that happens within the browser window.<\/p>\n<p>In the guide, we\u2019ll use <a href=\"https:\/\/developers.google.com\/analytics\/devguides\/collection\/ga4\">Google Analytics 4<\/a> and <a href=\"https:\/\/tagmanager.google.com\/\">Google Tag Manager<\/a> as examples. However, the guide\u2019s topics can be extended to <em>any<\/em> web analytics tools and tag management solutions out there, because the use cases are universal.<\/p>\n<p>                <span class=\"simmer\"><br \/>\n  <span class=\"close\">X<\/span><\/p>\n<p>\n    <span class=\"fa fa-md fa-bell\"\/><br \/>\n    <strong>The Simmer Newsletter<\/strong>\n  <\/p>\n<p>\n    Subscribe to the <a href=\"https:\/\/www.simoahava.com\/newsletter\/\">Simmer newsletter<\/a> to get the latest news and content from Simo Ahava into your email inbox!\n  <\/p>\n<p>  <\/span><\/p>\n<p>Your best friend in debugging issues with your web analytics and tag management systems in the web browser are the <strong>browsers\u2019 own developer tools<\/strong>.<\/p>\n<p>Developer tools are a suite of utilities that you can use to investigate various different aspects of the dynamic web page the user is inspecting.<\/p>\n<div style=\"aspect-ratio: 4222 \/ 2474;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/developer-tools-keyboard-shortcuts.jpg\" title=\"Shortcuts for opening the developer tools\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"2474\" width=\"4222\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/developer-tools-keyboard-shortcuts.jpg#ZgotmplZ\" alt=\"Shortcuts for opening the developer tools\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>The image above lists the <strong>keyboard shortcuts<\/strong> for opening the developer tools in various browsers and operating systems.<\/p>\n<blockquote>\n<p>Note that on <strong>Safari<\/strong>, you\u2019ll want to open <strong>Safari<\/strong> -&gt; <strong>Preferences<\/strong> -&gt; <strong>Advanced<\/strong> and check the button next to <strong>Show Develop menu in menu bar<\/strong>.<\/p>\n<\/blockquote>\n<p>All of the browsers above utilize a similar set of developer tools with just small differences in the UI and the chosen semantics. The most useful tools we\u2019ll focus on are:<\/p>\n<ul>\n<li>\n<p>The <strong>element inspector<\/strong>, which lets you look at the dynamic representation of the web page (<strong>D<\/strong>ocument <strong>O<\/strong>bject <strong>M<\/strong>odel). This is particularly useful for inspecting injected tracking scripts and custom HTML elements added by tag management solutions.<\/p>\n<\/li>\n<li>\n<p>The <strong>network debugger<\/strong>, which lets you inspect and analyze outgoing <strong>HTTP requests<\/strong> sent from the page (or embedded frames). This is one of the most important tools for you, as it will tell you the <strong>truth<\/strong> about what is actually sent from the user\u2019s browser.<\/p>\n<\/li>\n<li>\n<p>The <strong>JavaScript console<\/strong>, which lets you run JavaScript code in the context of the current page (or embedded frame). Vital for recognizing issues with the JavaScript implementations of your analytics scripts.<\/p>\n<\/li>\n<li>\n<p>The <strong>sources browser<\/strong>, which lets you browse through the JavaScript resources loaded on the current page (or embedded frames). Great for identifying mismatches between what you expected the JavaScript file to contain vs. what\u2019s <em>actually<\/em> contained within.<\/p>\n<\/li>\n<li>\n<p>The <strong>application storage<\/strong>, which lets you investigate the browser storage (cookies, <code>localStorage<\/code>, etc.) utilized on the current page (or embedded frames). Instrumental for understanding why some trackers might not be able to persist data consistently.<\/p>\n<\/li>\n<\/ul>\n<p>In this section, we\u2019ll walk through these different tools with more detail, so that you\u2019ll have a better understanding of how to use them to unravel some of the more complicated debugging cases you run into.<\/p>\n<blockquote>\n<p>Note! This section uses mainly Chrome\u2019s developer tools in examples. It\u2019s possible the actual actions are (slightly) different in other browsers.<\/p>\n<\/blockquote>\n<h3 id=\"element-inspector\">Element inspector<\/h3>\n<p>The <strong>element inspector<\/strong> lets you analyze the DOM (Document Object Model) of the page.<\/p>\n<p>When the browser loads the HTML source it retrieves from the site\u2019s web server, it renders it into a dynamic tree model, accessible via JavaScript. This dynamic representation is the DOM.<\/p>\n<p>Whenever an analytics snippet or a tag manager interacts with the page, such as by loading a third-party JavaScript library or adding a click listener somewhere, they modify the DOM.<\/p>\n<div style=\"aspect-ratio: 1724 \/ 532;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/element-inspector.jpg\" title=\"Element Inspector\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"532\" width=\"1724\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/element-inspector.jpg#ZgotmplZ\" alt=\"Element Inspector\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Thus, if you have problems with your implementation, it\u2019s useful to search through the element inspector to find what the issue could be.<\/p>\n<p>The element inspector is also extremely useful when you\u2019re building <strong>triggers<\/strong> or <strong>variables<\/strong> in your tag management system with the purpose of scraping some information from the page or adding listeners to and injecting elements into the document.<\/p>\n<p>Here are a couple of cool tricks you can try in the element inspector.<\/p>\n<h4 id=\"search-for-a-specific-element-in-the-inspector\">Search for a specific element in the inspector<\/h4>\n<p>Hit <strong>CMD + F<\/strong> \/ <strong>CTRL + F<\/strong> to open a search bar. You can then search for a <strong>string<\/strong> (e.g. text content) or a <a href=\"https:\/\/www.simoahava.com\/analytics\/css-selector-guide-google-tag-manager\/\">CSS selector<\/a> to have the inspector locate a specific element.<\/p>\n<p>For example, to search for all elements with the class name <code>simmer<\/code>, you can type <code>.simmer<\/code> into the search bar and the inspector will return all the matches.<\/p>\n<p>If you\u2019re unsure whether Google Tag Manager actually added the Google Analytics 4 script on the page, for exampled, you could search for <code>gtag\/js<\/code> to find all elements that have that particular string <em>somewhere<\/em> in them. Since GA4 is loaded from the <code>\/gtag\/js?id=G-...<\/code> URL, the inspector should find the GA4 script element, unless it\u2019s actually missing.<\/p>\n<h4 id=\"select-a-specific-element-on-the-page-itself\">Select a specific element on the page itself<\/h4>\n<p>You can also do the reverse. If you click the little element selector icon (this differs from browser to browser) in the developer tools panel, you can actually select an element on the page to reveal it in the element inspector.<\/p>\n<div style=\"aspect-ratio: 1862 \/ 690;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/element-selector.jpg\" title=\"Element selector\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"690\" width=\"1862\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/element-selector.jpg#ZgotmplZ\" alt=\"Element selector\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>In addition to pinpointing it in the element inspector, the tool also displays some useful information about the element in question.<\/p>\n<p>When you select an element in the inspector with the right mouse button, you\u2019ll see a context menu.<\/p>\n<div style=\"aspect-ratio: 1084 \/ 928;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/element-context-menu.jpg\" title=\"Element context menu\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"928\" width=\"1084\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/element-context-menu.jpg#ZgotmplZ\" alt=\"Element context menu\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>You can do a <strong>lot<\/strong> of cool stuff with this, such as:<\/p>\n<ul>\n<li>\n<p><strong>Add \/ edit<\/strong> the element\u2019s attributes. I use this a lot to change link URLs to something else, when I want to test a specific outgoing link, for example.<\/p>\n<\/li>\n<li>\n<p><strong>Edit \/ delete<\/strong> the element itself. Sometimes it\u2019s useful to just delete an element entirely (e.g. an overlay that hides the page underneath). And sometimes you\u2019ll want to edit the entire HTML structure of an element when you want to add new contents to it for testing a click listener, for example.<\/p>\n<\/li>\n<li>\n<p><strong>Copy selector<\/strong>, as this lets you copy a <strong>CSS selector<\/strong> path to the element itself. Extremely useful when configuring triggers in Google Tag Manager, for example. Just note that the CSS selector path is usually needlessly complex, and you can trim it down to be more generic in order to avoid subtle changes in the DOM from breaking your triggers.<\/p>\n<\/li>\n<li>\n<p><strong>Break on\u2026<\/strong> lets you pause the page whenever the element or its subtree (nested elements) <em>changes<\/em>. This is pretty useful when you want to inspect what happens when an element becomes visible or when an element\u2019s content is dynamically changed (think form validation error messages, for example).<\/p>\n<\/li>\n<\/ul>\n<h4 id=\"change-element-styles\">Change element styles<\/h4>\n<p>When you\u2019ve selected the element, you can change the associated <strong>styles<\/strong> with the developer tools.<\/p>\n<div style=\"aspect-ratio: 2150 \/ 652;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/change-element-style.jpg\" title=\"Change element styles\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"652\" width=\"2150\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/change-element-style.jpg#ZgotmplZ\" alt=\"Change element styles\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>This might have marginal use for analytics debugging, but occasionally you might use it to make an element visible or move it around when you can\u2019t find it in the actual page.<\/p>\n<h3 id=\"network-debugger\">Network debugger<\/h3>\n<p>Often you\u2019ll find that your tag management system and\/or your analytics debugger extension claims that your hit has <strong>fired<\/strong>, but no data is collected into the vendor endpoint.<\/p>\n<p>At this point, you need to open the <strong>Network<\/strong> tab in the developer tools, as this lists <strong>all the HTTP requests<\/strong> sent from the browser.<\/p>\n<div style=\"aspect-ratio: 2154 \/ 454;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/network-debugger.jpg\" title=\"Network debugger\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"454\" width=\"2154\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/network-debugger.jpg#ZgotmplZ\" alt=\"Network debugger\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>The network debugger is <strong>the ultimate truth<\/strong>. If a request doesn\u2019t appear here, then the browser has not sent it. So if your tag management system says that a GA4 hit has <strong>fired<\/strong> but you see no evidence of a <code>collect?v=2<\/code> request in the network debugger, then the hit has <strong>not<\/strong> been sent.<\/p>\n<p>It might be useful to check the <strong>Preserve log<\/strong> option, as this doesn\u2019t clear the log of requests between page loads. This is very useful when you want to debug what happened on a previous page.<\/p>\n<p>For a more detailed walkthrough of the network debugger, check out <a href=\"https:\/\/developer.chrome.com\/docs\/devtools\/network\/reference\/\">this excellent resource<\/a>.<\/p>\n<p>Here are some of the things you can do with the network debugger.<\/p>\n<h4 id=\"filter-for-specific-requests\">Filter for specific requests<\/h4>\n<p>By typing something into the filter field, you can show only the HTTP requests that match the filter.<\/p>\n<p>The filter searches through the request URL and the request body.<\/p>\n<div style=\"aspect-ratio: 1502 \/ 412;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/network-filter.jpg\" title=\"Network filter\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"412\" width=\"1502\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/network-filter.jpg#ZgotmplZ\" alt=\"Network filter\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>When you select a request in the debugger, a small overlay opens with various tabs.<\/p>\n<ul>\n<li>\n<p><strong>Headers<\/strong> includes all the HTTP headers of the <em>request<\/em> and the <em>response<\/em>. This is useful for debugging things like cookies, referrer values, and where the request was actually sent.<\/p>\n<\/li>\n<li>\n<p><strong>Payload<\/strong> contains the <strong>query parameters<\/strong> and the <strong>request body<\/strong>. Extremely important when analyzing what was actually sent to the analytics platform.<\/p>\n<\/li>\n<li>\n<p><strong>Response<\/strong> shows what the web server actually responded with. This is often empty or nonsensical with pixel requests, but it\u2019s useful when analyzing <strong>API responses<\/strong> or JavaScript files.<\/p>\n<\/li>\n<li>\n<p><strong>Cookies<\/strong> lists all the cookies that were <strong>sent with the request<\/strong> and <strong>set in the response<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<h4 id=\"block-a-request-from-future-loads\">Block a request from future loads<\/h4>\n<p>You can right-click any request in the list and choose <strong>Block request URL<\/strong> or <strong>Block request domain<\/strong> to prevent the page from being able to send the request until the block is removed.<\/p>\n<div style=\"aspect-ratio: 1366 \/ 668;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/block-url.jpg\" title=\"Block URL\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"668\" width=\"1366\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/block-url.jpg#ZgotmplZ\" alt=\"Block URL\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>When the resource URL (or domain) is blocked, then any requests that match the URL (or domain) will be blocked in future requests.<\/p>\n<p>This is <strong>extremely<\/strong> useful when you want to figure out which JavaScript resource is causing conflicts on the page. By blocking each one-by-one and then reloading the page, you\u2019ll be able to pinpoint the file that causes issues.<\/p>\n<p>To <strong>unblock<\/strong> a resource, press the <strong>ESC<\/strong> key to toggle the <strong>Drawer<\/strong>, select the <strong>Network request blocking<\/strong> tab and uncheck the box next to the request (or delete it from the respective buttons). If you don\u2019t see the tab, you can select it by clicking the Drawer menu (the three vertical dots) in the top-left corner of the Drawer.<\/p>\n<blockquote>\n<p>You can also right-click the blocked resource in the network debugger and choose <strong>Unblock\u2026<\/strong>.<\/p>\n<\/blockquote>\n<h4 id=\"manually-throttle-the-page-speed\">Manually throttle the page speed<\/h4>\n<p>If you want to test how the page loads like on a slower connection (might be useful every now and then), you can choose a <strong>throttling speed<\/strong> from the network tools.<\/p>\n<div style=\"aspect-ratio: 1090 \/ 394;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/throttling.jpg\" title=\"Throttling speed\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"394\" width=\"1090\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/throttling.jpg#ZgotmplZ\" alt=\"Throttling speed\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Remember to switch back to <strong>No throttling<\/strong> when done, though, or you\u2019ll have to continue suffering with slowly loading pages.<\/p>\n<h4 id=\"pinpoint-the-initiator-of-the-request\">Pinpoint the initiator of the request<\/h4>\n<p>In the <strong>Initiator<\/strong> column, you can see the resource or process that caused the redirect to fire.<\/p>\n<p>By clicking the resource in the column, it will jump to the relevant part of the developer tools to show what process initiated the request.<\/p>\n<div style=\"aspect-ratio: 1070 \/ 302;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/network-initiator.jpg\" title=\"Network initiator\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"302\" width=\"1070\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/network-initiator.jpg#ZgotmplZ\" alt=\"Network initiator\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>If the initiator is <code>(index)<\/code>, it means the request originated from a resource injected into the DOM, which means clicking it will open the <strong>element inspector<\/strong> with the element selected.<\/p>\n<p>If the initiator is a JavaScript file or a CSS file, for example, then developer tools will open the <strong>Sources<\/strong> tab with the relevant part of the source file code selected. This might not be very useful in itself, but you can use the Sources panel to add a breakpoint to the injection moment in order to replay through the stack after a page reload (more on this below in the <a href=\"#sources\">Sources section<\/a>).<\/p>\n<h3 id=\"javascript-console\">JavaScript console<\/h3>\n<p>The JavaScript console lets you execute <strong>any<\/strong> JavaScript commands in <strong>the context of the current page<\/strong>.<\/p>\n<p>The context of the page is the DOM, and you can use <a href=\"https:\/\/www.w3schools.com\/js\/js_htmldom_methods.asp\">DOM methods<\/a> to interact with page elements.<\/p>\n<p>Here are some use cases for the JavaScript console.<\/p>\n<h4 id=\"inspect-logs\">Inspect logs<\/h4>\n<p>Many tools output debug messages to the JavaScript console, so the <strong>first course of action<\/strong> whenever you run into trouble is to open the JavaScript console to see if there are any relevant errors shown.<\/p>\n<div style=\"aspect-ratio: 1676 \/ 864;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/console-log.jpg\" title=\"Console log messages\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"864\" width=\"1676\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/console-log.jpg#ZgotmplZ\" alt=\"Console log messages\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>It\u2019s a good idea to add some <code>console.log(msg)<\/code> calls in whatever code you add yourself via a tag management system, for example. That way you can debug the log output in the JavaScript console \u2013 often this is the easiest way to debug code execution.<\/p>\n<h4 id=\"check-the-value-of-global-variables\">Check the value of global variables<\/h4>\n<p>In browser JavaScript, global variables are stored in the <code>window<\/code> object.<\/p>\n<p>If you want to check whether a global <code>dataLayer<\/code> array exists, you can simply type <code>window.dataLayer<\/code> and press enter. If the console shows <code>undefined<\/code>, it means that <code>dataLayer<\/code> does not exist in global scope.<\/p>\n<div style=\"aspect-ratio: 1028 \/ 232;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/undefined-datalayer.jpg\" title=\"Undefined dataLayer\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"232\" width=\"1028\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/undefined-datalayer.jpg#ZgotmplZ\" alt=\"Undefined dataLayer\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>You can also <em>set<\/em> new global variables simply by initializing them in the <code>window<\/code> object:<\/p>\n<div class=\"highlight\">\n<pre style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-javascript\" data-lang=\"javascript\"><span style=\"color:#0aa\">window<\/span>.myGlobalVariable = <span style=\"color:#a50\">\"Hello, I am a global variable.\"<\/span>;\n<\/code><\/pre>\n<\/div>\n<h4 id=\"add-an-event-listener-with-a-breakpoint\">Add an event listener with a breakpoint<\/h4>\n<p>This is a cool trick. Whenever any JavaScript that runs on the page uses the <code>debugger;<\/code> keyword, the page will pause and you will be diverted to the <strong>Sources<\/strong> tab where you can then walk through the stack (more on this below).<\/p>\n<p>If you want to try this out, you can add a click listener on the page with <code>debugger;<\/code> in the callback. Then, when you click anywhere on the page, the execution will pause and you\u2019ll be taken to the Sources tab.<\/p>\n<div class=\"highlight\">\n<pre style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-javascript\" data-lang=\"javascript\"><span style=\"color:#0aa\">window<\/span>.addEventListener(<span style=\"color:#a50\">'click'<\/span>, () =&gt; { <span style=\"color:#00a\">debugger<\/span>; })\n<\/code><\/pre>\n<\/div>\n<h4 id=\"change-the-context-to-an-iframe\">Change the context to an iframe<\/h4>\n<p>The JavaScript console is initially bound to the context of the top frame (the URL the user is currently navigating).<\/p>\n<p>If the page embeds other content in iframes, you can use the frame selector in the console to change context to the iframe.<\/p>\n<div style=\"aspect-ratio: 930 \/ 460;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/iframe-selector-chrome.jpg\" title=\"Iframe selector chrome\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"460\" width=\"930\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/iframe-selector-chrome.jpg#ZgotmplZ\" alt=\"Iframe selector chrome\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>This is, of course, particularly useful when debugging embedded content such as third-party shopping carts or widgets.<\/p>\n<blockquote>\n<p>Note that the frame selector is confusingly in different parts of the developer tools across different browsers. The screenshot above is from <strong>Chrome<\/strong> (and it\u2019s the same on <strong>Edge<\/strong>). With <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Tools\/Working_with_iframes\">Firefox<\/a> the context picker is in the top-right corner of the developer tools, and with Safari it\u2019s in the bottom-right corner of the developer console.<\/p>\n<\/blockquote>\n<h3 id=\"sources\">Sources<\/h3>\n<p>The <strong>sources<\/strong> panel can be game-changing but it can also be very overwhelming to use.<\/p>\n<p>The panel lists <strong>all of the subresources<\/strong> (images, scripts, frames, etc.) loaded on the current page.<\/p>\n<p>The list is sorted by URL, starting with the <em>origin<\/em> and then drilling own to paths and files.<\/p>\n<div style=\"aspect-ratio: 1008 \/ 814;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/sources.jpg\" title=\"Sources\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"814\" width=\"1008\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/sources.jpg#ZgotmplZ\" alt=\"Sources\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>The sources panel would deserve a separate article in itself due to the many, many different things you can do with it. However, here I\u2019ve listed some of the most useful things you can tamper with.<\/p>\n<h4 id=\"open-a-file-pretty-print-it-and-search-through-it\">Open a file, pretty-print it, and search through it<\/h4>\n<p>When you open a <strong>minified<\/strong> JavaScript file (as they tend to be in order to save space and bandwidth), the panel prompts you if you want to <em>pretty-print<\/em> the file.<\/p>\n<p><strong>Always do this<\/strong>.<\/p>\n<p>By pretty-printing the file, the code is displayed in a more readable format, even if the code itself is still minified.<\/p>\n<div style=\"aspect-ratio: 1172 \/ 798;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/pretty-print.jpg\" title=\"Pretty-print\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"798\" width=\"1172\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/pretty-print.jpg#ZgotmplZ\" alt=\"Pretty-print\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>You can then hit CMD + F (or CTRL + F) to open the search bar. The search will look through the formatted file for all references to the searched string.<\/p>\n<h4 id=\"add-a-breakpoint-to-the-file\">Add a breakpoint to the file<\/h4>\n<p>A <strong>breakpoint<\/strong> is an instruction for the brower to halt page execution and allow the user to see the exact state of the page at the time of the breakpoint.<\/p>\n<p>To add a breakpoint, open a file in the Sources panel, right-click the row number you want to halt execution on and choose <strong>Add breakpoint<\/strong>.<\/p>\n<div style=\"aspect-ratio: 1176 \/ 662;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/add-breakpoint.jpg\" title=\"Add breakpoint\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"662\" width=\"1176\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/add-breakpoint.jpg#ZgotmplZ\" alt=\"Add breakpoint\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>When you then reload the page (or cause the code to be evaluated some other way), the browser will stop at the breakpoint and give you bunch of options how to proceed.<\/p>\n<div style=\"aspect-ratio: 2054 \/ 960;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/paused-on-breakpoint.jpg\" title=\"Paused on breakpoint\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"960\" width=\"2054\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/paused-on-breakpoint.jpg#ZgotmplZ\" alt=\"Paused on breakpoint\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Some useful tools here include:<\/p>\n<ul>\n<li>\n<p>Look through the <strong>Scope<\/strong> list. Here are listed all the variables in <strong>Local<\/strong> (current function context) scope, <strong>Closure<\/strong> (scope of the function that initiated the closure code), and <strong>Global<\/strong> scope.<\/p>\n<\/li>\n<li>\n<p>Walk back through the <strong>Call Stack<\/strong> menu, as this will let you inspect the full execution thread all the way to where it was initialized. This is a great way to find just where the JavaScript started breaking down.<\/p>\n<\/li>\n<li>\n<p>Use the <strong>step methods<\/strong> (see screenshot below) to continue progressing through the code, pausing after every line.<\/p>\n<\/li>\n<\/ul>\n<div style=\"aspect-ratio: 1094 \/ 490;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/step-tools.jpg\" title=\"Step tools\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"490\" width=\"1094\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/step-tools.jpg#ZgotmplZ\" alt=\"Step tools\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>To remove the breakpoint (good idea once you\u2019re done debugging), expand the <strong>Breakpoints<\/strong> list and uncheck the breakpoints you want to deactivate.<\/p>\n<h4 id=\"search-through-the-sources\">Search through the sources<\/h4>\n<p>Sometimes it can be useful to simply do a string search through the sources. For example, if you find GTM\u2019s <code>dataLayer<\/code> is overwritten, you could even search for something as simple as <code>dataLayer=<\/code> in order to find if it\u2019s been overwritten by custom code in some other file.<\/p>\n<p>You can find the search tool by opening the <strong>Drawer<\/strong> (press ESC) and selecting the <strong>Search<\/strong> tab. Here, you can do a string search and developer tools will search through all the source files for a match.<\/p>\n<div style=\"aspect-ratio: 990 \/ 496;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/search-sources.jpg\" title=\"Search sources\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"496\" width=\"990\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/search-sources.jpg#ZgotmplZ\" alt=\"Search sources\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>If you do find a match, you can click it to jump to the relevant part of the source file.<\/p>\n<h4 id=\"add-local-overrides\">Add local overrides<\/h4>\n<p>This can be <strong>extremely helpful<\/strong> in testing your page. You can actually edit \/ add \/ remove things in the page HTML or the linked JavaScript resources by adding <strong>local overrides<\/strong>.<\/p>\n<div style=\"aspect-ratio: 1896 \/ 620;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/local-overrides.jpg\" title=\"Local overrides\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"620\" width=\"1896\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/local-overrides.jpg#ZgotmplZ\" alt=\"Local overrides\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>When you give the browser permission to write local overrides, you can then freely edit any of the files in the Sources panel, save them, and when you reload the page the saved and modified file will be used instead of the one loaded over the network.<\/p>\n<p>In Chrome, you\u2019ll see a little purple button next to the file if it has a local override.<\/p>\n<div style=\"aspect-ratio: 1116 \/ 768;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/local-override.jpg\" title=\"Local overrides\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"768\" width=\"1116\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/local-override.jpg#ZgotmplZ\" alt=\"Local overrides\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>To stop using overrides, just open the Overrides tab in the Sources panel and uncheck \u201cEnable Local Overrides\u201d.<\/p>\n<h3 id=\"application-storage\">Application storage<\/h3>\n<p>The <strong>application storage<\/strong> tab shows all the <em>browser<\/em> storage used on the current page (and in embedded frames).<\/p>\n<p>This includes things like <strong>cookies<\/strong>, <strong>localStorage<\/strong>, and <strong>sessionStorage<\/strong>.<\/p>\n<div style=\"aspect-ratio: 1418 \/ 630;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/browser-cookies.jpg\" title=\"Browser cookies\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"630\" width=\"1418\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/browser-cookies.jpg#ZgotmplZ\" alt=\"Browser cookies\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>You can use this tab to create, edit, and delete items in browser storage.<\/p>\n<p>It\u2019s a great resource to identify problems with <strong>persistence<\/strong> in your analytics tools, for example.<\/p>\n<p>Here are some of the things you can do with application storage.<\/p>\n<h4 id=\"inspect-first-party-and-third-party-storage\">Inspect first-party and third-party storage<\/h4>\n<p>It\u2019s a bit confusing, but you can see multiple domains in both the navigation column as well as in the actual storage list.<\/p>\n<div style=\"aspect-ratio: 1368 \/ 642;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/domains-storage.jpg\" title=\"Domains storage\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"642\" width=\"1368\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/domains-storage.jpg#ZgotmplZ\" alt=\"Domains storage\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>First, all the domains listed in the navigation column (<code>simoahava.com<\/code> and <code>gtmtools.com<\/code> in the screenshot above), represent URL origins loaded in <strong>frames<\/strong>. For example, in this case <code>simoahava.com<\/code> was the URL of the top frame, and the page I was on loaded an iframe from <code>gtmtools.com<\/code>. In the Application tab I can choose <code>gtmtools.com<\/code> to inspect the cookies of that particular context.<\/p>\n<p>In the list of cookies, on the other hand, if you see multiple different domains listed it\u2019s because the page is sending requests to these domains. If the browser supports <strong>third-party cookies<\/strong>, you\u2019ll see all the cookies set on the domains the browser is communicating with.<\/p>\n<p>If the browser blocks third-party cookies, you\u2019ll only see cookies set on the site of the top frame (the URL the user is browsing).<\/p>\n<h4 id=\"create-edit-and-delete-storage\">Create, edit, and delete storage<\/h4>\n<p>By clicking any storage entry and pressing backspace \/ delete, you can remove that particular item from the browser storage.<\/p>\n<p>You can edit any storage values by double-clicking the value you want to edit in the relevant column.<\/p>\n<div style=\"aspect-ratio: 1198 \/ 556;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/edit-cookie-value.jpg\" title=\"Edit cookie value\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"556\" width=\"1198\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/edit-cookie-value.jpg#ZgotmplZ\" alt=\"Edit cookie value\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>You can create a new cookie (or other storage entry) by double-clicking the empty row at the bottom of the storage list. You can then input any values you want into the columns.<\/p>\n<h2 id=\"debug-web-analytics-implementations\">Debug web analytics implementations<\/h2>\n<p>Once you have a <em>feel<\/em> for the developer tools, you can start debugging actual issues with your implementations.<\/p>\n<p>Please note that since the scope of things you can do with JavaScript is so <strong>immensely vast<\/strong>, it\u2019s impossible to exhaustively list all the things that you should do when debugging your setup.<\/p>\n<p>In this chapter, I\u2019ve listed some of the more common ways to approach implementation issues.<\/p>\n<blockquote>\n<p>If you have other, common use cases you think should be listed here, please let me know in the <strong>comments<\/strong>!<\/p>\n<\/blockquote>\n<h3 id=\"check-browser-cookies\">Check browser cookies<\/h3>\n<p>Many analytics tools utilize <strong>browser storage<\/strong> to persist things like user and client identifiers.<\/p>\n<p>Google Analytics 4 uses the <code>_ga<\/code> and <code>_ga_<measurementid\/><\/code> cookies to store information about the user and the session, respectively.<\/p>\n<p>If you see too many (or too few) users in your GA4 data compared to the count of sessions, for example, it might be that there\u2019s something wrong with the browser cookies. So open the <strong>Application<\/strong> tab and look for <code>_ga<\/code>.<\/p>\n<p>If you don\u2019t find any cookies with that name or prefix, it\u2019s possible that there\u2019s something wrong with your implementation and the cookie is either not being set or it\u2019s being set incorrectly.<\/p>\n<div style=\"aspect-ratio: 1802 \/ 196;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/ga-cookies.jpg\" title=\"GA cookies\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"196\" width=\"1802\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/ga-cookies.jpg#ZgotmplZ\" alt=\"GA cookies\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>A typical mistake is overwriting the <code>cookie_domain<\/code> field with something incorrect. The tracker tries to set the cookie on an invalid domain and the cookie write fails.<\/p>\n<p>It might be useful to have the <a href=\"https:\/\/chrome.google.com\/webstore\/detail\/google-analytics-debugger\/jnkmfdileelhofjcijamephohjechhna\">GA Debugger<\/a> extension enabled, as the JavaScript console will inform you if the cookie write failed for some reason.<\/p>\n<div style=\"aspect-ratio: 1440 \/ 502;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/cookie-write-failed.jpg\" title=\"Cookie write failed\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"502\" width=\"1440\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/cookie-write-failed.jpg#ZgotmplZ\" alt=\"Cookie write failed\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Another very common reason for cookies failing is because the page is actually running in a <strong>cross-site<\/strong> embedded iframe, and due to third-party cookie restrictions the page is unable to set the cookies correctly.<\/p>\n<h3 id=\"filter-network-requests\">Filter network requests<\/h3>\n<p>You\u2019ll also want to look through the network requests to see if your endpoint is actually receiving the data.<\/p>\n<p>Google Analytics requests are sent to the <code>\/collect<\/code> path, with the domain <code>www.google-analytics.com<\/code> or <code>analytics.google.com<\/code> (latter if Google Signals is enabled).<\/p>\n<div style=\"aspect-ratio: 2358 \/ 1088;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/collect-request.jpg\" title=\"Collect request\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1088\" width=\"2358\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/collect-request.jpg#ZgotmplZ\" alt=\"Collect request\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>If you see a request to <code>\/collect<\/code> with a status code of <code>200<\/code>, it means that your request was most likely collected by the endpoint successfully.<\/p>\n<p>If you see an aborted request (or some other error), it\u2019s typically because the request happened just as the user was navigating away from the page (although this is less common with Google Analytics 4).<\/p>\n<p>If you don\u2019t see the request at all, it means that something is preventing the request from being dispatched. Again, using the GA Debugger extension is a good idea, because the extension logs information into the console that might be of use.<\/p>\n<h3 id=\"identify-conflicts-in-global-methods\">Identify conflicts in global methods<\/h3>\n<p>Sometimes, rarely, the global methods used by your web analytics tool have been overwritten by some other tool.<\/p>\n<p>This is a constant danger when using global methods, and Google Analytics using the <code>ga<\/code> namespace for Universal Analytics is an example of a global name that can easily be taken by some other, unrelated tool.<\/p>\n<p>Sometimes it\u2019s difficult to find issues with the global namespace, because using tools like Google Tag Manager might make global methods irrelevant.<\/p>\n<div style=\"aspect-ratio: 1202 \/ 294;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/overwritten-ga-method.jpg\" title=\"Overwritten GA method\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"294\" width=\"1202\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/overwritten-ga-method.jpg#ZgotmplZ\" alt=\"Overwritten GA method\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>But if you\u2019re having trouble with your requests working, you can always check if the global methods that your tool uses (e.g. <code>ga<\/code>, <code>gtag<\/code>, <code>dataLayer<\/code>) are either <code>undefined<\/code> or set to something that doesn\u2019t resemble your analytics platform code at all.<\/p>\n<h3 id=\"note-about-iframes\">Note about iframes<\/h3>\n<p>If you embed content in a <strong>cross-site<\/strong> (or third-party) iframe, remember that anything that happens in the iframe happens in third-party context.<\/p>\n<p>This means that if you\u2019re running Google Analytics in the iframe, it will not work because by default the GA cookies are <a href=\"https:\/\/www.simoahava.com\/analytics\/cookieflags-field-google-analytics\/\">not treated in a way that would make them work<\/a> in third-party context.<\/p>\n<p>You\u2019ll see the <strong>Cookie write failed<\/strong> error message in the console when using the GA debugger, if this is the case.<\/p>\n<p>Furthermore, even if you update the cookies to use the required <code>samesite=none<\/code> and <code>secure<\/code> flags, browsers like <strong>Safari<\/strong> and <strong>Brave<\/strong> outright block third-party storage.<\/p>\n<h2 id=\"debug-tag-management-solutions\">Debug tag management solutions<\/h2>\n<p>Since tag management solutions are more like a framework for deploying analytics and advertising pixels, if they fail then everything that\u2019s loaded through them fails too.<\/p>\n<p>In this chapter, we\u2019ll take a look at some of the ways you can debug a TMS implementation gone awry.<\/p>\n<h3 id=\"check-data-layer-queue-for-conflicts\">Check Data Layer queue for conflicts<\/h3>\n<p>First, if you\u2019re seeing issues with your setup, check if the global <code>dataLayer<\/code> queue has been overwritten or is otherwise compromised.<\/p>\n<p>With Google Tag Manager, type <code>dataLayer.push<\/code> into the console and check what it returns. If it outputs something like <code>[native code]<\/code>, it means that <code>dataLayer<\/code> has been reset to its initial state, and Google Tag Manager\u2019s listeners no longer work with it.<\/p>\n<div style=\"aspect-ratio: 1038 \/ 242;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/datalayer-overwritten.jpg\" title=\"datalayer-overwritten.jpg\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"242\" width=\"1038\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/datalayer-overwritten.jpg#ZgotmplZ\" alt=\"datalayer-overwritten.jpg\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Alternatively, if you see something other than a variation of the below, it means that <code>dataLayer<\/code> has possible been overwritten in a way that doesn\u2019t correctly work with GTM. This is a difficult scenario to debug, and requires that you add a <strong>breakpoint<\/strong> to the dataLayer processing in order to see if some other tool is cannibalizing the array and not passing the arguments to GTM.<\/p>\n<div style=\"aspect-ratio: 1958 \/ 274;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/datalayer-correct.jpg\" title=\"dataLayer setup correctly\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"274\" width=\"1958\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/datalayer-correct.jpg#ZgotmplZ\" alt=\"dataLayer setup correctly\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>You can mock this with something like:<\/p>\n<div class=\"highlight\">\n<pre style=\"background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4\"><code class=\"language-javascript\" data-lang=\"javascript\"><span style=\"color:#0aa\">window<\/span>.dataLayer.push(<span style=\"color:#00a\">function<\/span>() { <span style=\"color:#00a\">debugger<\/span>; });\n<\/code><\/pre>\n<\/div>\n<p>Then step through the stack and see if the <code>gtm.js<\/code> library is ever visited when stepping through the methods. If GTM is never referenced, it means that some other tool has taken control of <code>dataLayer<\/code> and you need to resolve this conflict elsewhere.<\/p>\n<blockquote>\n<p>This is a notoriously difficult scenario to debug, so you just need to patiently look through the Sources to find the culprit. <a href=\"#search-through-the-sources\">Search for references<\/a> to <code>dataLayer<\/code>, for example. <a href=\"#block-a-request-from-future-loads\">Block JavaScript files<\/a> one by one in the network debugger to find the one that is causing the conflict.<\/p>\n<\/blockquote>\n<h3 id=\"search-through-the-element-inspector\">Search through the element inspector<\/h3>\n<p>Sometimes it might be useful to search through the element inspector to find the Custom HTML tags and script elements injected by Google Tag Manager.<\/p>\n<p>You can simply search for a string that you know to be within the injected code, but just remember that <strong>Google Tag Manager minifies all injected code automatically<\/strong>, so searching for a specific variable name might not be very useful. Search for content within strings or script URLs instead.<\/p>\n<p>If you don\u2019t see any references to the elements you\u2019d expect GTM to inject, it means that GTM did not add those elements to the page. Typically this is because the tag never fired or the tag was misconfigured. Sometimes it can be because of a <a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/web\/csp\">CSP conflict<\/a> that you need to resolve.<\/p>\n<h3 id=\"look-for-requests-in-network-tools\">Look for requests in network tools<\/h3>\n<p>With GTM, too, it\u2019s always useful to look for requests in the network tools. This is always the <strong>ultimate truth<\/strong> when it comes to debugging the end-to-end flow of pixel requests.<\/p>\n<p>If Tag Assistant says that the tag fired but you can\u2019t see anything in your analytics platform, then you need to open the network debugger and see if the request was ever sent.<\/p>\n<p>Remember to check <strong>Preserve log<\/strong> to make sure that the requests aren\u2019t gobbled up by page navigation.<\/p>\n<p>If you don\u2019t see the requests anywhere, it means that the tags never managed to dispatch them.<\/p>\n<p>Note that this is only the <strong>first step<\/strong> of potentially a <em>very<\/em> complex debugging flow, because there can be a million different reasons for a failed request.<\/p>\n<p>Sometimes you <em>do<\/em> see the request but you still don\u2019t see data in your analytics tool. In this case, meticulously sift through the headers and the payload of the request to see if it has all the information you expect it to contain.<\/p>\n<h3 id=\"search-through-sources\">Search through sources<\/h3>\n<p>Finally, searching through sources can be <strong>very<\/strong> useful in identifying issues with your tag management system.<\/p>\n<p>With GTM, it\u2019s often the case that the version wasn\u2019t actually published to the live <a href=\"https:\/\/www.simoahava.com\/analytics\/better-qa-with-google-tag-manager-environments\/\">environment<\/a> but rather to a staging context.<\/p>\n<p>It might be useful to take a tag that you expect the most recent version to have, and then search for something in that tag\u2019s code (an ID, a parameter, a key-value pair) within the <code>gtm.js<\/code> library.<\/p>\n<div style=\"aspect-ratio: 2244 \/ 564;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/search-gtm-js.jpg\" title=\"Search through gtm.js\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"564\" width=\"2244\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/search-gtm-js.jpg#ZgotmplZ\" alt=\"Search through gtm.js\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Sometimes searching through the sources is an exercise in futility, especially because the code is so minified that you can\u2019t make any heads or tails of it. Trying to narrow down with more specific search terms often helps.<\/p>\n<h2 id=\"useful-browser-extensions\">Useful browser extensions<\/h2>\n<p>I\u2019ve already mentioned GA Debugger above, but there are other useful extensions you might consider installing in your browser (Chrome, most often) which make debugging your analytics setup a breeze.<\/p>\n<p>Many of these extensions take the existing capabilities of browser developer tools and hone them to suit a specific set of use cases in the analytics world.<\/p>\n<p>I still recommend to always use developer tools as your main tool of choice, but do take a look at these extensions and see if they could help alleviate some of the pain of debugging your analytics or tag manager implementation.<\/p>\n<h3 id=\"gtmga-debugger\">GTM\/GA Debugger<\/h3>\n<p><a href=\"https:\/\/twitter.com\/thyng\">David Vallejo\u2019s<\/a> Chrome extension, <a href=\"https:\/\/chrome.google.com\/webstore\/detail\/gtmga-debugger\/ilnpmccnfdjdjjikgkefkcegefikecdc\">GTM\/GA Debugger<\/a>, is certainly the most ambitious and the most impressive browser extension for debugging Google Analytics and Google Tag Manager implementations.<\/p>\n<div style=\"aspect-ratio: 2066 \/ 1068;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/gtm-ga-debug.jpg\" title=\"GTM\/GA Debugger\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1068\" width=\"2066\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/gtm-ga-debug.jpg#ZgotmplZ\" alt=\"GTM\/GA Debugger\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>The feature set is so incredibly rich that it doesn\u2019t make sense to go through all the functionality here, but here\u2019s just a short overview of things you can do with the extension:<\/p>\n<ul>\n<li>Block GA3\/GA4 hits<\/li>\n<li>Inspect server-side tagging hits<\/li>\n<li>Export as a table, copy objects<\/li>\n<li>Enhanced ecommerce reports<\/li>\n<li>Analyze dataLayer and the outgoing requests<\/li>\n<li>Show POST data in a meaningful way<\/li>\n<li>View <em>all<\/em> <code>dataLayer<\/code> messages (not just the ones sent on the current page)<\/li>\n<\/ul>\n<p>Everything is just displayed so nicely and so intuitively. You don\u2019t have to sift through complicated headers and messy payloads \u2013 it\u2019s all visually displayed in rich tables and with purposeful structure.<\/p>\n<h3 id=\"ga-debugger\">GA Debugger<\/h3>\n<p><a href=\"https:\/\/chrome.google.com\/webstore\/detail\/google-analytics-debugger\/jnkmfdileelhofjcijamephohjechhna\">GA Debugger<\/a> is the <strong>official<\/strong> Universal Analytics, Google Analytics 4, and Google Tag Manager debugger.<\/p>\n<p>It outputs information about the aforementioned platforms into the console.<\/p>\n<div style=\"aspect-ratio: 1780 \/ 422;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/console-log-debugger.jpg\" title=\"GA debugger and console log\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"422\" width=\"1780\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/console-log-debugger.jpg#ZgotmplZ\" alt=\"GA debugger and console log\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>I love this tool because once the information is in the console, searching through it is easy with the JavaScript console\u2019s own search tools.<\/p>\n<p>The GA Debugger helpfully informs you <strong>why<\/strong> something went wrong rather than just showing a non-descript error message. Naturally, in some cases you still need to continue investigating, but the console output can be very helpful in collecting the initial set of leads for your research.<\/p>\n<blockquote>\n<p>Note! This extension doesn\u2019t work if you load your files from or collect hits to <a href=\"https:\/\/www.simoahava.com\/analytics\/server-side-tagging-google-tag-manager\/\">a server-side endpoint<\/a>.<\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/chrome.google.com\/webstore\/detail\/live-http-headers\/ianhploojoffmpcpilhgpacbeaifanid\">Live HTTP Headers<\/a> is my favorite extension for debugging HTTP traffic. It\u2019s an easy way to inspect the headers of all the HTTP requests dispatched by the browser.<\/p>\n<div style=\"aspect-ratio: 2182 \/ 678;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2022\/01\/live-http-headers.jpg\" title=\"Live HTTP headers\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"678\" width=\"2182\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2022\/01\/live-http-headers.jpg#ZgotmplZ\" alt=\"Live HTTP headers\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Although today you can get pretty much all the same information in the network debugger of the developer tools, I still prefer the visual output of this extension and use it diligently whenever I want to quickly look through redirects or HTTP headers.<\/p>\n<h2 id=\"summary\">Summary<\/h2>\n<p>Even though this article is long and full of words and pictures, it covers only a fraction of the approaches you can take when debugging your analytics and tag management implementations.<\/p>\n<p>The idea wasn\u2019t to list everything that can go wrong and give you the solution how to fix it. Instead, the purpose of this guide is to give you the tools and the <em>confidence<\/em> to start collecting leads for your own investigations.<\/p>\n<p>Debugging the complexity of what happens within a web browser is a daunting task. But the debugging steps themselves are often very predictable and can be repeated from one scenario to the next.<\/p>\n<p>My workflow is pretty simple:<\/p>\n<ol>\n<li>Always start with inspecting the <strong>network requests<\/strong>. Try to find the requests that you\u2019re debugging. If you find them, look through the headers and the payload to see if they contain the data you expect them to have.<\/li>\n<li>Search through the <strong>sources<\/strong> to find inconsistencies in the libraries you use (particularly Google Tag Manager). If you can\u2019t find references to a specific tag you expect to be in GTM, it means that you might be previewing the wrong version or that you never actually published a version.<\/li>\n<li>Look through <strong>cookies<\/strong> to see if the values used by your analytics tool persist from one page load to the next. If the values change, then it means that the cookies are being reset or overwritten for some reason (typically a <strong>consent management platform<\/strong> is to blame).<\/li>\n<li>Utilize the <strong>element inspector<\/strong> especially when you are certain that the page should include some element or tag deployed through Google Tag Manager.<\/li>\n<\/ol>\n<p>If you have additional ideas for the debugging flow that you think should be included in this guide, please let me know in the comments.<\/p>\n<p>What are your favorite ways of debugging analytics and tag management solution issues?<\/p>\n<\/p><\/div>\n<p><script async src=\"\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><br \/>\n<br \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>One of the key skills for anyone working with web analytics and tag management is understanding how to identify where things went wrong, why they went wrong, and ideally how to fix them. There are plenty of excellent browser extensions for helping you debug, and we\u2019ll discuss these in the guide, too. But most of [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":64321,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12033],"tags":[12765,34955,2059,5984,1791,5393],"dealstore":[],"offerexpiration":[],"class_list":["post-64320","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","tag-analytics","tag-debug","tag-guide","tag-management","tag-tag","tag-web"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Debug Guide For Web Analytics And Tag Management - Som2ny Network<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fivemor.com\/?p=64320\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Debug Guide For Web Analytics And Tag Management - Som2ny Network\" \/>\n<meta property=\"og:description\" content=\"One of the key skills for anyone working with web analytics and tag management is understanding how to identify where things went wrong, why they went wrong, and ideally how to fix them. There are plenty of excellent browser extensions for helping you debug, and we\u2019ll discuss these in the guide, too. But most of [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fivemor.com\/?p=64320\" \/>\n<meta property=\"og:site_name\" content=\"Som2ny Network\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-02T12:39:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/debug-guide-web-analytics-tag-management-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1441\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"27 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fivemor.com\/?p=64320#article\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/?p=64320\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\"},\"headline\":\"Debug Guide For Web Analytics And Tag Management\",\"datePublished\":\"2025-02-02T12:39:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=64320\"},\"wordCount\":5272,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=64320#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/debug-guide-web-analytics-tag-management-scaled.jpg\",\"keywords\":[\"Analytics\",\"Debug\",\"Guide\",\"management\",\"TAG\",\"Web\"],\"articleSection\":[\"Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fivemor.com\/?p=64320#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fivemor.com\/?p=64320\",\"url\":\"https:\/\/fivemor.com\/?p=64320\",\"name\":\"Debug Guide For Web Analytics And Tag Management - Som2ny Network\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=64320#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=64320#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/debug-guide-web-analytics-tag-management-scaled.jpg\",\"datePublished\":\"2025-02-02T12:39:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fivemor.com\/?p=64320#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fivemor.com\/?p=64320\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/?p=64320#primaryimage\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/debug-guide-web-analytics-tag-management-scaled.jpg\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/debug-guide-web-analytics-tag-management-scaled.jpg\",\"width\":2560,\"height\":1441},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fivemor.com\/?p=64320#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fivemor.com\/?bp_activities=1\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Debug Guide For Web Analytics And Tag Management\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fivemor.com\/#website\",\"url\":\"https:\/\/fivemor.com\/\",\"name\":\"Som2ny Network\",\"description\":\"Daily Deals\",\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fivemor.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/fivemor.com\/#organization\",\"name\":\"Som2ny Network\",\"url\":\"https:\/\/fivemor.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png\",\"width\":300,\"height\":86,\"caption\":\"Som2ny Network\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png\",\"caption\":\"admin\"},\"sameAs\":[\"https:\/\/fivemor.com\"],\"url\":\"https:\/\/fivemor.com\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Debug Guide For Web Analytics And Tag Management - Som2ny Network","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fivemor.com\/?p=64320","og_locale":"en_US","og_type":"article","og_title":"Debug Guide For Web Analytics And Tag Management - Som2ny Network","og_description":"One of the key skills for anyone working with web analytics and tag management is understanding how to identify where things went wrong, why they went wrong, and ideally how to fix them. There are plenty of excellent browser extensions for helping you debug, and we\u2019ll discuss these in the guide, too. But most of [&hellip;]","og_url":"https:\/\/fivemor.com\/?p=64320","og_site_name":"Som2ny Network","article_published_time":"2025-02-02T12:39:36+00:00","og_image":[{"width":2560,"height":1441,"url":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/debug-guide-web-analytics-tag-management-scaled.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin","Est. reading time":"27 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fivemor.com\/?p=64320#article","isPartOf":{"@id":"https:\/\/fivemor.com\/?p=64320"},"author":{"name":"admin","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371"},"headline":"Debug Guide For Web Analytics And Tag Management","datePublished":"2025-02-02T12:39:36+00:00","mainEntityOfPage":{"@id":"https:\/\/fivemor.com\/?p=64320"},"wordCount":5272,"commentCount":0,"publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"image":{"@id":"https:\/\/fivemor.com\/?p=64320#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/debug-guide-web-analytics-tag-management-scaled.jpg","keywords":["Analytics","Debug","Guide","management","TAG","Web"],"articleSection":["Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fivemor.com\/?p=64320#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fivemor.com\/?p=64320","url":"https:\/\/fivemor.com\/?p=64320","name":"Debug Guide For Web Analytics And Tag Management - Som2ny Network","isPartOf":{"@id":"https:\/\/fivemor.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fivemor.com\/?p=64320#primaryimage"},"image":{"@id":"https:\/\/fivemor.com\/?p=64320#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/debug-guide-web-analytics-tag-management-scaled.jpg","datePublished":"2025-02-02T12:39:36+00:00","breadcrumb":{"@id":"https:\/\/fivemor.com\/?p=64320#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fivemor.com\/?p=64320"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/?p=64320#primaryimage","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/debug-guide-web-analytics-tag-management-scaled.jpg","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/debug-guide-web-analytics-tag-management-scaled.jpg","width":2560,"height":1441},{"@type":"BreadcrumbList","@id":"https:\/\/fivemor.com\/?p=64320#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fivemor.com\/?bp_activities=1"},{"@type":"ListItem","position":2,"name":"Debug Guide For Web Analytics And Tag Management"}]},{"@type":"WebSite","@id":"https:\/\/fivemor.com\/#website","url":"https:\/\/fivemor.com\/","name":"Som2ny Network","description":"Daily Deals","publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fivemor.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/fivemor.com\/#organization","name":"Som2ny Network","url":"https:\/\/fivemor.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/#\/schema\/logo\/image\/","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png","width":300,"height":86,"caption":"Som2ny Network"},"image":{"@id":"https:\/\/fivemor.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png","caption":"admin"},"sameAs":["https:\/\/fivemor.com"],"url":"https:\/\/fivemor.com\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/64320","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=64320"}],"version-history":[{"count":0,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/64320\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/media\/64321"}],"wp:attachment":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=64320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=64320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=64320"},{"taxonomy":"dealstore","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fdealstore&post=64320"},{"taxonomy":"offerexpiration","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fofferexpiration&post=64320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}