<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Montherion Labs</title>
    <description>The latest articles on DEV Community by Montherion Labs (@montherion_labs).</description>
    <link>https://dev.to/montherion_labs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4143724%2Fb7b82920-f035-4d2f-914a-acb73ab1f3b7.png</url>
      <title>DEV Community: Montherion Labs</title>
      <link>https://dev.to/montherion_labs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/montherion_labs"/>
    <language>en</language>
    <item>
      <title>How to check Consent Mode v2 in the browser</title>
      <dc:creator>Montherion Labs</dc:creator>
      <pubDate>Sun, 11 Oct 2026 16:09:25 +0000</pubDate>
      <link>https://dev.to/montherion_labs/how-to-check-consent-mode-v2-in-the-browser-1860</link>
      <guid>https://dev.to/montherion_labs/how-to-check-consent-mode-v2-in-the-browser-1860</guid>
      <description>&lt;p&gt;Consent Mode lets Google’s tags adjust what they do to the visitor’s consent choices. Version 2 added two signals, &lt;code&gt;ad_user_data&lt;/code&gt; and &lt;code&gt;ad_personalization&lt;/code&gt;, to the original &lt;code&gt;ad_storage&lt;/code&gt; and &lt;code&gt;analytics_storage&lt;/code&gt;, and Google asks for them to use its advertising features with visitors in the European Economic Area. A banner that looks right can still send the wrong state. You can check it in Chrome DevTools.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four signals
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ad_storage&lt;/code&gt;: storage, such as cookies, related to advertising.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;analytics_storage&lt;/code&gt;: storage related to analytics, such as visit duration.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ad_user_data&lt;/code&gt;: consent to send user data to Google for advertising.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ad_personalization&lt;/code&gt;: consent to personalized advertising.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. A default before the measurement tags
&lt;/h2&gt;

&lt;p&gt;The initial state must be set before Google’s measurement tags send anything. How to check it depends on the implementation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;With gtag.js:&lt;/strong&gt; open the DevTools &lt;strong&gt;Console&lt;/strong&gt;, type &lt;code&gt;dataLayer&lt;/code&gt; (or the name of the data layer your site configures) and expand it. The &lt;code&gt;consent&lt;/code&gt; &lt;code&gt;default&lt;/code&gt; command should appear before the &lt;code&gt;config&lt;/code&gt; command and before any event.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With a consent template in Google Tag Manager:&lt;/strong&gt; the template can set the state without adding those commands to the &lt;code&gt;dataLayer&lt;/code&gt;. Check the effective state in Tag Assistant instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. The state after the banner
&lt;/h2&gt;

&lt;p&gt;Accept or reject in your banner and check that the effective state matches the choice. With gtag.js, look for the &lt;code&gt;consent&lt;/code&gt; &lt;code&gt;update&lt;/code&gt; commands in the configured data layer; with Tag Manager templates, check it in Tag Assistant. Rejecting can keep a state that was already &lt;code&gt;denied&lt;/code&gt;, and in basic mode the tags can stay blocked without loading. Before repeating with the other choice, close every private window or clear the site’s data, so the first choice isn’t remembered.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What GA4 requests carry
&lt;/h2&gt;

&lt;p&gt;In the &lt;strong&gt;Network&lt;/strong&gt; tab, filter by &lt;code&gt;collect&lt;/code&gt;. When they are present, check two parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gcs&lt;/code&gt;: &lt;code&gt;G1&lt;/code&gt; followed by one digit for &lt;code&gt;ad_storage&lt;/code&gt; and one for &lt;code&gt;analytics_storage&lt;/code&gt; (1 granted, 0 denied). &lt;code&gt;G100&lt;/code&gt; means both denied; &lt;code&gt;G101&lt;/code&gt;, advertising denied and analytics granted; &lt;code&gt;G110&lt;/code&gt;, the opposite; &lt;code&gt;G111&lt;/code&gt;, both granted.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gcd&lt;/code&gt;: a longer code that also covers &lt;code&gt;ad_user_data&lt;/code&gt; and &lt;code&gt;ad_personalization&lt;/code&gt;, and whether each value came from a default or an update. Its presence alone doesn’t prove the four signals are configured.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In advanced Consent Mode, GA4 can send cookieless pings while &lt;code&gt;analytics_storage&lt;/code&gt; is denied; denying only the advertising signals doesn’t imply the same behavior. In basic mode, the tags stay blocked until the corresponding consent is granted; rejecting it doesn’t enable them.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Tags that don’t follow Consent Mode
&lt;/h2&gt;

&lt;p&gt;Consent Mode controls Google’s tags. The Meta Pixel and other tags only respect the visitor’s choice if your consent tool or tag manager blocks or configures them. After rejecting advertising consent, filter the Network tab by &lt;code&gt;facebook.com/tr&lt;/code&gt; and check whether new requests appear that your setup should have blocked.&lt;/p&gt;

&lt;p&gt;This guide is about checking the technical setup. It is not legal advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scope
&lt;/h2&gt;

&lt;p&gt;These checks examine outgoing requests visible in the browser. They do not establish what Google Analytics or Meta received, processed or counted, and they do not inspect server-to-server traffic or determine legal compliance.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Google Analytics and Google Tag Manager are trademarks of Google LLC. Meta is a trademark of Meta Platforms, Inc. Tracklint is not affiliated with, endorsed or sponsored by Google or Meta.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance (#ABotWroteThis). It was first published on the Tracklint website: &lt;a href="https://tracklint.netlify.app/guides/check-consent-mode-v2.html" rel="noopener noreferrer"&gt;How to check Consent Mode v2 in the browser&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>googleanalytics</category>
      <category>analytics</category>
      <category>webdev</category>
      <category>abotwrotethis</category>
    </item>
    <item>
      <title>How to check a GA4 purchase event: a QA checklist</title>
      <dc:creator>Montherion Labs</dc:creator>
      <pubDate>Thu, 08 Oct 2026 16:09:01 +0000</pubDate>
      <link>https://dev.to/montherion_labs/how-to-check-a-ga4-purchase-event-a-qa-checklist-5af9</link>
      <guid>https://dev.to/montherion_labs/how-to-check-a-ga4-purchase-event-a-qa-checklist-5af9</guid>
      <description>&lt;p&gt;The &lt;code&gt;purchase&lt;/code&gt; event feeds the ecommerce reports of Google Analytics™ 4 and, often, the conversions you use in Google Ads. A mistake here (a missing currency, a duplicate order, a value that counts shipping twice) is expensive and hard to see in the reports. This checklist shows what to look for and where.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a purchase needs
&lt;/h2&gt;

&lt;p&gt;Google’s ecommerce documentation lists these parameters for &lt;code&gt;purchase&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;transaction_id&lt;/code&gt;: a unique ID for the order. Required.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;value&lt;/code&gt;: the monetary value of the event, as a number.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;currency&lt;/code&gt;: a three-letter ISO 4217 code such as &lt;code&gt;USD&lt;/code&gt; or &lt;code&gt;EUR&lt;/code&gt;. Required when you send &lt;code&gt;value&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;items&lt;/code&gt;: the products bought. Required; each item must include an &lt;code&gt;item_id&lt;/code&gt; or an &lt;code&gt;item_name&lt;/code&gt;. &lt;code&gt;price&lt;/code&gt; and &lt;code&gt;quantity&lt;/code&gt; are recommended; if &lt;code&gt;quantity&lt;/code&gt; is missing, GA4 uses 1.&lt;/li&gt;
&lt;li&gt;Optional: &lt;code&gt;tax&lt;/code&gt;, &lt;code&gt;shipping&lt;/code&gt; and &lt;code&gt;coupon&lt;/code&gt;, among others.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In GA4, &lt;code&gt;value&lt;/code&gt; should be the sum of price × quantity of the items, without tax or shipping, which go in &lt;code&gt;tax&lt;/code&gt; and &lt;code&gt;shipping&lt;/code&gt;. If Meta records the order total, compare equivalent amounts before diagnosing a difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to see it in Chrome
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open DevTools (F12), go to the &lt;strong&gt;Network&lt;/strong&gt; tab and type &lt;code&gt;collect&lt;/code&gt; in the filter.&lt;/li&gt;
&lt;li&gt;Place a test order. Look for a request to a &lt;code&gt;/g/collect&lt;/code&gt; path with &lt;code&gt;en=purchase&lt;/code&gt; among its parameters. With server-side tagging it may go to your own domain, and usually keeps that path.&lt;/li&gt;
&lt;li&gt;Read the parameters: &lt;code&gt;ep.&lt;/code&gt; marks text parameters (&lt;code&gt;ep.transaction_id&lt;/code&gt;), &lt;code&gt;epn.&lt;/code&gt; numeric ones (&lt;code&gt;epn.value&lt;/code&gt;, &lt;code&gt;epn.shipping&lt;/code&gt;), &lt;code&gt;cu&lt;/code&gt; is the currency and &lt;code&gt;pr1&lt;/code&gt;, &lt;code&gt;pr2&lt;/code&gt;… are the items, with fields such as &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;nm&lt;/code&gt;, &lt;code&gt;pr&lt;/code&gt; (price) and &lt;code&gt;qt&lt;/code&gt; (quantity) separated by &lt;code&gt;~&lt;/code&gt;: &lt;code&gt;pr1=idSKU-1~nmT-shirt~pr59.9~qt1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;GA4 often sends several events in one POST request, one per line of the request body. Check the payload, not only the URL.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tag Assistant helps you review which tags fire and their consent state. DebugView shows the events GA4 receives with debug mode on; consent and privacy controls can keep some of them from appearing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The purchase is sent &lt;strong&gt;only once per order and destination&lt;/strong&gt;; reloading the confirmation page doesn’t send it again.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transaction_id&lt;/code&gt; is present and different for every order.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;value&lt;/code&gt; is a number consistent with the purchase, without thousands separators or currency symbols. It can be 0 for a free order. A tracking plan may require &lt;code&gt;value &amp;gt; 0&lt;/code&gt; if it intentionally excludes zero-value orders.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;currency&lt;/code&gt; is a valid three-letter code, the same one your store charges in.&lt;/li&gt;
&lt;li&gt;Every item has an ID or a name, and &lt;code&gt;value&lt;/code&gt; is the sum of price × quantity of the items.&lt;/li&gt;
&lt;li&gt;No personal data in parameters or URLs: emails, names or phone numbers must not reach GA4.&lt;/li&gt;
&lt;li&gt;The request goes to the right measurement ID (&lt;code&gt;tid&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;With a cookie banner, the purchase follows your consent setup (see the &lt;a href="https://tracklint.netlify.app/guides/check-consent-mode-v2.html" rel="noopener noreferrer"&gt;Consent Mode v2 guide&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Scope
&lt;/h2&gt;

&lt;p&gt;These checks examine outgoing requests visible in the browser. They do not establish what Google Analytics or Meta received, processed or counted, and they do not inspect server-to-server traffic or determine legal compliance.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Google Analytics and Google Tag Manager are trademarks of Google LLC. Meta is a trademark of Meta Platforms, Inc. Tracklint is not affiliated with, endorsed or sponsored by Google or Meta.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance (#ABotWroteThis). It was first published on the Tracklint website: &lt;a href="https://tracklint.netlify.app/guides/check-ga4-purchase-event.html" rel="noopener noreferrer"&gt;How to check a GA4 purchase event: a QA checklist&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>googleanalytics</category>
      <category>analytics</category>
      <category>webdev</category>
      <category>abotwrotethis</category>
    </item>
    <item>
      <title>GA4 and Meta Pixel purchases don’t match? Check what the browser sends first</title>
      <dc:creator>Montherion Labs</dc:creator>
      <pubDate>Mon, 05 Oct 2026 16:15:45 +0000</pubDate>
      <link>https://dev.to/montherion_labs/ga4-and-meta-pixel-purchases-dont-match-check-what-the-browser-sends-first-189d</link>
      <guid>https://dev.to/montherion_labs/ga4-and-meta-pixel-purchases-dont-match-check-what-the-browser-sends-first-189d</guid>
      <description>&lt;p&gt;It is normal for Google Analytics™ 4 and Meta Ads Manager to report different numbers of purchases and different revenue. Part of the gap comes from how each platform counts and attributes, which depends on settings you can review. Another part often comes from the tags on your site, and you can investigate it with Chrome DevTools before you spend hours comparing reports.&lt;/p&gt;

&lt;h2&gt;
  
  
  Differences you should expect
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Attribution.&lt;/strong&gt; Meta Ads Manager credits purchases to ads according to its attribution settings (for example, clicks or views within a time window). GA4 reports the purchases it receives and attributes them with its own model. The same purchase can count in one report and not in the other, or on a different day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consent and blocking.&lt;/strong&gt; Visitors who reject cookies, use ad blockers or browsers that restrict tracking can stop one or both tags from sending data. With Consent Mode, GA4 may estimate part of what it doesn’t receive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-side events.&lt;/strong&gt; Purchases sent server to server, with Meta’s Conversions API or GA4’s Measurement Protocol, don’t appear in DevTools; the same purchase may also be sent from the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settings.&lt;/strong&gt; Different time zones or currencies in the GA4 property and the Meta ad account move purchases between days or change the totals.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to check in the browser
&lt;/h2&gt;

&lt;p&gt;Place a test order with DevTools open (F12). In the &lt;strong&gt;Network&lt;/strong&gt; tab, filter by &lt;code&gt;collect&lt;/code&gt; to see GA4 requests and by &lt;code&gt;facebook.com/tr&lt;/code&gt; to see Meta Pixel requests. Then check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Each tag sends the purchase once per order.&lt;/strong&gt; Count the purchase events per order and per destination (&lt;code&gt;tid&lt;/code&gt; in GA4, &lt;code&gt;id&lt;/code&gt; in Meta), including every line of batched POST requests. Two copies to the same destination point to a duplicate; the same order sent to two different properties or pixels may be intended. Common causes of duplicates: the tag installed twice (in the code and in Google Tag Manager), a trigger that fires on every load of the confirmation page, or a single-page app that sends the event again when the route changes. Reload the confirmation page too: if the purchase is sent again, every customer who reopens that page creates a duplicate. Depending on how each platform deduplicates, a duplicate can be dropped by one and counted by the other, which is itself a source of mismatch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Both platforms identify the same order.&lt;/strong&gt; A GA4 purchase needs a &lt;code&gt;transaction_id&lt;/code&gt; (in the request, &lt;code&gt;ep.transaction_id&lt;/code&gt;). The Meta Pixel has no required order field; many setups send the order number as &lt;code&gt;order_id&lt;/code&gt; in the custom data (&lt;code&gt;cd[order_id]&lt;/code&gt;). Deduplication with the Conversions API is a different thing: it pairs the Pixel’s &lt;code&gt;eventID&lt;/code&gt; (sent as &lt;code&gt;eid&lt;/code&gt;) with the &lt;code&gt;event_id&lt;/code&gt; of the server event, for the same event name and the same pixel, and that ID doesn’t have to be the order number. To reconcile orders with GA4 one by one, you need a known correspondence between the IDs on each side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value and currency agree.&lt;/strong&gt; Compare GA4’s value (&lt;code&gt;epn.value&lt;/code&gt;) and currency (&lt;code&gt;cu&lt;/code&gt;) with Meta’s &lt;code&gt;cd[value]&lt;/code&gt; and &lt;code&gt;cd[currency]&lt;/code&gt;. Typical causes of a gap: one tag includes tax or shipping and the other doesn’t, the value is sent as text with a thousands separator, or the currency is missing or different.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Each tag respects the consent applicable to it.&lt;/strong&gt; With a cookie banner, check which tags send before and after the visitor accepts or rejects. Google’s tags follow Consent Mode, but the Meta Pixel only follows the visitor’s choice if your consent tool or tag setup blocks or configures it. If one tag waits for consent and the other doesn’t, their numbers will differ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The confirmation page is reached.&lt;/strong&gt; Payment methods that redirect to an external page (a wallet or a bank) don’t always bring the customer back to your confirmation page, so the purchase tags on that page never fire for those orders. Test each payment method you offer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  If this journey looks right
&lt;/h2&gt;

&lt;p&gt;Check other journeys and devices too, the destinations the events are sent to, reception errors, filters, deduplication and processing delays, as well as attribution, consent, blocking and server-side events. Compare reports with the same date range, time zone and currency, and read each platform’s attribution settings before drawing conclusions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scope
&lt;/h2&gt;

&lt;p&gt;These checks examine outgoing requests visible in the browser. They do not establish what Google Analytics or Meta received, processed or counted, and they do not inspect server-to-server traffic or determine legal compliance.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Google Analytics and Google Tag Manager are trademarks of Google LLC. Meta is a trademark of Meta Platforms, Inc. Tracklint is not affiliated with, endorsed or sponsored by Google or Meta.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance (#ABotWroteThis). It was first published on the Tracklint website: &lt;a href="https://tracklint.netlify.app/guides/ga4-meta-purchases-dont-match.html" rel="noopener noreferrer"&gt;GA4 and Meta Pixel purchases don’t match? Check what the browser sends first&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>googleanalytics</category>
      <category>analytics</category>
      <category>webdev</category>
      <category>abotwrotethis</category>
    </item>
    <item>
      <title>How to check server-side tagging from the browser</title>
      <dc:creator>Montherion Labs</dc:creator>
      <pubDate>Fri, 02 Oct 2026 16:09:20 +0000</pubDate>
      <link>https://dev.to/montherion_labs/how-to-check-server-side-tagging-from-the-browser-2gdb</link>
      <guid>https://dev.to/montherion_labs/how-to-check-server-side-tagging-from-the-browser-2gdb</guid>
      <description>&lt;p&gt;With server-side tagging, your browser sends data to the configured tagging server endpoint. Verifying this connection from the browser is the first step to ensure your server container receives the events.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to check the routing in DevTools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open DevTools (F12), go to the &lt;strong&gt;Network&lt;/strong&gt; tab and type &lt;code&gt;collect&lt;/code&gt; in the filter.&lt;/li&gt;
&lt;li&gt;Navigate your site to trigger a Google Analytics™ 4 event.&lt;/li&gt;
&lt;li&gt;Check that the request URL matches your configured tagging server URL; this may use a custom domain (e.g., &lt;code&gt;metrics.yourdomain.com&lt;/code&gt;) or a provider-assigned hostname.&lt;/li&gt;
&lt;li&gt;Check the path. The request usually maintains the &lt;code&gt;/g/collect&lt;/code&gt; path, indicating it is a GA4 payload.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What you can see in the browser
&lt;/h2&gt;

&lt;p&gt;When the browser sends an event to your server container, standard GA4 requests generally use the same encoding as direct browser requests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parameters:&lt;/strong&gt; You can see the event data included in that request, such as &lt;code&gt;en&lt;/code&gt; (event name), &lt;code&gt;tid&lt;/code&gt; (measurement ID), and custom parameters (&lt;code&gt;ep.&lt;/code&gt; and &lt;code&gt;epn.&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consent state:&lt;/strong&gt; When present, inspect &lt;code&gt;gcs&lt;/code&gt; and &lt;code&gt;gcd&lt;/code&gt;. Their presence does not prove that all consent types are configured or that server tags respect them; verify the effective state and server tag behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batches:&lt;/strong&gt; GA4 often groups several events in a single POST request body.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is not visible from the browser
&lt;/h2&gt;

&lt;p&gt;The browser only shows what goes &lt;em&gt;into&lt;/em&gt; the server. According to Google’s documentation, you cannot see from DevTools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which tags fire inside the server container.&lt;/li&gt;
&lt;li&gt;What data the server modifies, redacts, or adds before forwarding it.&lt;/li&gt;
&lt;li&gt;The final requests sent from your server to endpoints like Google Analytics, Google Ads, or the Conversions API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To debug those server-side processes, you can use Preview mode of your server container in Google Tag Manager, as well as the server’s logs and other server tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scope
&lt;/h2&gt;

&lt;p&gt;These checks examine outgoing requests visible in the browser. They do not establish what Google Analytics or Meta received, processed or counted, and they do not inspect server-to-server traffic or determine legal compliance.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Google Analytics and Google Tag Manager are trademarks of Google LLC. Meta is a trademark of Meta Platforms, Inc. Tracklint is not affiliated with, endorsed or sponsored by Google or Meta.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance (#ABotWroteThis). It was first published on the Tracklint website: &lt;a href="https://tracklint.netlify.app/guides/check-server-side-tagging-from-the-browser.html" rel="noopener noreferrer"&gt;How to check server-side tagging from the browser&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>googleanalytics</category>
      <category>analytics</category>
      <category>webdev</category>
      <category>abotwrotethis</category>
    </item>
    <item>
      <title>How to check Meta Pixel event parameters in the browser</title>
      <dc:creator>Montherion Labs</dc:creator>
      <pubDate>Wed, 30 Sep 2026 15:09:20 +0000</pubDate>
      <link>https://dev.to/montherion_labs/how-to-check-meta-pixel-event-parameters-in-the-browser-38o7</link>
      <guid>https://dev.to/montherion_labs/how-to-check-meta-pixel-event-parameters-in-the-browser-38o7</guid>
      <description>&lt;p&gt;The Meta Pixel uses standard events to measure conversions and build audiences. Inspecting their parameters in the browser helps you check the values, currencies, and product data sent by the browser before relying on the Events Manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to see Meta Pixel requests
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open DevTools (F12), go to the &lt;strong&gt;Network&lt;/strong&gt; tab and type &lt;code&gt;facebook.com/tr&lt;/code&gt; in the filter.&lt;/li&gt;
&lt;li&gt;Trigger a standard event on your site, such as adding a product to the cart or completing a purchase.&lt;/li&gt;
&lt;li&gt;Select the request and look at the Payload tab. Meta Pixel parameters are often encoded as &lt;code&gt;cd[...]&lt;/code&gt; fields in the query string or form body.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Key parameters to check
&lt;/h2&gt;

&lt;p&gt;Meta’s documentation defines specific parameters for standard events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ev&lt;/code&gt;: the event name, such as &lt;code&gt;Purchase&lt;/code&gt; or &lt;code&gt;AddToCart&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd[value]&lt;/code&gt;: the monetary value as a decimal number (e.g., 9.99), without currency symbols.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd[currency]&lt;/code&gt;: a three-letter ISO 4217 code like &lt;code&gt;USD&lt;/code&gt; or &lt;code&gt;EUR&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd[content_ids]&lt;/code&gt;: a JSON array of product IDs. &lt;code&gt;cd[contents]&lt;/code&gt;: a JSON array of objects with &lt;code&gt;id&lt;/code&gt; and &lt;code&gt;quantity&lt;/code&gt;, optionally &lt;code&gt;item_price&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd[num_items]&lt;/code&gt;: the quantity of items.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Purchase requires &lt;code&gt;value&lt;/code&gt; and &lt;code&gt;currency&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deduplication with the Conversions API
&lt;/h2&gt;

&lt;p&gt;If you send the same events from the browser and a server (Conversions API), Meta needs to deduplicate them so they only count once.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Look for the &lt;code&gt;eid&lt;/code&gt; (Event ID) parameter in the browser request.&lt;/li&gt;
&lt;li&gt;For ID-based deduplication, send the Pixel &lt;code&gt;eventID&lt;/code&gt; (serialized as &lt;code&gt;eid&lt;/code&gt;) as the Conversions API &lt;code&gt;event_id&lt;/code&gt;, with the same event name and pixel/dataset, within Meta’s deduplication window. Use a different ID for each distinct event. The browser alone cannot confirm server delivery or deduplication.&lt;/li&gt;
&lt;li&gt;Standard events sent multiple times from the browser with identical data without an Event ID can inflate your conversion metrics.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Scope
&lt;/h2&gt;

&lt;p&gt;These checks examine outgoing requests visible in the browser. They do not establish what Google Analytics or Meta received, processed or counted, and they do not inspect server-to-server traffic or determine legal compliance.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Google Analytics and Google Tag Manager are trademarks of Google LLC. Meta is a trademark of Meta Platforms, Inc. Tracklint is not affiliated with, endorsed or sponsored by Google or Meta.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance (#ABotWroteThis). It was first published on the Tracklint website: &lt;a href="https://tracklint.netlify.app/guides/check-meta-pixel-event-parameters.html" rel="noopener noreferrer"&gt;How to check Meta Pixel event parameters in the browser&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>googleanalytics</category>
      <category>analytics</category>
      <category>webdev</category>
      <category>abotwrotethis</category>
    </item>
    <item>
      <title>Catching a Meta Pixel consent bug with a CSV tracking plan</title>
      <dc:creator>Montherion Labs</dc:creator>
      <pubDate>Sun, 27 Sep 2026 18:39:50 +0000</pubDate>
      <link>https://dev.to/montherion_labs/catching-a-meta-pixel-consent-bug-with-a-csv-tracking-plan-3i4i</link>
      <guid>https://dev.to/montherion_labs/catching-a-meta-pixel-consent-bug-with-a-csv-tracking-plan-3i4i</guid>
      <description>&lt;p&gt;A consent banner can look correct while the Meta Pixel sends events before advertising consent is granted. This example compares a scripted sequence of requests with a written consent rule, then explains how to investigate the same problem in Chrome DevTools.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The plan: a CSV anyone can read
&lt;/h2&gt;

&lt;p&gt;A tracking plan can be a plain CSV file. This example records event names, required parameters, value rules and consent conditions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# consent_mode: advanced
platform,event,required,rules,count,consent,note
ga4,purchase,transaction_id;currency;value;items,currency is iso4217; value &amp;gt; 0; each item has item_id|item_name,once,analytics_storage,Order confirmation
meta,ViewContent,content_ids;value;currency,currency is iso4217; value &amp;gt;= 0,at_least_once,ad_storage,Product page
meta,AddToCart,content_ids;value;currency,currency is iso4217; value &amp;gt;= 0,at_least_once,ad_storage,Add to cart
meta,PageView,,,at_least_once,ad_storage,Every page
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;consent&lt;/code&gt; column says which consent each event needs. For the Meta rows it is &lt;code&gt;ad_storage&lt;/code&gt;: the Pixel should&lt;br&gt;
not send those events while the visitor has not accepted advertising cookies. A plan written like this is useful&lt;br&gt;
even without any tool: it is the checklist you hand to whoever implements the tags.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. The bug
&lt;/h2&gt;

&lt;p&gt;Our automated test opens &lt;code&gt;journey.html?consent=denied&amp;amp;metarevoke=0&lt;/code&gt;: this sets Google's consent to denied and deliberately skips Meta's consent revocation. The page uses real tracking libraries; the harness intercepts collection requests locally. The page's default is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;gtag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;consent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;ad_storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;denied&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;analytics_storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;denied&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;ad_user_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;denied&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ad_personalization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;denied&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In advanced Consent Mode, Google tags can send cookieless pings while storage consent is denied. Google's consent commands do not automatically control the Meta Pixel.&lt;/p&gt;

&lt;p&gt;The page calls &lt;code&gt;PageView&lt;/code&gt; on load. The harness then calls &lt;code&gt;ViewContent&lt;/code&gt;, updates Google's consent signals to granted to simulate acceptance, and calls &lt;code&gt;AddToCart&lt;/code&gt;. The first two requests occur while &lt;code&gt;ad_storage&lt;/code&gt; is denied; &lt;code&gt;AddToCart&lt;/code&gt; occurs after it is granted.&lt;/p&gt;

&lt;p&gt;For a manual check on a site with an interactive banner, inspect &lt;code&gt;facebook.com/tr&lt;/code&gt; requests in DevTools and compare their timing with the page's consent updates. This demo has no interactive banner: reloading calls &lt;code&gt;PageView&lt;/code&gt;, while the harness supplies &lt;code&gt;ViewContent&lt;/code&gt;, the consent update and &lt;code&gt;AddToCart&lt;/code&gt;. Reloading alone does not reproduce the full sequence.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Checking the journey against the plan
&lt;/h2&gt;

&lt;p&gt;For this example, the plan requires the Meta Pixel events to occur only after &lt;code&gt;ad_storage&lt;/code&gt; is granted. This is a rule of the site's implementation; Google's consent commands do not automatically enforce it for Meta.&lt;/p&gt;

&lt;p&gt;Compare the sequence described above with that rule:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Consent state when sent&lt;/th&gt;
&lt;th&gt;Consent check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PageView&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ad_storage&lt;/code&gt; denied&lt;/td&gt;
&lt;td&gt;Fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ViewContent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ad_storage&lt;/code&gt; denied&lt;/td&gt;
&lt;td&gt;Fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AddToCart&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ad_storage&lt;/code&gt; granted&lt;/td&gt;
&lt;td&gt;Meets this consent condition&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;To investigate a site manually, open DevTools before the journey, enable Preserve log and filter Network by &lt;code&gt;facebook.com/tr&lt;/code&gt;. Identify the events and establish their order relative to the site's consent changes. A snapshot of the final consent state is not enough to determine the state when an earlier request was sent.&lt;/p&gt;

&lt;p&gt;If the order cannot be established, record the result as inconclusive. An expected event that never appears is not observed; its absence does not demonstrate a successful consent check. Other requirements, such as parameters and event counts, need separate checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The fix
&lt;/h2&gt;

&lt;p&gt;Make the Meta Pixel wait for the same decision as the Google tag. Two common ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With the Pixel code: call &lt;code&gt;fbq('consent', 'revoke')&lt;/code&gt; before &lt;code&gt;fbq('init', ...)&lt;/code&gt; when consent is denied, and
&lt;code&gt;fbq('consent', 'grant')&lt;/code&gt; when the visitor accepts.&lt;/li&gt;
&lt;li&gt;With Google Tag Manager: require &lt;code&gt;ad_storage&lt;/code&gt; in the Meta tag's additional consent checks and provide a trigger that fires after consent is granted. Updating consent alone does not automatically replay a previously blocked tag.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repeat the check after the fix. Under this example's rule, no Meta event request should occur while &lt;code&gt;ad_storage&lt;/code&gt; is denied. After consent is granted, perform the relevant actions and confirm that the expected events appear with the required parameters. Missing events still need investigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scope
&lt;/h2&gt;

&lt;p&gt;This checks what the browser sends during the journey you record. It does not verify processing inside Google&lt;br&gt;
Analytics or Meta, server-to-server integrations (such as the Conversions API) or legal compliance.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Google Analytics and Google Tag Manager are trademarks of Google LLC. Meta is a trademark of Meta Platforms, Inc.&lt;br&gt;
Tracklint is not affiliated with, endorsed or sponsored by Google or Meta.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance (#ABotWroteThis).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>abotwrotethis</category>
    </item>
    <item>
      <title>Why GA4 DebugView is not showing events and how to fix it</title>
      <dc:creator>Montherion Labs</dc:creator>
      <pubDate>Sat, 26 Sep 2026 03:21:08 +0000</pubDate>
      <link>https://dev.to/montherion_labs/why-ga4-debugview-is-not-showing-events-and-how-to-fix-it-4c39</link>
      <guid>https://dev.to/montherion_labs/why-ga4-debugview-is-not-showing-events-and-how-to-fix-it-4c39</guid>
      <description>&lt;p&gt;Google Analytics™ 4 DebugView is the built-in tool to inspect events as they arrive. When events do not show up, the issue can be in the browser, in the network, or in the GA4 settings. This guide shows how to find the cause.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the browser in DevTools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open DevTools (F12), go to the &lt;strong&gt;Network&lt;/strong&gt; tab and type &lt;code&gt;collect&lt;/code&gt; in the filter.&lt;/li&gt;
&lt;li&gt;Perform the action that triggers the event. Look for a request to a &lt;code&gt;/g/collect&lt;/code&gt; path.&lt;/li&gt;
&lt;li&gt;Check the measurement ID: The &lt;code&gt;tid&lt;/code&gt; parameter must match the measurement ID of the intended GA4 web data stream (e.g., &lt;code&gt;G-XXXXXXXXXX&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Check the debug signal: Enable debug mode using Tag Assistant or &lt;code&gt;debug_mode: true&lt;/code&gt; in the relevant gtag/GTM configuration. Inspect the outgoing debug signal, commonly &lt;code&gt;_dbg=1&lt;/code&gt;. Its presence does not guarantee that the event will appear in DebugView.&lt;/li&gt;
&lt;li&gt;Check the consent state: Inspect &lt;code&gt;gcs&lt;/code&gt; and &lt;code&gt;gcd&lt;/code&gt; when present. If analytics storage is denied (for example, &lt;code&gt;gcs=G100&lt;/code&gt;), the event might not appear in DebugView depending on your consent mode configuration. &lt;code&gt;G110&lt;/code&gt; also indicates denied analytics storage. A cookieless ping does not establish DebugView visibility.&lt;/li&gt;
&lt;li&gt;Check the network status: Ensure the request returns a 200 (OK) or 204 (No Content) status. An HTTP success response does not prove processing in GA4, especially when the destination is a tagging server. If something blocks it, like an ad blocker or browser privacy settings, it will not reach GA4.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Causes outside the browser
&lt;/h2&gt;

&lt;p&gt;If the request leaves the browser correctly, Google’s documentation points to these causes within GA4:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data filters:&lt;/strong&gt; Check whether an active internal traffic filter excludes your test traffic. The developer traffic filter excludes debug traffic from reports while keeping it available in DebugView.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selected device:&lt;/strong&gt; In DebugView, verify that you have selected your specific testing device in the &lt;em&gt;Debug Device&lt;/em&gt; drop-down menu in the top left corner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Processing delays:&lt;/strong&gt; While DebugView is designed to be real-time, there can sometimes be short delays.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Scope
&lt;/h2&gt;

&lt;p&gt;These checks examine outgoing requests visible in the browser. They do not establish what Google Analytics or Meta received, processed or counted, and they do not inspect server-to-server traffic or determine legal compliance.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Google Analytics and Google Tag Manager are trademarks of Google LLC. Meta is a trademark of Meta Platforms, Inc. Tracklint is not affiliated with, endorsed or sponsored by Google or Meta.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article was written with AI assistance (#ABotWroteThis). It was first published on the Tracklint website: &lt;a href="https://tracklint.netlify.app/guides/ga4-debugview-not-showing-events.html" rel="noopener noreferrer"&gt;Why GA4 DebugView is not showing events and how to fix it&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>googleanalytics</category>
      <category>analytics</category>
      <category>webdev</category>
      <category>abotwrotethis</category>
    </item>
  </channel>
</rss>
