{"id":10422,"date":"2026-09-17T07:20:00","date_gmt":"2026-09-17T05:20:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=10422"},"modified":"2026-10-26T11:50:53","modified_gmt":"2026-10-26T10:50:53","slug":"finding-google-tag-manager-changes-comparing-two-container-exports","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/","title":{"rendered":"Finding Google Tag Manager Changes: Comparing Two Container Exports"},"content":{"rendered":"<p>A diff is a list of differences between two files. Normalising the exports means formatting both in the same way so that layout differences do not obscure changed settings. A GTM export comparison answers several different questions: whether the files differ, whether the parsed configuration differs, and whether measurement behaves differently. These questions require different evidence. Formatting can obscure a change, but deleting fields too aggressively can hide one.<\/p>\n<p id=\"gtm-update-20261019\"><strong>Update \u2014 19.10.2026:<\/strong> The comparison&#8217;s limits now include changes to Google&#8217;s delivered runtime and the optional container optimization. <a href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/google-tag-manager-and-gtag-js-merge-what-changes-in-2026\/\">The October changes to Google tag and GTM<\/a>.<\/p>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-10422-gtmdiff-20261024.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Formatting, metadata, references and runtime are separate comparison layers.\"><figcaption>Formatting, metadata, references and runtime are separate comparison layers.<\/figcaption><\/figure>\n<h2>The comparison scope<\/h2>\n<p>Both exports need a recorded account, container, version or workspace, export time and selection scope. A partial export is not equivalent to a full export. Google documents that continuing a partial export without required dependencies can remove references to missing tags and triggers while preserving variable references.<\/p>\n<p>GTM object IDs identify entities; no general rule regenerates all IDs at each export. A fingerprint is recomputed when an entity is modified, according to the API documentation. It is not a documented timestamp or proof of a specific editor, edit time or runtime effect. These fields remain useful evidence even when a secondary view omits selected metadata.<\/p>\n<h2>Formatting without deleting values<\/h2>\n<p><code>jq -S<\/code> sorts object keys and formats JSON. It leaves array order and string contents intact; spaces inside a string remain data. The following Bash script requires jq and diff, accepts two file paths and rejects empty files, multiple documents and inputs without a containerVersion object. That shape check is not full GTM schema validation.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-comment\">#!\/usr\/bin\/env bash<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">set<\/span> <span class=\"cbb-attr\">-euo<\/span> pipefail\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">if<\/span> (( <span class=\"cbb-variable\">$#<\/span> != <span class=\"cbb-number\">2<\/span> ))<span class=\"cbb-operator\">;<\/span> <span class=\"cbb-keyword\">then<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-function\">printf<\/span> <span class=\"cbb-string\">'Usage: bash compare-gtm.sh old.json new.json\\n'<\/span> <span class=\"cbb-operator\">&gt;<\/span>&amp;<span class=\"cbb-number\">2<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">exit<\/span> <span class=\"cbb-number\">2<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">fi<\/span>\n<\/span><span class=\"cbb-line\">work_dir=<span class=\"cbb-variable\">$(<\/span>mktemp <span class=\"cbb-attr\">-d<\/span>)\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">trap<\/span> <span class=\"cbb-string\">'rm -rf -- \"$work_dir\"'<\/span> EXIT\n<\/span><span class=\"cbb-line\">normalise() {\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-function\">jq<\/span> <span class=\"cbb-attr\">-e<\/span> <span class=\"cbb-attr\">-S<\/span> <span class=\"cbb-attr\">-s<\/span> <span class=\"cbb-string\">'<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">    if length != 1 then error(\"Expected one JSON document\")<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">    elif (.&#91;0&#93; | type) != \"object\" then error(\"Expected an object\")<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">    elif (.&#91;0&#93;.containerVersion | type) != \"object\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">      then error(\"Expected a GTM container export\")<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">    else .&#91;0&#93; end<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">  '<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$1<\/span><span class=\"cbb-string\">\"<\/span>\n<\/span><span class=\"cbb-line\">}\n<\/span><span class=\"cbb-line\">normalise <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$1<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-operator\">&gt;<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$work_dir<\/span><span class=\"cbb-string\">\/old.json\"<\/span>\n<\/span><span class=\"cbb-line\">normalise <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$2<\/span><span class=\"cbb-string\">\"<\/span> <span class=\"cbb-operator\">&gt;<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$work_dir<\/span><span class=\"cbb-string\">\/new.json\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">if<\/span> diff <span class=\"cbb-attr\">-u<\/span> -- <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$work_dir<\/span><span class=\"cbb-string\">\/old.json\"<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$work_dir<\/span><span class=\"cbb-string\">\/new.json\"<\/span><span class=\"cbb-operator\">;<\/span> <span class=\"cbb-keyword\">then<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-function\">printf<\/span> <span class=\"cbb-string\">'No differences in this parsed, formatted view.\\n'<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">else<\/span>\n<\/span><span class=\"cbb-line\">  diff_status=<span class=\"cbb-variable\">$?<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">exit<\/span> <span class=\"cbb-string\">\"<\/span><span class=\"cbb-variable\">$diff_status<\/span><span class=\"cbb-string\">\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">fi<\/span><\/span><\/code><\/pre><\/figure>\n<p>Saved as <code>compare-gtm.sh<\/code>, the invocation is <code>bash compare-gtm.sh old.json new.json<\/code>. Status 0 means no difference in this view; 1 means diff found differences. A parsing or command failure is an error, not equality. The sequential temporary files ensure that normalisation succeeds before diff runs. Process substitution such as <code>diff &lt;(norm old.json) &lt;(norm new.json)<\/code> does not by itself propagate every producer failure into diff&#8217;s exit status.<\/p>\n<p>This view still includes timestamps, fingerprints and version context. That is deliberate. A secondary reduced view needs an explicit list of allowed field paths, a documented purpose and the untouched export alongside it. Recursive deletion by names such as <code>accountId<\/code> or <code>fingerprint<\/code> can remove unrelated nested data. If the reduced files are equal, only the fields still present have been compared. The removed fields may still differ.<\/p>\n<p>JSON parser behaviour also matters: duplicate object keys and very large numeric values need explicit handling. jq&#8217;s number behaviour depends on version and build. The example is not a byte-preserving archival format or a universal semantic-equivalence test.<\/p>\n<h2>Changed values as well as added keys<\/h2>\n<p>A key-set difference reports additions and removals, but misses a changed value under an existing key. This separate overview reports all three at the top level:<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-function\">jq<\/span> <span class=\"cbb-attr\">-n<\/span> <span class=\"cbb-attr\">--slurpfile<\/span> a old.json <span class=\"cbb-attr\">--slurpfile<\/span> b new.json <span class=\"cbb-string\">'<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">  if ($a|length) != 1 or ($b|length) != 1 then<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">    error(\"Expected one JSON document per file\")<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">  elif ($a&#91;0&#93;|type) != \"object\" or ($b&#91;0&#93;|type) != \"object\" then<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">    error(\"Expected objects\")<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">  else<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">    $a&#91;0&#93; as $old | $b&#91;0&#93; as $new<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">    | ($old|keys) as $ka | ($new|keys) as $kb<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">    | {removed: ($ka - $kb), added: ($kb - $ka),<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">       changed: &#91;$ka&#91;&#93; as $key<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">         | select($new|has($key))<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">         | select($old&#91;$key&#93; != $new&#91;$key&#93;) | $key&#93;}<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-string\">  end'<\/span><\/span><\/code><\/pre><\/figure>\n<p>A change deep inside a tag can appear only as <code>containerVersion<\/code> in this overview. The formatted diff or a schema-aware comparison supplies the detail. String <code>\"1\"<\/code> and number <code>1<\/code> are distinct values; neither display similarity nor a small character difference makes that change harmless.<\/p>\n<h2>Object identity and array order need a policy<\/h2>\n<p>Within a container, entity IDs provide useful correspondence across versions, but deletion and recreation or import can create a different entity. Across containers, IDs and context cannot simply be erased. Matching by name requires an unambiguous mapping and explicit handling of renames, duplicates and unresolved references.<\/p>\n<p>The mapping must preserve firing and blocking trigger references, folder references, tag sequencing, templates and other relevant relationships. Setup and teardown references use tag names in the documented API. Variable references often use <code>{{name}}<\/code>; that does not make a global textual substitution or a trigger-only mapping complete. Built-in trigger identifiers require explicit supported handling, not blind lookup in the exported trigger list.<\/p>\n<p><code>jq -S<\/code> does not sort arrays. Sorting entity lists can improve a separate review view when identity is established. Sorting arbitrary nested arrays can alter meaning, including ordered table rows. Keeping all arrays untouched in the first view avoids silently making that choice.<\/p>\n\n\n<!-- lw-flux-illu 10422-a4 -->\n<figure class=\"lw-illu\"><img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/illustrationen\/flux-10422-a4.webp\" width=\"1120\" height=\"630\" loading=\"lazy\" decoding=\"async\" alt=\"Two strings of bunting carry the same flags in a different order, with fine threads linking each pair. Likewise, comparing two lists means matching up the same objects rather than comparing line by line.\"><figcaption>Two strings of bunting carry the same flags in a different order, with fine threads linking each pair. Likewise, comparing two lists means matching up the same objects rather than comparing line by line.<\/figcaption><\/figure>\n\n\n<h2>Text differences do not establish runtime effects<\/h2>\n<p>Line, word and character views offer different levels of detail. A line diff can establish text equality and show type-changing punctuation. Some tools also detect moves. The diff shows what changed, but usually cannot explain why it changed or how the change affects measurement.<\/p>\n<p>Identical JSON does not establish identical measurement. Google&#8217;s release notes of 8 October 2026 describe container-load initialization and visible <code>gtag.config<\/code> events that may match broad Custom Event triggers. The optional optimization announced on 12 October also involves centralized settings and destination tags. Preview checks execution, network inspection checks requests, and destination-side reports check processing; a browser request alone proves neither correct attribution nor final reporting. Permissions are not versioned and need a separate record.<\/p>\n<div class=\"lw-faq\"><h2>Questions and answers<\/h2>\n<h3>Does a normalized file replace the original export?<\/h3><p>No. Untouched exports provide the restoration and audit basis. A reduced comparison file is not automatically importable or complete. Exports may contain configuration values, code and sensitive identifiers, so repository access and redaction require appropriate handling.<\/p>\n<h3>Does Windows always change every line ending?<\/h3><p>No. Editor settings and Git attributes determine that behaviour. <code>*.json text eol=lf<\/code> selects LF for matching text files in Git&#8217;s working tree. Existing tracked content may need a reviewed renormalization; the setting does not remove whitespace inside JSON strings.<\/p>\n<h3>Can a diff identify who made the change?<\/h3><p>The exported values alone do not establish authorship. Version history, workspace records and retained audit evidence provide the necessary context. A fingerprint does not replace those records.<\/p><\/div>\n\n<div id=\"gtm-related-links-20261020\" class=\"lw-gtm-related\" style=\"margin:20px 0;color:var(--text-secondary);line-height:1.6;\"><p><strong>Related guides and tools:<\/strong><\/p><ul><li><a href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/tutorials\/finding-changes-to-a-gtm-tag-comparing-saved-and-published-versions\/\">Finding the version where a tag changed<\/a> \u2013 version archives, fingerprints and the limits of historical evidence.<\/li>\n<li><a href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/gtm-duplicates-analyser\/\">GTM Duplicates Analyser<\/a> \u2013 candidates with matching selected configuration fields.<\/li><\/ul><\/div>\n<div class=\"lw-quellen\"><h2>Sources<\/h2><ul><li><a href=\"https:\/\/support.google.com\/tagmanager\/answer\/6106997?hl=en\" target=\"_blank\" rel=\"noopener noreferrer\">Google Tag Manager: Container export and import<\/a><\/li><li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/reference\/rest\/v2\/accounts.containers.workspaces.tags\" target=\"_blank\" rel=\"noopener noreferrer\">Google Tag Manager API: Tags and references<\/a><\/li><li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/api\/reference\/rest\/v2\/accounts.containers.versions\" target=\"_blank\" rel=\"noopener noreferrer\">Google Tag Manager API: Container versions<\/a><\/li><li><a href=\"https:\/\/jqlang.org\/manual\/\" target=\"_blank\" rel=\"noopener noreferrer\">jq: Manual<\/a><\/li><li><a href=\"https:\/\/git-scm.com\/docs\/gitattributes\" target=\"_blank\" rel=\"noopener noreferrer\">Git: Attributes and line endings<\/a><\/li><li><a href=\"https:\/\/support.google.com\/tagmanager\/answer\/4620708?hl=en\" target=\"_blank\" rel=\"noopener noreferrer\">Google Tag Manager: Release notes<\/a><\/li><li><a href=\"https:\/\/support.google.com\/tagmanager\/answer\/17079602?hl=en\" target=\"_blank\" rel=\"noopener noreferrer\">Google: Updates to Google tag and Tag Manager<\/a><\/li><li><a href=\"https:\/\/support.google.com\/analytics\/answer\/16659369\" target=\"_blank\" rel=\"noopener noreferrer\">Google: Optimize a Tag Manager container<\/a><\/li><li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/web\" target=\"_blank\" rel=\"noopener noreferrer\">Tag Manager for web<\/a><\/li><li><a href=\"https:\/\/docs.docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker documentation<\/a><\/li><li><a href=\"https:\/\/support.google.com\/tagmanager\/answer\/17231523?hl=en\" target=\"_blank\" rel=\"noopener noreferrer\">Google tag: supported installation methods<\/a><\/li><li><a href=\"https:\/\/support.google.com\/tagmanager\/answer\/15756616?hl=en\" target=\"_blank\" rel=\"noopener noreferrer\">Google tag in Tag Manager: setup and initialization<\/a><\/li><\/ul><\/div>","protected":false},"excerpt":{"rendered":"<p>A reliable GTM export comparison starts with consistent formatting and a clear scope. IDs, dependencies and array order need careful handling, while runtime changes require evidence beyond the JSON diff.<\/p>\n","protected":false},"author":1,"featured_media":30777,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[148],"tags":[91144],"class_list":["post-10422","post","type-post","status-publish","format-standard","hentry","category-web-development","tag-devops"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Finding Google Tag Manager Changes: Comparing Two Container Exports | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Normalize GTM exports before a line diff. Compare configuration changes without confusing unchanged JSON with unchanged runtime behavior.\" \/>\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\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Finding Google Tag Manager Changes: Comparing Two Container Exports | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Normalize GTM exports before a line diff. Compare configuration changes without confusing unchanged JSON with unchanged runtime behavior.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-17T05:20:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T10:50:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10422.png\" \/>\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\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Normalize GTM exports before a line diff. Compare configuration changes without confusing unchanged JSON with unchanged runtime behavior.\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/finding-google-tag-manager-changes-comparing-two-container-exports\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/finding-google-tag-manager-changes-comparing-two-container-exports\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Finding Google Tag Manager Changes: Comparing Two Container Exports\",\"datePublished\":\"2026-09-17T05:20:00+00:00\",\"dateModified\":\"2026-10-26T10:50:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/finding-google-tag-manager-changes-comparing-two-container-exports\\\/\"},\"wordCount\":1042,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/finding-google-tag-manager-changes-comparing-two-container-exports\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-10422.png\",\"keywords\":[\"DevOps\"],\"articleSection\":[\"Web Development\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/finding-google-tag-manager-changes-comparing-two-container-exports\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/finding-google-tag-manager-changes-comparing-two-container-exports\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/finding-google-tag-manager-changes-comparing-two-container-exports\\\/\",\"name\":\"Finding Google Tag Manager Changes: Comparing Two Container Exports | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/finding-google-tag-manager-changes-comparing-two-container-exports\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/finding-google-tag-manager-changes-comparing-two-container-exports\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-10422.png\",\"datePublished\":\"2026-09-17T05:20:00+00:00\",\"dateModified\":\"2026-10-26T10:50:53+00:00\",\"description\":\"Normalize GTM exports before a line diff. Compare configuration changes without confusing unchanged JSON with unchanged runtime behavior.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/finding-google-tag-manager-changes-comparing-two-container-exports\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/finding-google-tag-manager-changes-comparing-two-container-exports\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/finding-google-tag-manager-changes-comparing-two-container-exports\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-10422.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-10422.png\",\"width\":1200,\"height\":630,\"caption\":\"Finding Google Tag Manager Changes: Comparing Two Container Exports\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/web-development\\\/finding-google-tag-manager-changes-comparing-two-container-exports\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Finding Google Tag Manager Changes: Comparing Two Container Exports\"}]},{\"@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":"Finding Google Tag Manager Changes: Comparing Two Container Exports | Lukas Wojcik","description":"Normalize GTM exports before a line diff. Compare configuration changes without confusing unchanged JSON with unchanged runtime behavior.","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\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/","og_locale":"en_US","og_type":"article","og_title":"Finding Google Tag Manager Changes: Comparing Two Container Exports | Lukas Wojcik","og_description":"Normalize GTM exports before a line diff. Compare configuration changes without confusing unchanged JSON with unchanged runtime behavior.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-17T05:20:00+00:00","article_modified_time":"2026-10-26T10:50:53+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10422.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_description":"Normalize GTM exports before a line diff. Compare configuration changes without confusing unchanged JSON with unchanged runtime behavior.","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Finding Google Tag Manager Changes: Comparing Two Container Exports","datePublished":"2026-09-17T05:20:00+00:00","dateModified":"2026-10-26T10:50:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/"},"wordCount":1042,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10422.png","keywords":["DevOps"],"articleSection":["Web Development"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/","name":"Finding Google Tag Manager Changes: Comparing Two Container Exports | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10422.png","datePublished":"2026-09-17T05:20:00+00:00","dateModified":"2026-10-26T10:50:53+00:00","description":"Normalize GTM exports before a line diff. Compare configuration changes without confusing unchanged JSON with unchanged runtime behavior.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10422.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10422.png","width":1200,"height":630,"caption":"Finding Google Tag Manager Changes: Comparing Two Container Exports"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/web-development\/finding-google-tag-manager-changes-comparing-two-container-exports\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Finding Google Tag Manager Changes: Comparing Two Container Exports"}]},{"@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\/posts\/10422","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"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=10422"}],"version-history":[{"count":10,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10422\/revisions"}],"predecessor-version":[{"id":27580,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10422\/revisions\/27580"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/30777"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10422"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=10422"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10422"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}