{"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-05T18:35:07","modified_gmt":"2026-08-05T16:35:07","slug":"ga4-pii-checker","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/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<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 your 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 your 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: #0b1114; border: none; padding: 11px 22px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Authorize with Google<\/button>\n            <\/div>\n<\/p><\/div>\n<div 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: #0b1114; 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 id=\"scan-summary-bar\" style=\"margin-bottom: 20px;\"><\/div>\n<p>    <!-- PII VIOLATIONS RESULTS --><\/p>\n<div 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>Normalize user contact data and simulate Event ID deduplication payloads for Meta and TikTok CAPI.<\/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":""},"class_list":["post-8814","page","type-page","status-publish","hentry"],"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\/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=\"Normalize user contact data and simulate Event ID deduplication payloads for Meta and TikTok CAPI.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/ga4-pii-checker\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-05T16:35:07+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox\\\/ga4-pii-checker\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/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-05T16:35:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox\\\/ga4-pii-checker\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox\\\/ga4-pii-checker\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/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\":\"luky\",\"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\":\"luky\"},\"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\/toolbox\/ga4-pii-checker\/","og_locale":"en_US","og_type":"article","og_title":"GA4 PII Checker - Lukas Wojcik - Blog","og_description":"Normalize user contact data and simulate Event ID deduplication payloads for Meta and TikTok CAPI.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/ga4-pii-checker\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-08-05T16:35:07+00:00","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/ga4-pii-checker\/","url":"https:\/\/www.lukaswojcik.com\/blog\/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-05T16:35:07+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/ga4-pii-checker\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/toolbox\/ga4-pii-checker\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/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":"luky","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":"luky"},"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":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/8814\/revisions"}],"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"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}