<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://paolobietolini.com</id>
    <title>Paolo Bietolini’s Blog</title>
    <updated>2026-04-18T13:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://paolobietolini.com"/>
    <link rel="self" href="https://paolobietolini.com/feed.xml"/>
    <subtitle>Technical guides on Google Tag Manager, GA4, server-side tracking, and analytics implementation. Practical tutorials for marketers and developers.</subtitle>
    <rights>All rights reserved 2026, Paolo Bietolini</rights>
    <entry>
        <title type="html"><![CDATA[A NaN where a Long should be]]></title>
        <id>/development/a-nan-where-a-long-should-be</id>
        <link href="/development/a-nan-where-a-long-should-be"/>
        <updated>2026-04-18T13:00:00.000Z</updated>
        <summary type="html"><![CDATA[A PySpark TypeError that looked like a schema bug was actually three steps upstream. Pandas can't represent what BigQuery hands it, (nested structs, nullable integers, timezone-aware timestamps, arbitrary-precision numerics) so every downstream line is a patch against a loss that happened at the moment pandas entered the pipeline. A walk to a twelve-line Arrow replacement, and the rule it points at.]]></summary>
    </entry>
    <entry>
        <title type="html"><![CDATA[Arrow over the wire]]></title>
        <id>/development/arrow-over-the-wire</id>
        <link href="/development/arrow-over-the-wire"/>
        <updated>2026-04-18T13:00:00.000Z</updated>
        <summary type="html"><![CDATA[Four lines of Spark config to read BigQuery. Underneath: a gRPC read session, one stream per Spark partition, Arrow end-to-end, server-side column and filter pushdown, and dynamic rebalancing when executors finish early. A walkthrough of what those lines actually trigger — and why the middle format isn't replaced with something better, it's removed.]]></summary>
    </entry>
    <entry>
        <title type="html"><![CDATA[[Case Study] Rebuilding analytics for a multi-domain tourism SPA]]></title>
        <id>/data-collection/rebuilding-analytics-for-a-multi-domain-tourism-spa</id>
        <link href="/data-collection/rebuilding-analytics-for-a-multi-domain-tourism-spa"/>
        <updated>2026-04-11T12:00:00.000Z</updated>
        <summary type="html"><![CDATA[A large-sized Italian tourism operator running hop-on-hop-off bus tours and experience bookings across three domains came to me with a common problem: their advertising platforms were not receiving reliable conversion data. Meta, LinkedIn, Google Ads, and TikTok dashboards told conflicting stories. Attribution was unreliable. Nobody trusted the numbers. This is the story of how I rebuilt their analytics infrastructure from the ground up.]]></summary>
        <category label="Google Tag Manager"/>
        <category label="Data Layer"/>
        <category label="Marketing Analytics"/>
        <category label="Multi-Market"/>
        <category label="Data Quality"/>
        <category label="Case Study"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[GTM Server-Side vs Client-Side: Real Benchmarks and Honest Trade-Offs]]></title>
        <id>/data-collection/gtm-server-side-vs-client-side-benchmarks</id>
        <link href="/data-collection/gtm-server-side-vs-client-side-benchmarks"/>
        <updated>2026-03-09T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[Server-side GTM promises better performance, more accurate data, and longer cookie lifetimes. But the benchmarks tell a more complicated story than vendor blogs admit. This article compares client-side and server-side GTM across five dimensions — page speed, data accuracy, cookie durability, cost, and complexity — using real numbers from published tests and case studies.]]></summary>
        <category label="tag-manager"/>
        <category label="server-side"/>
        <category label="performance"/>
        <category label="conversion-tracking"/>
        <category label="core-web-vitals"/>
        <category label="ITP"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[[Case Study] Auditing Adobe Analytics data layers across 8 European markets: what I found]]></title>
        <id>/data-collection/adobe-datalayer-multi-market-audit</id>
        <link href="/data-collection/adobe-datalayer-multi-market-audit"/>
        <updated>2026-03-06T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[I audited the Adobe Analytics data layer implementation across 8 European websites of a major grocery retailer. Two different data layer architectures, inconsistent page type taxonomies, and diverging product data. Here is what a real-world multi-market audit looks like and what you can learn from it.]]></summary>
        <category label="Adobe Analytics"/>
        <category label="Data Layer"/>
        <category label="Adobe Client Data Layer"/>
        <category label="W3C Digital Data"/>
        <category label="Multi-Market"/>
        <category label="Data Quality"/>
        <category label="Case Study"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Google Tag Gateway vs Server-Side GTM: Which One Do You Need?]]></title>
        <id>/data-collection/google-tag-gateway-vs-server-side-gtm</id>
        <link href="/data-collection/google-tag-gateway-vs-server-side-gtm"/>
        <updated>2026-02-15T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[Browser tracking is losing signal. Safari caps cookies at 7 days, ad blockers strip requests to googletagmanager.com, and Firefox blocks third-party resources by default. Google Tag Gateway and server-side GTM both solve this, but they take fundamentally different approaches. This guide compares them head-to-head with real setup examples.]]></summary>
        <category label="Google Tag Manager"/>
        <category label="Server-Side"/>
        <category label="Google Tag Gateway"/>
        <category label="Privacy"/>
        <category label="First-Party Data"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[GTM MCP Server: AI-Powered Google Tag Manager Automation]]></title>
        <id>/data-collection/gtm-mcp-server-ai-tag-management</id>
        <link href="/data-collection/gtm-mcp-server-ai-tag-management"/>
        <updated>2026-02-05T10:00:00.000Z</updated>
        <summary type="html"><![CDATA[Managing GTM at scale is tedious. Creating GA4 ecommerce tracking means 12+ tags, matching triggers, and variables—each requiring careful configuration. I built an open-source MCP server that connects Claude and ChatGPT directly to the GTM API. Describe what you need in plain English, and the AI handles the implementation. Here is how it works, how to set it up, and real-world workflows for analytics teams.]]></summary>
        <category label="GTM"/>
        <category label="Google Tag Manager"/>
        <category label="MCP"/>
        <category label="Model Context Protocol"/>
        <category label="AI"/>
        <category label="Claude"/>
        <category label="ChatGPT"/>
        <category label="Automation"/>
        <category label="Analytics Engineering"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Cross-Domain Tracking in GA4: Setup Without Data Loss]]></title>
        <id>/analytics/ga4-cross-domain-tracking</id>
        <link href="/analytics/ga4-cross-domain-tracking"/>
        <updated>2026-01-10T12:00:00.000Z</updated>
        <summary type="html"><![CDATA[When users move between your domains, GA4 treats them as new visitors by default—inflating user counts and breaking attribution. This guide covers proper cross-domain configuration in GA4 and GTM, troubleshooting self-referrals, handling payment gateways, and testing to ensure session continuity.]]></summary>
        <category label="GA4"/>
        <category label="Google Tag Manager"/>
        <category label="GTM"/>
        <category label="Cross-Domain Tracking"/>
        <category label="Attribution"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[GA4 Custom Dimensions & Metrics: When and How to Use Them]]></title>
        <id>/analytics/ga4-custom-dimensions-metrics</id>
        <link href="/analytics/ga4-custom-dimensions-metrics"/>
        <updated>2026-01-03T11:00:00.000Z</updated>
        <summary type="html"><![CDATA[GA4 default parameters cover most cases, but custom dimensions unlock business-specific insights. This practical guide explains when you actually need them, the three scope types (event, user, item), implementation via GTM, quota management, and real examples for ecommerce and lead generation sites.]]></summary>
        <category label="GA4"/>
        <category label="Google Tag Manager"/>
        <category label="GTM"/>
        <category label="Custom Dimensions"/>
        <category label="Ecommerce"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[GTM Consent Mode V2: Complete Implementation Guide]]></title>
        <id>/data-collection/consent-mode-v2-implementation</id>
        <link href="/data-collection/consent-mode-v2-implementation"/>
        <updated>2025-12-22T10:00:00.000Z</updated>
        <summary type="html"><![CDATA[Google Consent Mode V2 became mandatory for EEA advertisers in March 2024. Without it, you lose remarketing audiences and conversion data. This practical guide covers the two new parameters (ad_user_data, ad_personalization), basic vs advanced modes, GTM implementation with popular CMPs, and verification steps.]]></summary>
        <category label="Consent Mode"/>
        <category label="GDPR"/>
        <category label="Google Tag Manager"/>
        <category label="GTM"/>
        <category label="Privacy"/>
        <category label="GA4"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[GA4 Debug Mode: Complete Troubleshooting Guide]]></title>
        <id>/analytics/ga4-debug-mode-guide</id>
        <link href="/analytics/ga4-debug-mode-guide"/>
        <updated>2025-12-16T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[DebugView is essential for validating your GA4 implementation, but it often refuses to show data when you need it most. This practical guide covers all methods to enable debug mode, diagnose why events are not appearing, and fix the 18+ common issues that break DebugView.]]></summary>
        <category label="GA4"/>
        <category label="debugging"/>
        <category label="Google Tag Manager"/>
        <category label="GTM"/>
        <category label="DebugView"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Implementing Server-Side GTM with Docker: On-Premise Solution Guide]]></title>
        <id>/data-collection/on-premise-sgtm-docker-implementation</id>
        <link href="/data-collection/on-premise-sgtm-docker-implementation"/>
        <updated>2025-12-12T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[Implementing GTM Server-Side on self-hosted infrastructure reduces costs from €50-150/month (Google Cloud) to €5-20/month while ensuring on-premise compliance essential for regulated industries. This technical guide covers complete Docker implementation: container setup, DNS configuration, Caddy reverse proxy with automatic SSL, health checks, zero-downtime deployment, automated backups, and troubleshooting. Solution for IT Managers, DevOps Engineers, and consultants seeking cost-effective, on-premise alternatives to managed cloud solutions.]]></summary>
        <category label="tag-manager"/>
        <category label="server-side"/>
        <category label="docker"/>
        <category label="caddy"/>
        <category label="self-hosting"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Google Tag Manager Server-Side: Implementazione  On-Premise con Docker]]></title>
        <id>/data-collection/tag-manager-server-side-on-premise-docker</id>
        <link href="/data-collection/tag-manager-server-side-on-premise-docker"/>
        <updated>2025-12-12T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[Implementare GTM Server-Side su infrastruttura self-hosted riduce i costi da 50-150 €/mese (Google Cloud o servizi terzi) a 5-20 €/mese, garantendo compliance on-premise essenziale per settori regolamentati. Questa guida tecnica copre l'implementazione completa con Docker: setup container, configurazione DNS, reverse proxy Caddy con SSL automatico, health checks, deployment zero-downtime, backup automatizzati e troubleshooting. Soluzione per IT Manager, DevOps Engineer e consulenti che cercano alternative cost-effective e on-premise a soluzioni cloud managed.]]></summary>
        <category label="tag-manager"/>
        <category label="server-side"/>
        <category label="docker"/>
        <category label="caddy"/>
        <category label="self-hosting"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Template: GA4 to Meta Parameters Mapper]]></title>
        <id>/templates/ga4tometa-params-mapper</id>
        <link href="/templates/ga4tometa-params-mapper"/>
        <updated>2025-09-12T08:00:00.000Z</updated>
        <summary type="html"><![CDATA[GTM variable template that automatically maps GA4 ecommerce parameters to Meta Pixel format. Transforms items array into content_ids and contents, maps value/currency, and adds content_type and order_id for accurate conversion tracking.]]></summary>
        <category label="google tag manager"/>
        <category label="templates"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Un DataLayer Coerente per il Tuo E-commerce Come Superare i Limiti dello Standard di Google]]></title>
        <id>/data-collection/datalayer-design</id>
        <link href="/data-collection/datalayer-design"/>
        <updated>2025-04-04T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[Lavorando nel Digital Marketing sai quanto sia cruciale avere un tracciamento preciso dei dati per prendere decisioni strategiche. Tuttavia, chiunque abbia implementato il tracciamento ecommerce di GA4 si sarà scontrato con alcune problematiche che possono rendere la gestione dei dati più complessa del necessario. Lo standard proposto da Google, pur essendo un punto di partenza utile, presenta diversi problemi]]></summary>
    </entry>
    <entry>
        <title type="html"><![CDATA[La Strategia UTM Definitiva per un'Attribuzione e un Reporting Impeccabili]]></title>
        <id>/data-collection/utm-parameters</id>
        <link href="/data-collection/utm-parameters"/>
        <updated>2025-04-03T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[Sebbene GA4 offra capacità avanzate di tracciamento e modellazione, la chiarezza nell'attribuzione delle conversioni e nella valutazione del rendimento delle campagne rimane una priorità assoluta. Qui entrano in gioco i parametri UTM.]]></summary>
        <category label="parametri utm"/>
        <category label="tracking"/>
        <category label="attribuzione"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Measurement Protocol. Cos'è e come funziona]]></title>
        <id>/data-collection/measurement-protocol</id>
        <link href="/data-collection/measurement-protocol"/>
        <updated>2025-01-05T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[Google Analytics 4 (GA4) è una piattaforma potente per raccogliere e analizzare dati sul comportamento degli utenti. Ma cosa fare se vuoi inviare dati personalizzati a GA4, magari da un'applicazione o un sistema che non usa un browser? È qui che entra in gioco il Measurement Protocol.]]></summary>
        <category label="ga4"/>
        <category label="measurement protocol"/>
        <category label="tracciamento"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Template: Variable Comparison (Boolean Conditions)]]></title>
        <id>/templates/boolean-conditions</id>
        <link href="/templates/boolean-conditions"/>
        <updated>2024-11-18T18:00:00.000Z</updated>
        <summary type="html"><![CDATA[GTM variable template for comparing two values with boolean operators. Supports equals, not equals, contains, not contains, starts with, and not starts with conditions. Perfect for URL filtering and conditional trigger logic.]]></summary>
        <category label="google tag manager"/>
        <category label="templates"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Template: Object Keys Remapper]]></title>
        <id>/templates/objects-remapper</id>
        <link href="/templates/objects-remapper"/>
        <updated>2024-11-17T01:00:00.000Z</updated>
        <summary type="html"><![CDATA[GTM variable template that renames object keys without custom JavaScript. Transform your dataLayer structure to match GA4 or any analytics platform requirements. Handles arrays, single objects, and nested object structures.]]></summary>
        <category label="google tag manager"/>
        <category label="templates"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Template: GA4 Items Array to Dynamic Remarketing Format]]></title>
        <id>/templates/ga4-items-to-rmkt</id>
        <link href="/templates/ga4-items-to-rmkt"/>
        <updated>2024-11-10T16:00:00.000Z</updated>
        <summary type="html"><![CDATA[GTM variable template that transforms GA4 ecommerce items array into Google Ads dynamic remarketing format, supporting multiple business verticals including retail, travel, flights, hotels, education, and jobs.]]></summary>
        <category label="google tag manager"/>
        <category label="templates"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Problemi con il form listener per Elementor]]></title>
        <id>/development/problemi-elementor-form-listener</id>
        <link href="/development/problemi-elementor-form-listener"/>
        <updated>2024-10-17T13:00:00.000Z</updated>
    </entry>
    <entry>
        <title type="html"><![CDATA[Google Tag Manager Server-Side: Panoramica Tecnica]]></title>
        <id>/data-collection/gtm-server-side-panoramica</id>
        <link href="/data-collection/gtm-server-side-panoramica"/>
        <updated>2024-09-06T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[Il tracciamento server-side sposta l'elaborazione dei dati dal browser dell'utente ai server aziendali, offrendo maggiore controllo, precisione e conformità alla privacy. Questa guida tecnica spiega come funziona GTM Server-Side, quando ha senso implementarlo, e perché bypassare gli adblocker non è una buona ragione per adottarlo.]]></summary>
        <category label="server-side"/>
        <category label="google tag manager"/>
        <category label="gtm"/>
        <category label="privacy"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Google Tag Manager Server-Side: Technical Overview]]></title>
        <id>/data-collection/server-side-tracking-overview</id>
        <link href="/data-collection/server-side-tracking-overview"/>
        <updated>2024-09-06T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[Server-side tracking shifts data processing from the user's browser to company servers, offering greater control, accuracy, and privacy compliance. This technical guide explains how GTM Server-Side works, when it makes sense to implement it, and why bypassing adblockers is not a good reason to adopt it.]]></summary>
        <category label="server-side"/>
        <category label="google tag manager"/>
        <category label="gtm"/>
        <category label="privacy"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fixing Direct Traffic Inflation in GA4 for Single Page Applications]]></title>
        <id>/analytics/fix-direct-traffic-spa</id>
        <link href="/analytics/fix-direct-traffic-spa"/>
        <updated>2021-01-30T09:00:00.000Z</updated>
        <summary type="html"><![CDATA[If your SPA built with Nuxt.js, Next.js, or React shows unusually high Direct traffic in GA4, the problem is likely that document.referrer doesn't update on client-side navigation. Learn how to fix this using GTM's History Change trigger and a custom page_referrer variable.]]></summary>
    </entry>
</feed>