{"id":20737,"date":"2026-09-27T22:44:11","date_gmt":"2026-09-27T20:44:11","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/ga4-property-configuration-comparator\/"},"modified":"2026-09-27T22:44:11","modified_gmt":"2026-09-27T20:44:11","slug":"ga4-property-configuration-comparator","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-property-configuration-comparator\/","title":{"rendered":"GA4 Property Configuration &#038; Snapshot Comparator"},"content":{"rendered":"<link rel=\"stylesheet\" href=\"\/blog\/wp-content\/themes\/lw-theme\/js\/analytics-workbench.css?v=20260927a\">\n<h2>Configuration comparison<\/h2>\n<p>Read a defined set of GA4 settings and compare two properties or two locally saved snapshots. The tool requests read-only access and never changes a setting. Saved files remain useful without a Google login.<\/p>\n<div id=\"lw-analytics-workbench\" data-kind=\"config\" data-rc-private data-mp-mask><\/div>\n<p><script type=\"application\/json\" id=\"lw-analytics-config\">{\"client\": \"Public OAuth Web client ID\", \"quota\": \"Quota project ID (optional)\", \"loadLogin\": \"Load Google login\", \"login\": \"Sign in with Google\", \"disconnect\": \"Disconnect and clear\", \"clear\": \"Clear local data\", \"cancel\": \"Cancel\", \"loading\": \"Loading\u2026\", \"done\": \"Completed.\", \"loginReady\": \"Login loaded. Click Sign in with Google.\", \"loginWaiting\": \"Waiting for Google. Allow popups or use a regular browser tab.\", \"connected\": \"Connected with read-only access.\", \"disconnected\": \"Local results cleared; Google permission remains until revoked in the Google account.\", \"popup\": \"Google login was closed or blocked.\", \"authError\": \"Login missing, expired or permission not granted.\", \"clientInvalid\": \"A Web application client ID is required, not a project ID or secret.\", \"setupTitle\": \"OAuth setup and limits\", \"setup\": \"The prefilled client can be replaced. An own Web application client requires https:\/\/www.lukaswojcik.com as an authorized JavaScript origin, the Analytics Data API and Admin API, a configured consent screen and any required test-user or verification setup. Only analytics.readonly is requested. No cloud-platform permission, client secret or AI service is used. API access remains subject to Google permissions and quotas. Cancellation stops waiting locally; an accepted Google request may still run.\", \"privacyOAuth\": \"Login loads on click. Tokens and results stay in tab memory; API calls go directly to Google. No report data or tokens go to this website\u2019s server. Tracking, session replay and chat are disabled on this tool page. Normal page-access logs remain. Saving a snapshot or CSV creates a local download.\", \"property\": \"Numeric GA4 property ID\", \"start\": \"Start date\", \"end\": \"End date\", \"loadProperties\": \"Load properties\", \"choose\": \"Choose\u2026\", \"demo\": \"Try invented example\", \"demoTitle\": \"Invented example\", \"demoNotice\": \"Example data only. No Google request was sent.\", \"auditRun\": \"Audit acquisition data\", \"auditSummary\": \"Sum of reported session values\", \"auditLimits\": \"The percentage uses the sum of the returned rows, not a separate property total. Up to 50,000 rows; incomplete pagination is rejected. Sampling, thresholding and (other) can hide detail: inspect the metadata. Case and whitespace variants are review candidates, not proof of a tracking error. (not set) alone does not prove missing consent or lost UTMs. No historical data is changed.\", \"source\": \"Source\", \"medium\": \"Medium\", \"campaign\": \"Campaign\", \"channel\": \"Channel\", \"sessions\": \"Sessions\", \"findings\": \"Review flags\", \"noFlag\": \"No rule matched\", \"unassigned\": \"Unassigned channel\", \"notSet\": \"Contains (not set)\", \"other\": \"Aggregated (other) row\", \"variant0\": \"Source variants\", \"variant1\": \"Medium variants\", \"variant2\": \"Campaign variants\", \"spaces0\": \"Source whitespace\", \"spaces1\": \"Medium whitespace\", \"spaces2\": \"Campaign whitespace\", \"metadata\": \"API metadata and quota\", \"export\": \"Download full comparison CSV\", \"previewLimit\": \"Preview limited to 500 rows; download contains all rows.\", \"snapshotA\": \"Snapshot A \u00b7 before \/ reference\", \"snapshotB\": \"Snapshot B \u00b7 after \/ comparison\", \"capture\": \"Read configuration\", \"saveSnapshot\": \"Save snapshot JSON\", \"loadSnapshot\": \"Load local snapshot JSON\", \"needSnapshots\": \"Two valid snapshots are required.\", \"compare\": \"Compare\", \"differences\": \"Different fields\", \"setting\": \"Setting\", \"before\": \"A \u00b7 before\", \"after\": \"B \u00b7 after\", \"status\": \"Status\", \"added\": \"Added\", \"removed\": \"Removed\", \"changed\": \"Changed\", \"configScope\": \"Compare two properties or two saved points in time. Coverage: property name, timezone, currency, industry and service level; event retention; stream names, types and website\/app identifiers; custom dimensions\/metrics; key events. No API secrets are requested or exported.\", \"configLimits\": \"A snapshot covers only the listed fields and is not a full backup or change history. Resource IDs, creation times and measurement IDs are excluded. Streams are matched by type and name, custom definitions by scope and parameter, key events by event name. Renaming a matching key appears as removal plus addition. Failed API reads do not produce a partial snapshot. Zero differences apply only to this scope.\", \"privacyCSV\": \"Files are read only in this browser, without login or upload. No CSV data goes to Google or this website\u2019s server. Tracking, session replay and chat are disabled here; normal page-access logs remain. Downloads are local files.\", \"csvContract\": \"Each file needs one row per order, an order ID, an amount and a three-letter currency code. Up to 5 MB and 20,000 data rows per file. Choose delimiter and decimal mark separately for each file. No thousands separators. IDs remain exact text, including leading zeros; surrounding whitespace is rejected. Amounts use exact decimal arithmetic.\", \"delimiter\": \"Field separator\", \"decimal\": \"Decimal mark in this file\", \"precision\": \"Decimal places (0, 2 or 3)\", \"tolerance\": \"Tolerance per order (dot decimal)\", \"comma\": \"Comma\", \"semicolon\": \"Semicolon\", \"shopFile\": \"Shop CSV\", \"analyticsFile\": \"Analytics CSV\", \"csvFile\": \"Local CSV file\", \"orderId\": \"Order ID\", \"amount\": \"Amount\", \"currency\": \"Currency\", \"rows\": \"data rows\", \"confirmBasis\": \"Both files use the same period, timezone and amount definition (tax, shipping, refunds). One row represents one order.\", \"csvLimits\": \"Duplicates are flagged, never silently added together. A currency mismatch is not converted. Negative amounts are allowed but must follow the agreed refund definition; this tool cannot infer it. Missing orders do not by themselves prove broken tracking. Delta = Analytics minus shop. Equal means equal within the selected tolerance; it is not an audit of completeness. Exported CSV cells are protected against spreadsheet formulas.\", \"results\": \"Results\", \"shop\": \"Shop amount\", \"analytics\": \"Analytics amount\", \"shopCurrency\": \"Shop currency\", \"analyticsCurrency\": \"Analytics currency\", \"delta\": \"Difference\", \"shopRows\": \"Shop rows\", \"analyticsRows\": \"Analytics rows\", \"equal\": \"Equal within tolerance\", \"different\": \"Amount differs\", \"duplicate\": \"Duplicate ID\", \"shopOnly\": \"Only in shop\", \"analyticsOnly\": \"Only in Analytics\", \"currencyMismatch\": \"Currency differs\", \"reloadCSV\": \"Separator changed; reload this CSV file.\", \"cancelled\": \"Cancelled or timed out. No automatic retry.\", \"error\": \"Could not process the data. Check file format, permissions and API availability.\", \"errors\": {\"date\": \"Use valid dates with start no later than end.\", \"property\": \"Use a numeric property ID, not a G- measurement ID.\", \"schema\": \"Unexpected or incomplete response schema. No result produced.\", \"duplicate\": \"Duplicate matching keys; no reliable comparison is possible.\", \"number\": \"Invalid number, excessive decimals or thousands separators. Tolerance uses a dot.\", \"snapshot\": \"Invalid snapshot format, unknown version or ambiguous keys.\", \"limit\": \"Row limit exceeded or pagination changed. No partial result is presented.\", \"size\": \"File exceeds 5 MB, 20,000 CSV rows or 100 columns.\", \"csv\": \"Invalid CSV: check separator, quoting, unique headers and column counts.\", \"empty\": \"No data rows found.\", \"mapping\": \"Assign three different columns per file.\", \"id\": \"Missing\/reserved ID, surrounding whitespace or invalid currency code.\", \"files\": \"Load both CSV files first.\", \"basis\": \"Confirm the common comparison basis first.\", \"needSnapshots\": \"Two valid snapshots are required.\", \"auth\": \"Login missing, expired or permission not granted.\", \"sdk\": \"Google login could not be loaded.\", \"quota\": \"Invalid quota project ID.\", \"http400\": \"Google rejected the request (400). Check dimensions, property and dates.\", \"http401\": \"Login missing, expired or permission not granted.\", \"http403\": \"Google denied access (403). Check enabled APIs, property permissions and quota project. A failed configuration section aborts the snapshot.\", \"http429\": \"Google quota exceeded (429). Retry later.\"}, \"cleared\": \"Local files, mappings and results cleared.\"}<\/script><script src=\"\/blog\/wp-content\/themes\/lw-theme\/js\/analytics-workbench-core.js?v=20260927a\"><\/script><script src=\"\/blog\/wp-content\/themes\/lw-theme\/js\/analytics-workbench-ui.js?v=20260927a\"><\/script><\/p>\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/config\/admin\/v1\/rest\" target=\"_blank\" rel=\"noopener noreferrer\">Google: Analytics Admin API<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/config\/admin\/v1\/rest\/v1beta\/properties\/getDataRetentionSettings\" target=\"_blank\" rel=\"noopener noreferrer\">Google: data retention settings<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/config\/admin\/v1\/rest\/v1beta\/properties.keyEvents\/list\" target=\"_blank\" rel=\"noopener noreferrer\">Google: key events<\/a><\/li>\n<\/ul>\n<section class=\"aw-reading\"><h2>Practical articles<\/h2><ul><li><a href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/key-events-and-conversions-in-ga4-two-counters-and-what-the-data-api\/\">Key Events and Conversions in GA4: Two Counters and What the Data API Release of May 2026 Shows<\/a><\/li><\/ul><\/section>\n","protected":false},"excerpt":{"rendered":"<p>Configuration comparison Read a defined set of GA4 settings and compare two properties or two locally saved snapshots. The tool requests read-only access and never changes a setting. Saved files remain useful without a Google login. Sources Google: Analytics Admin API Google: data retention settings Google: key events<\/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":[],"class_list":["post-20737","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 Property Configuration &amp; Snapshot Comparator | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Read a defined set of GA4 settings and compare two properties or two locally saved snapshots. The tool requests read-only access and never changes a setting. Saved files remain useful without a Google login.\" \/>\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-property-configuration-comparator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GA4 Property Configuration &amp; Snapshot Comparator | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Read a defined set of GA4 settings and compare two properties or two locally saved snapshots. The tool requests read-only access and never changes a setting. Saved files remain useful without a Google login.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-property-configuration-comparator\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\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<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-property-configuration-comparator\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-property-configuration-comparator\\\/\",\"name\":\"GA4 Property Configuration & Snapshot Comparator | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-27T20:44:11+00:00\",\"description\":\"Read a defined set of GA4 settings and compare two properties or two locally saved snapshots. The tool requests read-only access and never changes a setting. Saved files remain useful without a Google login.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-property-configuration-comparator\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-property-configuration-comparator\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ga4-property-configuration-comparator\\\/#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 Property Configuration &#038; Snapshot Comparator\"}]},{\"@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 Property Configuration & Snapshot Comparator | Lukas Wojcik","description":"Read a defined set of GA4 settings and compare two properties or two locally saved snapshots. The tool requests read-only access and never changes a setting. Saved files remain useful without a Google login.","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-property-configuration-comparator\/","og_locale":"en_US","og_type":"article","og_title":"GA4 Property Configuration & Snapshot Comparator | Lukas Wojcik","og_description":"Read a defined set of GA4 settings and compare two properties or two locally saved snapshots. The tool requests read-only access and never changes a setting. Saved files remain useful without a Google login.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-property-configuration-comparator\/","og_site_name":"Lukas Wojcik - Blog","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","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-property-configuration-comparator\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-property-configuration-comparator\/","name":"GA4 Property Configuration & Snapshot Comparator | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-27T20:44:11+00:00","description":"Read a defined set of GA4 settings and compare two properties or two locally saved snapshots. The tool requests read-only access and never changes a setting. Saved files remain useful without a Google login.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-property-configuration-comparator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-property-configuration-comparator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-property-configuration-comparator\/#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 Property Configuration &#038; Snapshot Comparator"}]},{"@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\/20737","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=20737"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/20737\/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=20737"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=20737"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}