{"id":8814,"date":"2026-08-05T15:36:42","date_gmt":"2026-08-05T13:36:42","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=8814"},"modified":"2026-08-28T17:04:53","modified_gmt":"2026-08-28T15:04:53","slug":"ga4-pii-checker","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-pii-checker\/","title":{"rendered":"GA4 PII Checker"},"content":{"rendered":"<p><script src=\"https:\/\/accounts.google.com\/gsi\/client\" async defer><\/script><\/p>\n<div class=\"ga4-pii-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<div class=\"lw-aussenhinweis\" style=\"background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid #fbbf24; border-radius: 6px; padding: 14px 16px; margin-bottom: 20px;\">\n<div style=\"color: #fbbf24; font-size: 0.72rem; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; margin-bottom: 6px;\">Needs a Google sign-in<\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); margin: 0 0 8px; font-size: 0.9rem; line-height: 1.55;\">Unlike the other tools here, this one does not work on its own. It reads from the Google Analytics Data API v1 and therefore asks for a Google sign-in. The permission requested is analytics.readonly \u2014 read-only, so nothing can be changed through it.<\/p>\n<p style=\"color: var(--text-secondary, #a0a0b0); margin: 0; font-size: 0.9rem; line-height: 1.55;\">What it fetches stays in this tab: the evaluation runs in the browser, and nothing is sent to lukaswojcik.com. The OAuth Client ID below is prefilled and can be replaced with a different one.<\/p>\n<\/div>\n<p style=\"color: var(--text-secondary); margin-bottom: 20px; line-height: 1.6;\">\n        Connect directly to the <strong>Google Analytics Data API v1<\/strong> using OAuth 2.0.<br \/>\n        Scan the property page reports for Personally Identifiable Information (PII) leaks such as email addresses, phone numbers, or unique user identifiers in URL query strings. All checks execute locally in the browser.\n    <\/p>\n<p>    <!-- STEP 1: OAUTH & AUTHENTICATION --><\/p>\n<div style=\"background: var(--bg-body, #101416); padding: 20px; border-radius: 8px; border: 1px solid var(--border); margin-bottom: 20px;\">\n<h3 style=\"color: var(--accent); font-size: 1rem; margin-top: 0; margin-bottom: 12px;\">1. Google Analytics API Authentication<\/h3>\n<div style=\"display: flex; gap: 15px; flex-wrap: wrap; align-items: flex-end;\">\n<div style=\"flex: 1; min-width: 280px;\">\n                <label style=\"color: var(--text-secondary); display: block; font-size: 0.85rem; margin-bottom: 6px;\">Google Cloud OAuth Client ID:<\/label><br \/>\n                <input type=\"text\" id=\"ga4-client-id\" value=\"423029313598-2ko0jilc28eevp253rqncvodg2181e1l.apps.googleusercontent.com\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-panel); border: 1px solid var(--border); color: var(--text-primary); border-radius: 6px; font-family: monospace;\">\n            <\/div>\n<div>\n                <button id=\"ga4-auth-btn\" class=\"button\" style=\"background: var(--accent); color: var(--on-accent); border: none; padding: 11px 22px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Authorize with Google<\/button>\n            <\/div>\n<\/p><\/div>\n<div data-mp-mask id=\"ga4-auth-status\" style=\"margin-top: 10px; font-size: 0.85rem; color: var(--text-secondary);\">Status: <strong style=\"color: #ff6b6b;\">Not connected<\/strong><\/div>\n<\/p><\/div>\n<p>    <!-- STEP 2: PROPERTY & SCAN CONFIGURATION --><\/p>\n<div id=\"ga4-config-panel\" style=\"background: var(--bg-body); padding: 20px; border-radius: 8px; border: 1px solid var(--border); margin-bottom: 20px; display: none;\">\n<h3 style=\"color: var(--accent); font-size: 1rem; margin-top: 0; margin-bottom: 12px;\">2. Property &amp; Scan Configuration<\/h3>\n<div style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-bottom: 15px;\">\n<div>\n                <label style=\"color: var(--text-secondary); display: block; font-size: 0.85rem; margin-bottom: 6px;\">GCP Project ID (Optional reference):<\/label><br \/>\n                <input type=\"text\" id=\"gcp-project-id\" value=\"lukaswojcik\" placeholder=\"e.g., my-gcp-project-123\" style=\"width: 100%; padding: 10px; background: var(--bg-panel); color: var(--text-primary); border: 1px solid var(--border); border-radius: 6px; font-family: monospace;\">\n            <\/div>\n<div>\n                <label style=\"color: var(--text-secondary); display: block; font-size: 0.85rem; margin-bottom: 6px;\">GA4 Property ID (Numeric):<\/label><br \/>\n                <input type=\"text\" id=\"ga4-property-id\" placeholder=\"e.g., 345678901\" style=\"width: 100%; padding: 10px; background: var(--bg-panel); color: var(--text-primary); border: 1px solid var(--border); border-radius: 6px; font-family: monospace;\">\n            <\/div>\n<div>\n                <label style=\"color: var(--text-secondary); display: block; font-size: 0.85rem; margin-bottom: 6px;\">Date Range:<\/label><br \/>\n                <select id=\"ga4-date-range\" style=\"width: 100%; padding: 10px; background: var(--bg-panel); color: var(--text-primary); border: 1px solid var(--border); border-radius: 6px;\"><option value=\"7daysAgo\">Last 7 Days<\/option><option value=\"30daysAgo\" selected>Last 30 Days (Default)<\/option><option value=\"90daysAgo\">Last 90 Days<\/option><\/select>\n            <\/div>\n<\/p><\/div>\n<div style=\"display: flex; justify-content: flex-end;\">\n            <button id=\"run-pii-scan-btn\" class=\"button\" style=\"background: var(--accent); color: var(--on-accent); border: none; padding: 11px 26px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Scan Page Reports for PII<\/button>\n        <\/div>\n<\/p><\/div>\n<p>    <!-- SCAN STATUS \/ PROGRESS --><\/p>\n<div data-mp-mask id=\"scan-summary-bar\" style=\"margin-bottom: 20px;\"><\/div>\n<p>    <!-- PII VIOLATIONS RESULTS --><\/p>\n<div data-mp-mask id=\"pii-results-container\"><\/div>\n<\/div>\n<p><script>\n(() => {\n    let accessToken = null;\n    let tokenClient = null;<\/p>\n<p>    const authBtn = document.getElementById(\"ga4-auth-btn\");\n    const authStatus = document.getElementById(\"ga4-auth-status\");\n    const configPanel = document.getElementById(\"ga4-config-panel\");\n    const runScanBtn = document.getElementById(\"run-pii-scan-btn\");\n    const summaryBar = document.getElementById(\"scan-summary-bar\");\n    const resultsContainer = document.getElementById(\"pii-results-container\");<\/p>\n<p>    const esc = (str) => String(str).replace(\/&\/g, \"&amp;\").replace(\/<\/g, \"&lt;\").replace(\/>\/g, \"&gt;\");<\/p>\n<p>    \/\/ 1. OAUTH 2.0 INITIALIZATION\n    authBtn.addEventListener(\"click\", () => {\n        const clientId = document.getElementById(\"ga4-client-id\").value.trim();\n        if (!clientId) {\n            alert(\"Please enter a valid Google Cloud Client ID.\");\n            return;\n        }<\/p>\n<p>        if (!window.google || !google.accounts || !google.accounts.oauth2) {\n            alert(\"Google Identity Services script is still loading. Try again in a second.\");\n            return;\n        }<\/p>\n<p>        tokenClient = google.accounts.oauth2.initTokenClient({\n            client_id: clientId,\n            scope: \"https:\/\/www.googleapis.com\/auth\/analytics.readonly\",\n            callback: (resp) => {\n                if (resp.error) {\n                    authStatus.innerHTML = \"Status: <strong style='color:#ff6b6b;'>Auth Error: \" + esc(resp.error) + \"<\/strong>\";\n                    return;\n                }\n                accessToken = resp.access_token;\n                authStatus.innerHTML = \"Status: <strong style='color:#51cf66;'>Connected (Analytics Read-Only)<\/strong>\";\n                configPanel.style.display = \"block\";\n            }\n        });\n        tokenClient.requestAccessToken();\n    });<\/p>\n<p>    \/\/ 2. PII DETECTION ENGINE\n    const scanUrlForPII = (urlStr) => {\n        const findings = [];\n        let urlObj;\n        try {\n            urlObj = new URL(urlStr.startsWith(\"http\") ? urlStr : \"https:\/\/\" + urlStr);\n        } catch (e) {\n            return findings;\n        }<\/p>\n<p>        const params = urlObj.searchParams;\n        const emailRegex = \/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})\/i;\n        const phoneRegex = \/(?:\\+|00)?\\d{9,15}\/;\n        const uuidRegex = \/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$\/i;\n        const idKeys = [\"user_id\", \"userid\", \"uid\", \"customer_id\", \"client_id\", \"pesel\", \"nip\", \"token\", \"session_id\", \"email\", \"mail\", \"phone\", \"tel\"];<\/p>\n<p>        params.forEach((value, key) => {\n            const lowKey = key.toLowerCase();\n            const cleanVal = decodeURIComponent(value).trim();<\/p>\n<p>            \/\/ Test Email\n            if (emailRegex.test(cleanVal) || (lowKey.includes(\"email\") && cleanVal.includes(\"@\"))) {\n                findings.push({ type: \"EMAIL\", paramKey: key, paramValue: cleanVal });\n                return;\n            }<\/p>\n<p>            \/\/ Test Phone\n            if ((lowKey.includes(\"phone\") || lowKey.includes(\"tel\") || lowKey.includes(\"kom\")) && phoneRegex.test(cleanVal.replace(\/[\\s.-]\/g, \"\"))) {\n                findings.push({ type: \"PHONE\", paramKey: key, paramValue: cleanVal });\n                return;\n            }<\/p>\n<p>            \/\/ Test Unique Identifier\n            if (idKeys.some(k => lowKey === k) || uuidRegex.test(cleanVal)) {\n                if (cleanVal.length > 3 && cleanVal !== \"null\" && cleanVal !== \"undefined\" && cleanVal !== \"true\" && cleanVal !== \"false\") {\n                    findings.push({ type: \"UNIQUE IDENTIFIER\", paramKey: key, paramValue: cleanVal });\n                }\n            }\n        });<\/p>\n<p>        return findings;\n    };<\/p>\n<p>    const getBadge = (type) => {\n        const colors = {\n            \"EMAIL\": { bg: \"#471a1a\", color: \"#ff6b6b\" },\n            \"PHONE\": { bg: \"#4b3a1a\", color: \"#ff922b\" },\n            \"UNIQUE IDENTIFIER\": { bg: \"#2a1a4b\", color: \"#cc5de8\" }\n        };\n        const c = colors[type] || { bg: \"#242b30\", color: \"#ffffff\" };\n        return \"<span style='background:\" + c.bg + \"; color:\" + c.color + \"; padding:4px 10px; border-radius:4px; font-size:0.75rem; font-weight:700; text-transform:uppercase;'>\" + type + \"<\/span>\";\n    };<\/p>\n<p>    \/\/ 3. GA4 DATA API RUN REPORT\n    runScanBtn.addEventListener(\"click\", async () => {\n        const propertyId = document.getElementById(\"ga4-property-id\").value.trim().replace(\/^properties\\\/\/i, \"\");\n        const dateRange = document.getElementById(\"ga4-date-range\").value;<\/p>\n<p>        if (!propertyId || isNaN(propertyId)) {\n            alert(\"Please enter a valid numeric GA4 Property ID (e.g., 345678901).\");\n            return;\n        }<\/p>\n<p>        runScanBtn.disabled = true;\n        runScanBtn.textContent = \"Scanning GA4 URLs...\";\n        summaryBar.innerHTML = \"\";\n        resultsContainer.innerHTML = \"\";<\/p>\n<p>        try {\n            const response = await fetch(\"https:\/\/analyticsdata.googleapis.com\/v1beta\/properties\/\" + propertyId + \":runReport\", {\n                method: \"POST\",\n                headers: {\n                    \"Authorization\": \"Bearer \" + accessToken,\n                    \"Content-Type\": \"application\/json\"\n                },\n                body: JSON.stringify({\n                    dateRanges: [{ startDate: dateRange, endDate: \"today\" }],\n                    dimensions: [{ name: \"pageLocation\" }],\n                    metrics: [{ name: \"screenPageViews\" }],\n                    limit: 10000\n                })\n            });<\/p>\n<p>            if (!response.ok) {\n                const errJson = await response.json().catch(() => ({}));\n                const errMsg = errJson.error ? errJson.error.message : response.statusText;\n                throw new Error(errMsg);\n            }<\/p>\n<p>            const data = await response.json();\n            const rows = data.rows || [];\n            const totalUrlsChecked = rows.length;<\/p>\n<p>            const violations = [];<\/p>\n<p>            rows.forEach(row => {\n                const url = row.dimensionValues[0].value;\n                const pageviews = Number(row.metricValues[0].value || 0);\n                const detectedPII = scanUrlForPII(url);<\/p>\n<p>                if (detectedPII.length > 0) {\n                    violations.push({\n                        url: url,\n                        pageviews: pageviews,\n                        findings: detectedPII\n                    });\n                }\n            });<\/p>\n<p>            \/\/ 4. RENDER SUMMARY & VIOLATIONS\n            summaryBar.innerHTML = [\n                \"<\/p>\n<div style='background:var(--bg-body); padding:16px 20px; border-radius:8px; border:1px solid var(--border); display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:15px;'>\",\n                \"  <\/p>\n<div>\",\n                \"    <span style='color:var(--text-secondary); font-size:0.85rem; display:block;'>Total GA4 URLs Scanned<\/span>\",\n                \"    <strong style='color:var(--accent); font-size:1.4rem;'>\" + totalUrlsChecked.toLocaleString() + \" pages<\/strong>\",\n                \"  <\/div>\n<p>\",\n                \"  <\/p>\n<div>\",\n                \"    <span style='color:var(--text-secondary); font-size:0.85rem; display:block;'>PII Violations Detected<\/span>\",\n                \"    <strong style='color:\" + (violations.length > 0 ? \"#ff6b6b\" : \"#51cf66\") + \"; font-size:1.4rem;'>\" + violations.length.toLocaleString() + \" URLs<\/strong>\",\n                \"  <\/div>\n<p>\",\n                \"  <\/p>\n<div>\",\n                \"    <span style='color:var(--text-secondary); font-size:0.85rem; display:block;'>Date Range<\/span>\",\n                \"    <strong style='color:var(--text-primary); font-size:1rem;'>\" + dateRange + \" &rarr; today<\/strong>\",\n                \"  <\/div>\n<p>\",\n                \"<\/p><\/div>\n<p>\"\n            ].join(\"\");<\/p>\n<p>            if (violations.length === 0) {\n                resultsContainer.innerHTML = \"<\/p>\n<div style='background:var(--bg-body); padding:30px; border-radius:8px; border:1px solid var(--border); text-align:center; color:#51cf66; font-weight:bold; font-size:1.1rem;'>\u2714 Clean Property: Zero PII violations detected across all \" + totalUrlsChecked + \" URLs!<\/div>\n<p>\";\n                return;\n            }<\/p>\n<p>            \/\/ Sort violations by highest screenPageViews\n            violations.sort((a, b) => b.pageviews - a.pageviews);<\/p>\n<p>            const cardsHtml = violations.map(v => {\n                const findingsHtml = v.findings.map(f => [\n                    \"<\/p>\n<div style='background:#0b1114; border:1px solid var(--border); padding:10px 14px; border-radius:6px; margin-top:8px; display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:10px; font-family:monospace; font-size:0.85rem;'>\",\n                    \"  <\/p>\n<div>\",\n                    \"    <span style='color:var(--text-secondary);'>Parameter Key: <\/span><strong style='color:#ff922b;'>\" + esc(f.paramKey) + \"<\/strong>\",\n                    \"  <\/div>\n<p>\",\n                    \"  <\/p>\n<div>\",\n                    \"    <span style='color:var(--text-secondary);'>Detected Value: <\/span><code style='color:#ff6b6b; background:rgba(255,107,107,0.1); padding:2px 6px; border-radius:4px;'>\" + esc(f.paramValue) + \"<\/code>\",\n                    \"  <\/div>\n<p>\",\n                    \"  <\/p>\n<div>\" + getBadge(f.type) + \"<\/div>\n<p>\",\n                    \"<\/p><\/div>\n<p>\"\n                ].join(\"\")).join(\"\");<\/p>\n<p>                return [\n                    \"<\/p>\n<div style='background:var(--bg-body); border:1px solid var(--border); border-radius:8px; padding:18px; margin-bottom:15px;'>\",\n                    \"  <\/p>\n<div style='display:flex; justify-content:space-between; align-items:flex-start; flex-wrap:wrap; gap:10px; border-bottom:1px solid var(--border); padding-bottom:12px; margin-bottom:12px;'>\",\n                    \"    <\/p>\n<div style='word-break:break-all; flex:1; min-width:280px;'>\",\n                    \"      <strong style='color:var(--text-primary); font-family:monospace; font-size:0.9rem; line-height:1.4;'>\" + esc(v.url) + \"<\/strong>\",\n                    \"    <\/div>\n<p>\",\n                    \"    <\/p>\n<div style='white-space:nowrap; background:rgba(43,166,223,0.1); border:1px solid rgba(43,166,223,0.3); padding:4px 12px; border-radius:20px; font-size:0.8rem; color:var(--accent); font-weight:700;'>\",\n                    \"      \" + v.pageviews.toLocaleString() + \" pageviews\",\n                    \"    <\/div>\n<p>\",\n                    \"  <\/p><\/div>\n<p>\",\n                    \"  <\/p>\n<div style='color:var(--text-secondary); font-size:0.85rem; font-weight:600;'>Detected PII Parameters:<\/div>\n<p>\",\n                    \"  \" + findingsHtml,\n                    \"<\/p><\/div>\n<p>\"\n                ].join(\"\");\n            }).join(\"\");<\/p>\n<p>            resultsContainer.innerHTML = [\n                \"<\/p>\n<h3 style='color:var(--text-primary); margin-bottom:15px; font-size:1.15rem;'>PII Violations Breakdown (\" + violations.length + \")<\/h3>\n<p>\",\n                cardsHtml\n            ].join(\"\");<\/p>\n<p>        } catch (e) {\n            resultsContainer.innerHTML = \"<\/p>\n<div style='background:var(--bg-body); padding:25px; border-radius:8px; border:1px solid #ff6b6b; color:#ff6b6b; font-weight:bold;'>API Error: \" + esc(e.message) + \"<\/div>\n<p>\";\n        } finally {\n            runScanBtn.disabled = false;\n            runScanBtn.textContent = \"Scan Page Reports for PII\";\n        }\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Scan the page reports of a GA4 property via the Analytics Data API for personally identifiable information in URL parameters.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[91279,91258],"class_list":["post-8814","page","type-page","status-publish","hentry","tag-prywatnosc-danych-pl","tag-google-analytics-4"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>GA4 PII Checker - Lukas Wojcik - Blog<\/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:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-pii-checker\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GA4 PII Checker - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Scan the page reports of a GA4 property via the Analytics Data API for personally identifiable information in URL parameters.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-pii-checker\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-28T15:04:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-pii-checker\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-pii-checker\\\/\",\"name\":\"GA4 PII Checker - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-05T13:36:42+00:00\",\"dateModified\":\"2026-08-28T15:04:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-pii-checker\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-pii-checker\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-pii-checker\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"GA4 PII Checker\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"GA4 PII Checker - Lukas Wojcik - Blog","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:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-pii-checker\/","og_locale":"en_US","og_type":"article","og_title":"GA4 PII Checker - Lukas Wojcik - Blog","og_description":"Scan the page reports of a GA4 property via the Analytics Data API for personally identifiable information in URL parameters.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-pii-checker\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-08-28T15:04:53+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-pii-checker\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-pii-checker\/","name":"GA4 PII Checker - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-05T13:36:42+00:00","dateModified":"2026-08-28T15:04:53+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-pii-checker\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-pii-checker\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-pii-checker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"GA4 PII Checker"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/8814","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=8814"}],"version-history":[{"count":6,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/8814\/revisions"}],"predecessor-version":[{"id":13188,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/8814\/revisions\/13188"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=8814"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=8814"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}