diff --git a/env.template b/env.template
index d56808c08..a481221ab 100644
--- a/env.template
+++ b/env.template
@@ -14,4 +14,5 @@ GATSBY_TURNSTILE_SITE_KEY=
GATSBY_TURNSTILE_SECRET_KEY=
GATSBY_TURNSTILE_API_URL=https://challenges.cloudflare.com/turnstile/v0/siteverify
GATSBY_ELECTION_SINCE_YEAR=
-GATSBY_ELECTION_TO_SHOW=
\ No newline at end of file
+GATSBY_ELECTION_TO_SHOW=
+GOOGLE_TAGMANAGER_ID=
diff --git a/gatsby-browser.js b/gatsby-browser.js
index 8cc15e1ee..e3827da7e 100644
--- a/gatsby-browser.js
+++ b/gatsby-browser.js
@@ -1,6 +1,13 @@
import { browserWrapper } from "./src/state/ReduxWrapper"
+import CookieManager from "./src/utils/cookies/CookieManager";
+import KlaroProvider from "./src/utils/cookies/providers/KlaroProvider";
+import cookieServices from "./src/utils/cookies/services";
+import TagManager from "./src/utils/tag-manager/TagManager";
+import GoogleTagManagerProvider from "./src/utils/tag-manager/providers/GoogleTagManagerProvider";
+import smoothscroll from 'smoothscroll-polyfill'
+
// @see wrapRootElement
export const wrapRootElement = browserWrapper;
@@ -12,4 +19,21 @@ window.SPONSORED_PROJECT_ID = process.env.GATSBY_SPONSORED_PROJECT_ID
export const onRouteUpdate = ({ location, prevLocation }) => {
-}
\ No newline at end of file
+}
+
+export const onClientEntry = () => {
+ // var set at document level
+ // prevents widget color flashing from defaults to fetched by widget from marketing api
+ // smooth scroll polyfill needed for Safari
+ smoothscroll.polyfill();
+
+ // Initialize TagManager and add GoogleTagManagerProvider
+ const tagManager = new TagManager();
+ const googleTagManagerProvider = new GoogleTagManagerProvider();
+ tagManager.addProvider(googleTagManagerProvider);
+
+ // Initialize Cookie Manager with Klaro provider
+ const klaroProvider = new KlaroProvider();
+ const cookieManager = new CookieManager(klaroProvider, cookieServices);
+ cookieManager.show();
+};
diff --git a/gatsby-config.js b/gatsby-config.js
index c3055a86a..eec15cb58 100644
--- a/gatsby-config.js
+++ b/gatsby-config.js
@@ -1,47 +1,83 @@
-module.exports = {
- flags: {
- FAST_DEV: true,
- DEV_SSR: false
- },
- siteMetadata: {
- title: "OpenInfra Foundation",
- description: "The Home of Open Infrastructure",
- url: "https://openinfra.dev/"
+const dotenv = require("dotenv");
+
+dotenv.config({
+ path: `.env`
+});
+
+const googleTagManagerPlugin = [
+ {
+ resolve: require.resolve("./plugins/gatsby-plugin-google-tagmanager"),
+ options: {
+ id: process.env.GOOGLE_TAGMANAGER_ID || "GTM-5SLZBPV",
+ // Include GTM in development.
+ //
+ // Defaults to false meaning GTM will only be loaded in production.
+ includeInDevelopment: true,
+
+ // datalayer to be set before GTM is loaded
+ // should be an object or a function that is executed in the browser
+ //
+ // Defaults to null
+ defaultDataLayer: { platform: "gatsby" },
+
+ // Specify optional GTM environment details.
+ // gtmAuth: "YOUR_GOOGLE_TAGMANAGER_ENVIRONMENT_AUTH_STRING",
+ // gtmPreview: "YOUR_GOOGLE_TAGMANAGER_ENVIRONMENT_PREVIEW_NAME",
+ // dataLayerName: "YOUR_DATA_LAYER_NAME",
+
+ // Name of the event that is triggered
+ // on every Gatsby route change.
+ //
+ // Defaults to gatsby-route-change
+ // routeChangeEventName: "YOUR_ROUTE_CHANGE_EVENT_NAME",
+
+ // Defaults to false
+ enableWebVitalsTracking: true,
+
+ // Defaults to https://www.googletagmanager.com
+ // selfHostedOrigin: "YOUR_SELF_HOSTED_ORIGIN",
+
+ // defer script tags loading to after consent is given
+ // managed by Klaro cookie manager
+ deferLoading: true
+ },
},
- plugins: [
- "gatsby-plugin-react-helmet",
- {
- /**
- * Gatsby v4 uses ES Modules for importing cssModules by default.
- * Disabling this to avoid needing to update in all files and for compatibility
- * with other plugins/packages that have not yet been updated.
- * @see https://www.gatsbyjs.com/docs/reference/release-notes/migrating-from-v2-to-v3/#css-modules-are-imported-as-es-modules
- *
- * Also, since libSass was deprecated in October 2020, the Node Sass package has also been deprecated.
- * As such, we have migrated from Node Sass to Dart Sass in package.json.
- * @see https://www.gatsbyjs.com/plugins/gatsby-plugin-sass/#v300
- * @see https://sass-lang.com/blog/libsass-is-deprecated#how-do-i-migrate
- */
- resolve: "gatsby-plugin-sass",
- options: {
- cssLoaderOptions: {
- esModule: false,
- modules: {
- namedExport: false,
- },
+];
+
+const plugins = [
+ "gatsby-plugin-react-helmet",
+ {
+ /**
+ * Gatsby v4 uses ES Modules for importing cssModules by default.
+ * Disabling this to avoid needing to update in all files and for compatibility
+ * with other plugins/packages that have not yet been updated.
+ * @see https://www.gatsbyjs.com/docs/reference/release-notes/migrating-from-v2-to-v3/#css-modules-are-imported-as-es-modules
+ *
+ * Also, since libSass was deprecated in October 2020, the Node Sass package has also been deprecated.
+ * As such, we have migrated from Node Sass to Dart Sass in package.json.
+ * @see https://www.gatsbyjs.com/plugins/gatsby-plugin-sass/#v300
+ * @see https://sass-lang.com/blog/libsass-is-deprecated#how-do-i-migrate
+ */
+ resolve: "gatsby-plugin-sass",
+ options: {
+ cssLoaderOptions: {
+ esModule: false,
+ modules: {
+ namedExport: false,
},
},
},
- {
- resolve: "gatsby-plugin-anchor-links",
- options: {
- offset: 50
- }
- },
- {
- resolve: "gatsby-plugin-feed",
- options: {
- query: `
+ },
+ {
+ resolve: "gatsby-plugin-anchor-links",
+ options: {
+ offset: 50
+ }
+ },
+ {
+ resolve: "gatsby-plugin-feed",
+ options: {
+ query: `
{
site {
siteMetadata {
@@ -51,20 +87,20 @@ module.exports = {
}
}
`,
- feeds: [
- {
- serialize: ({ query: { site, allMarkdownRemark } }) => {
- return allMarkdownRemark.edges.map(edge => {
- return Object.assign({}, edge.node.frontmatter, {
- description: edge.node.frontmatter.seo.description,
- date: edge.node.frontmatter.date,
- url: edge.node.frontmatter.seo.url,
- guid: edge.node.frontmatter.seo.url,
- custom_elements: [{ "content:encoded": edge.node.html }],
- })
+ feeds: [
+ {
+ serialize: ({ query: { site, allMarkdownRemark } }) => {
+ return allMarkdownRemark.edges.map(edge => {
+ return Object.assign({}, edge.node.frontmatter, {
+ description: edge.node.frontmatter.seo.description,
+ date: edge.node.frontmatter.date,
+ url: edge.node.frontmatter.seo.url,
+ guid: edge.node.frontmatter.seo.url,
+ custom_elements: [{ "content:encoded": edge.node.html }],
})
- },
- query: `
+ })
+ },
+ query: `
{
allMarkdownRemark(
sort: { order: DESC, fields: [frontmatter___date] },
@@ -87,238 +123,171 @@ module.exports = {
}
}
`,
- output: "/rss.xml",
- title: "OpenInfra Foundation RSS Feed",
- // optional configuration to insert feed reference in pages:
- // if `string` is used, it will be used to create RegExp and then test if pathname of
- // current page satisfied this regular expression;
- // if not provided or `undefined`, all pages will have feed reference inserted
- match: "^/blog/",
- // optional configuration to specify external rss feed, such as feedburner
- // link: "https://feeds.feedburner.com/gatsby/blog",
- },
- ],
- },
+ output: "/rss.xml",
+ title: "OpenInfra Foundation RSS Feed",
+ // optional configuration to insert feed reference in pages:
+ // if `string` is used, it will be used to create RegExp and then test if pathname of
+ // current page satisfied this regular expression;
+ // if not provided or `undefined`, all pages will have feed reference inserted
+ match: "^/blog/",
+ // optional configuration to specify external rss feed, such as feedburner
+ // link: "https://feeds.feedburner.com/gatsby/blog",
+ },
+ ],
},
- {
- // keep as first gatsby-source-filesystem plugin for gatsby image support
- resolve: "gatsby-source-filesystem",
- options: {
- path: `${__dirname}/static/img`,
- name: "uploads",
- },
+ },
+ {
+ // keep as first gatsby-source-filesystem plugin for gatsby image support
+ resolve: "gatsby-source-filesystem",
+ options: {
+ path: `${__dirname}/static/img`,
+ name: "uploads",
},
- {
- resolve: "gatsby-source-filesystem",
- options: {
- path: `${__dirname}/src/pages`,
- name: "pages",
- },
+ },
+ {
+ resolve: "gatsby-source-filesystem",
+ options: {
+ path: `${__dirname}/src/pages`,
+ name: "pages",
},
- {
- resolve: "gatsby-source-filesystem",
- options: {
- path: `${__dirname}/src/img`,
- name: "images",
- },
+ },
+ {
+ resolve: "gatsby-source-filesystem",
+ options: {
+ path: `${__dirname}/src/img`,
+ name: "images",
},
- {
- resolve: "gatsby-source-filesystem",
- options: {
- path: `${__dirname}/src/content/summits`,
- name: "summits",
- },
+ },
+ {
+ resolve: "gatsby-source-filesystem",
+ options: {
+ path: `${__dirname}/src/content/summits`,
+ name: "summits",
},
- "gatsby-transformer-json",
- "gatsby-plugin-image",
- "gatsby-plugin-sharp",
- {
- resolve: `gatsby-transformer-sharp`,
- options: {
- checkSupportedExtensions: false,
- },
+ },
+ "gatsby-transformer-json",
+ "gatsby-plugin-image",
+ "gatsby-plugin-sharp",
+ {
+ resolve: `gatsby-transformer-sharp`,
+ options: {
+ checkSupportedExtensions: false,
},
- {
- resolve: "gatsby-transformer-remark",
- options: {
- plugins: [
- {
- resolve: "gatsby-remark-relative-images",
- options: {
- name: "uploads",
- },
+ },
+ {
+ resolve: "gatsby-transformer-remark",
+ options: {
+ plugins: [
+ {
+ resolve: "gatsby-remark-relative-images",
+ options: {
+ name: "uploads",
},
- {
- resolve: "gatsby-remark-images",
- options: {
- // It's important to specify the maxWidth (in pixels) of
- // the content container as this plugin uses this as the
- // base for generating different widths of each image.
- maxWidth: 2048,
- linkImagesToOriginal: false,
- },
+ },
+ {
+ resolve: "gatsby-remark-images",
+ options: {
+ // It's important to specify the maxWidth (in pixels) of
+ // the content container as this plugin uses this as the
+ // base for generating different widths of each image.
+ maxWidth: 2048,
+ linkImagesToOriginal: false,
},
- {
- resolve: "gatsby-remark-copy-linked-files",
- options: {
- destinationDir: "static",
- },
+ },
+ {
+ resolve: "gatsby-remark-copy-linked-files",
+ options: {
+ destinationDir: "static",
},
- {
- resolve: "gatsby-remark-classes",
- options: {
- classMap: {
- "heading[depth=3]": "fix-h3",
- "heading[depth=2]": "fix-h2",
+ },
+ {
+ resolve: "gatsby-remark-classes",
+ options: {
+ classMap: {
+ "heading[depth=3]": "fix-h3",
+ "heading[depth=2]": "fix-h2",
- }
}
- },
- ],
- },
- },
- /**
- * This plugin has been deprecated.
- * Gatsby now natively supports client paths.
- * @see https://www.gatsbyjs.com/plugins/gatsby-plugin-create-client-paths/
- * @see https://www.gatsbyjs.com/docs/how-to/routing/client-only-routes-and-user-authentication/#handling-client-only-routes-with-gatsby
- */
- // {
- // resolve: `gatsby-plugin-create-client-paths`,
- // options: { prefixes: [`/auth/*`, `/a/*`, `/members/profile/*`] },
- // },
- {
- resolve: `gatsby-plugin-google-analytics`,
- options: {
- // The property ID; the tracking code won't be generated without it
- trackingId: "UA-139234657-1",
- // Defines where to place the tracking script - `true` in the head and `false` in the body
- head: true,
- // Setting this parameter is optional
- anonymize: true,
- // Setting this parameter is also optional
- respectDNT: true,
- },
- },
- {
- resolve: "gatsby-plugin-google-gtag",
- options: {
- // You can add multiple tracking ids and a pageview event will be fired for all of them.
- trackingIds: [
- "UA-139234657-1", // Google Analytics / GA,
- ],
- // This object gets passed directly to the gtag config command
- // This config will be shared across all trackingIds
- gtagConfig: {
- anonymize_ip: true,
- cookie_expires: 0,
- },
- // This object is used for configuration specific to this plugin
- pluginConfig: {
- // Puts tracking script in the head instead of the body
- head: false,
- // Setting this parameter is also optional
- respectDNT: true,
- // Avoids sending pageview hits from custom paths
- // exclude: ["/preview/**", "/do-not-track/me/too/"],
+ }
},
- },
+ ],
},
- {
- resolve: "gatsby-plugin-google-tagmanager",
- options: {
- id: "GTM-5SLZBPV",
- // Include GTM in development.
- //
- // Defaults to false meaning GTM will only be loaded in production.
- includeInDevelopment: true,
-
- // datalayer to be set before GTM is loaded
- // should be an object or a function that is executed in the browser
- //
- // Defaults to null
- defaultDataLayer: { platform: "gatsby" },
-
- // Specify optional GTM environment details.
- // gtmAuth: "YOUR_GOOGLE_TAGMANAGER_ENVIRONMENT_AUTH_STRING",
- // gtmPreview: "YOUR_GOOGLE_TAGMANAGER_ENVIRONMENT_PREVIEW_NAME",
- // dataLayerName: "YOUR_DATA_LAYER_NAME",
-
- // Name of the event that is triggered
- // on every Gatsby route change.
- //
- // Defaults to gatsby-route-change
- // routeChangeEventName: "YOUR_ROUTE_CHANGE_EVENT_NAME",
-
- // Defaults to false
- enableWebVitalsTracking: true,
-
- // Defaults to https://www.googletagmanager.com
- // selfHostedOrigin: "YOUR_SELF_HOSTED_ORIGIN",
- },
+ },
+ {
+ resolve: `gatsby-plugin-manifest`,
+ options: {
+ name: `Open Infrastructure Foundation`,
+ short_name: `Open Infrastructure Foundation`,
+ start_url: `/`,
+ background_color: `#ffffff`,
+ theme_color: `#f15b3e`,
+ icon: `src/img/icon.png`,
+ display: `standalone`,
},
- {
- resolve: `gatsby-plugin-manifest`,
- options: {
- name: `Open Infrastructure Foundation`,
- short_name: `Open Infrastructure Foundation`,
- start_url: `/`,
- background_color: `#ffffff`,
- theme_color: `#f15b3e`,
- icon: `src/img/icon.png`,
- display: `standalone`,
- },
+ },
+ "gatsby-plugin-remove-serviceworker",
+ {
+ resolve: "gatsby-plugin-netlify-cms",
+ options: {
+ modulePath: `${__dirname}/src/cms/cms.js`,
+ // @see https://github.com/netlify/netlify-cms/issues/1690#issuecomment-465078677
+ enableIdentityWidget: false,
+ /**
+ * Fixes Module not found: Error: Can't resolve "path" bug.
+ * Webpack 5 doesn't include browser polyfills for node APIs by default anymore,
+ * so we need to provide them ourselves.
+ * @see https://github.com/postcss/postcss/issues/1509#issuecomment-772097567
+ * @see https://github.com/gatsbyjs/gatsby/issues/31475
+ * @see https://github.com/gatsbyjs/gatsby/issues/31179#issuecomment-844588682
+ */
+ customizeWebpackConfig: (config) => {
+ config.resolve = {
+ ...config.resolve,
+ fallback: {
+ ...config.resolve.fallback,
+ path: require.resolve("path-browserify")
+ }
+ };
+ }
},
- "gatsby-plugin-remove-serviceworker",
- {
- resolve: "gatsby-plugin-netlify-cms",
- options: {
- modulePath: `${__dirname}/src/cms/cms.js`,
- // @see https://github.com/netlify/netlify-cms/issues/1690#issuecomment-465078677
- enableIdentityWidget: false,
- /**
- * Fixes Module not found: Error: Can't resolve "path" bug.
- * Webpack 5 doesn't include browser polyfills for node APIs by default anymore,
- * so we need to provide them ourselves.
- * @see https://github.com/postcss/postcss/issues/1509#issuecomment-772097567
- * @see https://github.com/gatsbyjs/gatsby/issues/31475
- * @see https://github.com/gatsbyjs/gatsby/issues/31179#issuecomment-844588682
- */
- customizeWebpackConfig: (config) => {
- config.resolve = {
- ...config.resolve,
- fallback: {
- ...config.resolve.fallback,
- path: require.resolve("path-browserify")
- }
- };
- }
- },
+ },
+ {
+ resolve: "gatsby-plugin-purgecss", // purges all unused/unreferenced css rules
+ options: {
+ develop: true, // Activates purging in npm run develop
+ whitelistPatterns: [/^carousel/, /^projects-s/, /^company-level-/, /^more-recent-single-/, /^fa/, /^logo-/, /^modal/],
+ purgeOnly: ["/style"], // applies purging only on the bulma css file
},
- {
- resolve: "gatsby-plugin-purgecss", // purges all unused/unreferenced css rules
- options: {
- develop: true, // Activates purging in npm run develop
- whitelistPatterns: [/^carousel/, /^projects-s/, /^company-level-/, /^more-recent-single-/, /^fa/, /^logo-/, /^modal/],
- purgeOnly: ["/style"], // applies purging only on the bulma css file
- },
- }, // must be after other CSS plugins
- {
- resolve: "gatsby-plugin-linkedin-insight",
- options: {
- partnerId: "2906612",
+ }, // must be after other CSS plugins
+ {
+ resolve: "gatsby-plugin-linkedin-insight",
+ options: {
+ partnerId: "2906612",
- // Include LinkedIn Insight in development.
- // Defaults to false meaning LinkedIn Insight will only be loaded in production.
- includeInDevelopment: true
- }
- },
- {
- resolve: 'gatsby-plugin-turnstile',
- options: {
- siteKey: `${process.env.GATSBY_TURNSTILE_SITE_KEY}`,
- },
+ // Include LinkedIn Insight in development.
+ // Defaults to false meaning LinkedIn Insight will only be loaded in production.
+ includeInDevelopment: true
+ }
+ },
+ ...googleTagManagerPlugin,
+ {
+ resolve: 'gatsby-plugin-turnstile',
+ options: {
+ siteKey: `${process.env.GATSBY_TURNSTILE_SITE_KEY}`,
},
- "gatsby-plugin-netlify", // make sure to keep it last in the array
- ],
+ },
+ "gatsby-plugin-netlify", // make sure to keep it last in the array
+];
+
+module.exports = {
+ flags: {
+ FAST_DEV: true,
+ DEV_SSR: false
+ },
+ siteMetadata: {
+ title: "OpenInfra Foundation",
+ description: "The Home of Open Infrastructure",
+ url: "https://openinfra.dev/"
+ },
+ plugins,
}
diff --git a/package.json b/package.json
index bee69ee13..41cfae39f 100644
--- a/package.json
+++ b/package.json
@@ -26,8 +26,6 @@
"gatsby-plugin-anchor-links": "^1.2.1",
"gatsby-plugin-feed": "^4.24.0",
"gatsby-plugin-google-analytics": "^4.24.0",
- "gatsby-plugin-google-gtag": "^4.24.0",
- "gatsby-plugin-google-tagmanager": "^4.24.0",
"gatsby-plugin-image": "^2.10.1",
"gatsby-plugin-linkedin-insight": "^1.0.1",
"gatsby-plugin-manifest": "^4.24.0",
@@ -57,6 +55,7 @@
"immutability-helper": "2.9.1",
"immutable": "^3.7.6",
"jsdom": "^16.2.2",
+ "klaro": "^0.7.21",
"lodash": "^4.17.19",
"markdown-it": "^12.0.4",
"moment": "^2.27.0",
diff --git a/plugins/gatsby-plugin-google-tagmanager/.babelrc b/plugins/gatsby-plugin-google-tagmanager/.babelrc
new file mode 100644
index 000000000..7094b00b6
--- /dev/null
+++ b/plugins/gatsby-plugin-google-tagmanager/.babelrc
@@ -0,0 +1,9 @@
+{
+ "presets": [["babel-preset-gatsby-package"]],
+ "overrides": [
+ {
+ "test": ["**/gatsby-browser.js"],
+ "presets": [["babel-preset-gatsby-package", { "browser": true, "esm": true }]]
+ }
+ ]
+}
diff --git a/plugins/gatsby-plugin-google-tagmanager/CHANGELOG.md b/plugins/gatsby-plugin-google-tagmanager/CHANGELOG.md
new file mode 100644
index 000000000..8e0ac18c8
--- /dev/null
+++ b/plugins/gatsby-plugin-google-tagmanager/CHANGELOG.md
@@ -0,0 +1,793 @@
+# Changelog: `gatsby-plugin-google-tagmanager`
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+### [5.12.3](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.12.3/packages/gatsby-plugin-google-tagmanager) (2023-10-26)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+### [5.12.2](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.12.2/packages/gatsby-plugin-google-tagmanager) (2023-10-20)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+### [5.12.1](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.12.1/packages/gatsby-plugin-google-tagmanager) (2023-10-09)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [5.12.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.12.0/packages/gatsby-plugin-google-tagmanager) (2023-08-24)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v5.12)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [5.11.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.11.0/packages/gatsby-plugin-google-tagmanager) (2023-06-15)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v5.11)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [5.10.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.10.0/packages/gatsby-plugin-google-tagmanager) (2023-05-16)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v5.10)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [5.9.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.9.0/packages/gatsby-plugin-google-tagmanager) (2023-04-18)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v5.9)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [5.8.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.8.0/packages/gatsby-plugin-google-tagmanager) (2023-03-21)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v5.8)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [5.7.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.7.0/packages/gatsby-plugin-google-tagmanager) (2023-02-21)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v5.7)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [5.6.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.6.0/packages/gatsby-plugin-google-tagmanager) (2023-02-07)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v5.6)
+
+#### Bug Fixes
+
+- update babel monorepo [#37568](https://github.com/gatsbyjs/gatsby/issues/37568) ([13a0a9e](https://github.com/gatsbyjs/gatsby/commit/13a0a9e83dcb015b65dff6b73cdd5dea09c2988f))
+
+## [5.5.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.5.0/packages/gatsby-plugin-google-tagmanager) (2023-01-24)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v5.5)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [5.4.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.4.0/packages/gatsby-plugin-google-tagmanager) (2023-01-10)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v5.4)
+
+#### Chores
+
+- update babel monorepo [#37386](https://github.com/gatsbyjs/gatsby/issues/37386) ([b941876](https://github.com/gatsbyjs/gatsby/commit/b94187633d94d0f0071b38ffe93380dd802ec70f))
+
+### [5.3.1](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.3.1/packages/gatsby-plugin-google-tagmanager) (2022-12-14)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [5.3.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.3.0/packages/gatsby-plugin-google-tagmanager) (2022-12-13)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v5.3)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [5.2.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.2.0/packages/gatsby-plugin-google-tagmanager) (2022-11-25)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v5.2)
+
+#### Other Changes
+
+- Update pluginOptionsSchema tests [#27904](https://github.com/gatsbyjs/gatsby/issues/27904) ([2d967cb](https://github.com/gatsbyjs/gatsby/commit/2d967cbf3be81bb036f1f1cbc108a5e36c49785c))
+
+## [5.1.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.1.0/packages/gatsby-plugin-google-tagmanager) (2022-11-22)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v5.1)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [5.0.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@5.0.0/packages/gatsby-plugin-google-tagmanager) (2022-11-08)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v5.0)
+
+#### Chores
+
+- Update peerDeps [#36965](https://github.com/gatsbyjs/gatsby/issues/36965) ([b624442](https://github.com/gatsbyjs/gatsby/commit/b6244424fe8b724cbc23b80b2b4f5424cc2055a4))
+- apply patches for v5 [#36796](https://github.com/gatsbyjs/gatsby/issues/36796) ([25f79b6](https://github.com/gatsbyjs/gatsby/commit/25f79b6c3719fdf09584ade620a05c66ba2a697c))
+
+## [4.24.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.24.0/packages/gatsby-plugin-google-tagmanager) (2022-09-27)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.24)
+
+#### Chores
+
+- allow react/react-dom@experimental [#36533](https://github.com/gatsbyjs/gatsby/issues/36533) ([7ef4a3f](https://github.com/gatsbyjs/gatsby/commit/7ef4a3fe080d45e9edaff9f1d4deebd12a00ddbd))
+
+### [4.23.1](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.23.1/packages/gatsby-plugin-google-tagmanager) (2022-09-22)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.23.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.23.0/packages/gatsby-plugin-google-tagmanager) (2022-09-13)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.23)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.22.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.22.0/packages/gatsby-plugin-google-tagmanager) (2022-08-30)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.22)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.21.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.21.0/packages/gatsby-plugin-google-tagmanager) (2022-08-16)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.21)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.20.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.20.0/packages/gatsby-plugin-google-tagmanager) (2022-08-02)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.20)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.19.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.19.0/packages/gatsby-plugin-google-tagmanager) (2022-07-19)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.19)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+### [4.18.1](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.18.1/packages/gatsby-plugin-google-tagmanager) (2022-07-12)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.18.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.18.0/packages/gatsby-plugin-google-tagmanager) (2022-07-05)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.18)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.17.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.17.0/packages/gatsby-plugin-google-tagmanager) (2022-06-21)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.17)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.16.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.16.0/packages/gatsby-plugin-google-tagmanager) (2022-06-07)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.16)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+### [4.15.1](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.15.1/packages/gatsby-plugin-google-tagmanager) (2022-06-01)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.15.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.15.0/packages/gatsby-plugin-google-tagmanager) (2022-05-24)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.15)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.14.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.14.0/packages/gatsby-plugin-google-tagmanager) (2022-05-10)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.14)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.13.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.13.0/packages/gatsby-plugin-google-tagmanager) (2022-04-26)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.13)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+### [4.12.1](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.12.1/packages/gatsby-plugin-google-tagmanager) (2022-04-13)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.12.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.12.0/packages/gatsby-plugin-google-tagmanager) (2022-04-12)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.12)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+### [4.11.1](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.11.1/packages/gatsby-plugin-google-tagmanager) (2022-03-31)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.11.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.11.0/packages/gatsby-plugin-google-tagmanager) (2022-03-29)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.11)
+
+#### Bug Fixes
+
+- compatibility with react rc 2 [#35108](https://github.com/gatsbyjs/gatsby/issues/35108) ([0c61265](https://github.com/gatsbyjs/gatsby/commit/0c6126574d203c0e6fef173b76859cdcab2f13aa))
+
+### [4.10.2](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.10.2/packages/gatsby-plugin-google-tagmanager) (2022-03-23)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+### [4.10.1](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.10.1/packages/gatsby-plugin-google-tagmanager) (2022-03-18)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.10.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.10.0/packages/gatsby-plugin-google-tagmanager) (2022-03-16)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.10)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.9.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.9.0/packages/gatsby-plugin-google-tagmanager) (2022-03-01)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.9)
+
+#### Chores
+
+- Format changelog files ([088f23b](https://github.com/gatsbyjs/gatsby/commit/088f23b084b67f746a383e06e9216cef83270317))
+
+## [4.8.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.8.0/packages/gatsby-plugin-google-tagmanager) (2022-02-22)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.8)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.7.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.7.0/packages/gatsby-plugin-google-tagmanager) (2022-02-08)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.7)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.6.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.6.0/packages/gatsby-plugin-google-tagmanager) (2022-01-25)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.6)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.5.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.5.0/packages/gatsby-plugin-google-tagmanager) (2022-01-11)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.5)
+
+#### Chores
+
+- upgrade jest [#33277](https://github.com/gatsbyjs/gatsby/issues/33277) ([34cb202](https://github.com/gatsbyjs/gatsby/commit/34cb202d9c8c202f082edb03c4cc1815eb81abe1))
+
+## [4.4.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.4.0/packages/gatsby-plugin-google-tagmanager) (2021-12-14)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.4)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.3.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.3.0/packages/gatsby-plugin-google-tagmanager) (2021-12-01)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.3)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.2.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.2.0/packages/gatsby-plugin-google-tagmanager) (2021-11-16)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.2)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+### [4.1.1](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.1.1/packages/gatsby-plugin-google-tagmanager) (2021-11-09)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.1.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.1.0/packages/gatsby-plugin-google-tagmanager) (2021-11-02)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.1)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [4.0.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@4.0.0/packages/gatsby-plugin-google-tagmanager) (2021-10-21)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v4.0)
+
+#### Chores
+
+- apply patches for v4 [#33170](https://github.com/gatsbyjs/gatsby/issues/33170) ([f8c5141](https://github.com/gatsbyjs/gatsby/commit/f8c5141bf72108a53338fd01514522ae7a1b37bf))
+
+## [3.14.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.14.0/packages/gatsby-plugin-google-tagmanager) (2021-09-18)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.14)
+
+#### Features
+
+- add option for selfHostedOrigin [#32733](https://github.com/gatsbyjs/gatsby/issues/32733) ([ed72e68](https://github.com/gatsbyjs/gatsby/commit/ed72e68c42da68eaeb0dd7a5ba5404f2f6133a44))
+
+#### Chores
+
+- update babel monorepo [#32996](https://github.com/gatsbyjs/gatsby/issues/32996) ([048c7a7](https://github.com/gatsbyjs/gatsby/commit/048c7a727bbc6a9ad8e27afba72ee20e946c4aaa))
+
+## [3.13.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.13.0/packages/gatsby-plugin-google-tagmanager) (2021-09-01)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.13)
+
+#### Chores
+
+- re-generate changelogs [#32886](https://github.com/gatsbyjs/gatsby/issues/32886) ([417df15](https://github.com/gatsbyjs/gatsby/commit/417df15230be368a9db91f2ad1a9bc0442733177))
+
+## [3.12.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.12.0/packages/gatsby-plugin-google-tagmanager) (2021-08-18)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.12)
+
+#### Chores
+
+- update babel monorepo [#32564](https://github.com/gatsbyjs/gatsby/issues/32564) ([a554998](https://github.com/gatsbyjs/gatsby/commit/a554998b4f6765103b650813cf52dbfcc575fecf))
+
+## [3.11.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.11.0/packages/gatsby-plugin-google-tagmanager) (2021-08-04)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.11)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [3.10.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.10.0/packages/gatsby-plugin-google-tagmanager) (2021-07-20)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.10)
+
+#### Chores
+
+- update babel monorepo [#32238](https://github.com/gatsbyjs/gatsby/issues/32238) ([466d4c0](https://github.com/gatsbyjs/gatsby/commit/466d4c087bbc96abb942a02c67243bcc9a4f2a0a))
+
+## [3.9.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.9.0/packages/gatsby-plugin-google-tagmanager) (2021-07-07)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.9)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [3.8.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.8.0/packages/gatsby-plugin-google-tagmanager) (2021-06-23)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.8)
+
+#### Features
+
+- enable core webvitals tracking [#31665](https://github.com/gatsbyjs/gatsby/issues/31665) ([1ecd6e1](https://github.com/gatsbyjs/gatsby/commit/1ecd6e12eeedcabc54f3be00137a5d092978de58))
+
+#### Chores
+
+- bump babel minor [#31857](https://github.com/gatsbyjs/gatsby/issues/31857) ([7d42e8d](https://github.com/gatsbyjs/gatsby/commit/7d42e8d866e46e9c39838d812d080d06433f7060))
+
+### [3.7.1](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.7.1/packages/gatsby-plugin-google-tagmanager) (2021-06-10)
+
+#### Chores
+
+- bump babel minor [#31857](https://github.com/gatsbyjs/gatsby/issues/31857) [#31859](https://github.com/gatsbyjs/gatsby/issues/31859) ([8636025](https://github.com/gatsbyjs/gatsby/commit/863602567930a39142ed33d9d1f1813b7dec8686))
+
+## [3.7.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.7.0/packages/gatsby-plugin-google-tagmanager) (2021-06-09)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.7)
+
+#### Chores
+
+- update babel monorepo [#31143](https://github.com/gatsbyjs/gatsby/issues/31143) ([701ab2f](https://github.com/gatsbyjs/gatsby/commit/701ab2f6690c3f1bbaf60cf572513ea566cc9ec9))
+
+## [3.6.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.6.0/packages/gatsby-plugin-google-tagmanager) (2021-05-25)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.6)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [3.5.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.5.0/packages/gatsby-plugin-google-tagmanager) (2021-05-12)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.5)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [3.4.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.4.0/packages/gatsby-plugin-google-tagmanager) (2021-04-28)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.4)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [3.3.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.3.0/packages/gatsby-plugin-google-tagmanager) (2021-04-14)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.3)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [3.2.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.2.0/packages/gatsby-plugin-google-tagmanager) (2021-03-30)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.2)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [3.1.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.1.0/packages/gatsby-plugin-google-tagmanager) (2021-03-16)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.1)
+
+#### Chores
+
+- update eslint to fix linting issues fix [#29988](https://github.com/gatsbyjs/gatsby/issues/29988) ([5636389](https://github.com/gatsbyjs/gatsby/commit/5636389e8fa626c644e90abc14589e9961d98c68))
+
+## [3.0.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@3.0.0/packages/gatsby-plugin-google-tagmanager) (2021-03-02)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v3.0)
+
+#### Other Changes
+
+- Move peerdeps to 16.9.0 & 17+ for react & react-dom [#29735](https://github.com/gatsbyjs/gatsby/issues/29735) ([6b86b99](https://github.com/gatsbyjs/gatsby/commit/6b86b99f7e760c6ffa74b1330399d9fdd94e48a2))
+
+## [2.11.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@2.11.0/packages/gatsby-plugin-google-tagmanager) (2021-02-02)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v2.32)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.10.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@2.10.0/packages/gatsby-plugin-google-tagmanager) (2021-01-20)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v2.31)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.9.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@2.9.0/packages/gatsby-plugin-google-tagmanager) (2021-01-06)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v2.30)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.8.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@2.8.0/packages/gatsby-plugin-google-tagmanager) (2020-12-15)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v2.29)
+
+#### Chores
+
+- update dependency cross-env to ^7.0.3 [#28505](https://github.com/gatsbyjs/gatsby/issues/28505) ([a819b9b](https://github.com/gatsbyjs/gatsby/commit/a819b9bfb663139f7b06c3ed7d6d6069a2382b2c))
+
+## [2.7.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@2.7.0/packages/gatsby-plugin-google-tagmanager) (2020-12-02)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v2.28)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.6.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@2.6.0/packages/gatsby-plugin-google-tagmanager) (2020-11-20)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v2.27)
+
+#### Chores
+
+- update babel monorepo [#27528](https://github.com/gatsbyjs/gatsby/issues/27528) ([539dbb0](https://github.com/gatsbyjs/gatsby/commit/539dbb09166e346a6cee568973d2de3d936e8ef3))
+
+## [2.5.0](https://github.com/gatsbyjs/gatsby/commits/gatsby-plugin-google-tagmanager@2.5.0/packages/gatsby-plugin-google-tagmanager) (2020-11-12)
+
+[🧾 Release notes](https://www.gatsbyjs.com/docs/reference/release-notes/v2.26)
+
+#### Bug Fixes
+
+- allow functions for defaultDataLayer option [#27886](https://github.com/gatsbyjs/gatsby/issues/27886) ([631f3c4](https://github.com/gatsbyjs/gatsby/commit/631f3c401ed7c4d659604d5dd3170521bd477a61))
+
+
+
+# [2.4.0](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.16...gatsby-plugin-google-tagmanager@2.4.0) (2020-11-02)
+
+### Features
+
+- **gatsby:** release plugin option validation ([#27437](https://github.com/gatsbyjs/gatsby/issues/27437)) ([41ae1c0](https://github.com/gatsbyjs/gatsby/commit/41ae1c07ad9919655782ef17feed8cf4f14f12d8))
+
+## [2.3.16](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.15...gatsby-plugin-google-tagmanager@2.3.16) (2020-10-14)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.3.15](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.14...gatsby-plugin-google-tagmanager@2.3.15) (2020-10-06)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.3.14](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.13...gatsby-plugin-google-tagmanager@2.3.14) (2020-10-01)
+
+### Bug Fixes
+
+- **gatsby-plugin-google-tagmanager:** Add "aria-hidden" ([#27062](https://github.com/gatsbyjs/gatsby/issues/27062)) ([0ecba23](https://github.com/gatsbyjs/gatsby/commit/0ecba231f37a76255333cc9846bcd5b392394ce0))
+
+## [2.3.13](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.12...gatsby-plugin-google-tagmanager@2.3.13) (2020-09-28)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.3.12](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.11...gatsby-plugin-google-tagmanager@2.3.12) (2020-09-15)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.3.11](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.10...gatsby-plugin-google-tagmanager@2.3.11) (2020-07-09)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.3.10](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.9...gatsby-plugin-google-tagmanager@2.3.10) (2020-07-02)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.3.9](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.8...gatsby-plugin-google-tagmanager@2.3.9) (2020-07-01)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.3.8](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.7...gatsby-plugin-google-tagmanager@2.3.8) (2020-07-01)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.3.7](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.6...gatsby-plugin-google-tagmanager@2.3.7) (2020-06-24)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.3.6](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.5...gatsby-plugin-google-tagmanager@2.3.6) (2020-06-22)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.3.5](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.4...gatsby-plugin-google-tagmanager@2.3.5) (2020-06-09)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.3.4](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.3...gatsby-plugin-google-tagmanager@2.3.4) (2020-06-02)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.3.3](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.2...gatsby-plugin-google-tagmanager@2.3.3) (2020-05-20)
+
+### Features
+
+- **tagmanager:** add configurable event names ([#21362](https://github.com/gatsbyjs/gatsby/issues/21362)) ([#24076](https://github.com/gatsbyjs/gatsby/issues/24076)) ([81a3181](https://github.com/gatsbyjs/gatsby/commit/81a3181))
+
+## [2.3.2](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.1...gatsby-plugin-google-tagmanager@2.3.2) (2020-05-20)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.3.1](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.3.0...gatsby-plugin-google-tagmanager@2.3.1) (2020-05-05)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+# [2.3.0](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.2.4...gatsby-plugin-google-tagmanager@2.3.0) (2020-04-27)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.2.4](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.2.3...gatsby-plugin-google-tagmanager@2.2.4) (2020-04-24)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.2.3](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.2.2...gatsby-plugin-google-tagmanager@2.2.3) (2020-04-17)
+
+### Bug Fixes
+
+- wrap ignore pattern in quotes ([#23176](https://github.com/gatsbyjs/gatsby/issues/23176)) ([7563db6](https://github.com/gatsbyjs/gatsby/commit/7563db6))
+
+## [2.2.2](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.2.1...gatsby-plugin-google-tagmanager@2.2.2) (2020-04-16)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.2.1](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.2.0...gatsby-plugin-google-tagmanager@2.2.1) (2020-03-23)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+# [2.2.0](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.27...gatsby-plugin-google-tagmanager@2.2.0) (2020-03-20)
+
+### Features
+
+- **gatsby:** bump node min version to 10.13.0 ([#22400](https://github.com/gatsbyjs/gatsby/issues/22400)) ([83d681a](https://github.com/gatsbyjs/gatsby/commit/83d681a))
+
+## [2.1.27](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.26...gatsby-plugin-google-tagmanager@2.1.27) (2020-03-16)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.26](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.25...gatsby-plugin-google-tagmanager@2.1.26) (2020-03-06)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.25](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.24...gatsby-plugin-google-tagmanager@2.1.25) (2020-02-01)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.24](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.23...gatsby-plugin-google-tagmanager@2.1.24) (2020-01-14)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.23](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.22...gatsby-plugin-google-tagmanager@2.1.23) (2020-01-09)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.22](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.20...gatsby-plugin-google-tagmanager@2.1.22) (2020-01-09)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.21](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.20...gatsby-plugin-google-tagmanager@2.1.21) (2020-01-09)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.20](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.18...gatsby-plugin-google-tagmanager@2.1.20) (2019-12-10)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.19](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.18...gatsby-plugin-google-tagmanager@2.1.19) (2019-12-10)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.18](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.17...gatsby-plugin-google-tagmanager@2.1.18) (2019-11-26)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.17](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.16...gatsby-plugin-google-tagmanager@2.1.17) (2019-11-15)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.16](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.15...gatsby-plugin-google-tagmanager@2.1.16) (2019-11-10)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.15](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.14...gatsby-plugin-google-tagmanager@2.1.15) (2019-10-14)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.14](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.13...gatsby-plugin-google-tagmanager@2.1.14) (2019-10-14)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.13](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.12...gatsby-plugin-google-tagmanager@2.1.13) (2019-10-09)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.12](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.10...gatsby-plugin-google-tagmanager@2.1.12) (2019-09-26)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.11](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.10...gatsby-plugin-google-tagmanager@2.1.11) (2019-09-26)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.10](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.9...gatsby-plugin-google-tagmanager@2.1.10) (2019-09-20)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.9](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.8...gatsby-plugin-google-tagmanager@2.1.9) (2019-09-09)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.8](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.7...gatsby-plugin-google-tagmanager@2.1.8) (2019-09-01)
+
+### Bug Fixes
+
+- update minor updates in packages except react, babel and eslint ([#17254](https://github.com/gatsbyjs/gatsby/issues/17254)) ([252d867](https://github.com/gatsbyjs/gatsby/commit/252d867))
+
+## [2.1.7](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.6...gatsby-plugin-google-tagmanager@2.1.7) (2019-08-23)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.6](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.5...gatsby-plugin-google-tagmanager@2.1.6) (2019-08-20)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.5](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.4...gatsby-plugin-google-tagmanager@2.1.5) (2019-08-02)
+
+### Bug Fixes
+
+- **gatsby-plugin-google-tagmanager:** fix custom dataLayer name ([#16304](https://github.com/gatsbyjs/gatsby/issues/16304)) ([6d097a5](https://github.com/gatsbyjs/gatsby/commit/6d097a5))
+
+## [2.1.4](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.3...gatsby-plugin-google-tagmanager@2.1.4) (2019-07-12)
+
+### Bug Fixes
+
+- correct links in package changelogs ([#15630](https://github.com/gatsbyjs/gatsby/issues/15630)) ([d07b9dd](https://github.com/gatsbyjs/gatsby/commit/d07b9dd))
+
+## [2.1.3](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.2...gatsby-plugin-google-tagmanager@2.1.3) (2019-07-11)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.1.2](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.1...gatsby-plugin-google-tagmanager@2.1.2) (2019-07-09)
+
+### Features
+
+- **gatsby-plugin-google-tagmanager:** defaultDataLayer ([#11379](https://github.com/gatsbyjs/gatsby/issues/11379)) ([3e26eeb](https://github.com/gatsbyjs/gatsby/commit/3e26eeb))
+
+## [2.1.1](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.1.0...gatsby-plugin-google-tagmanager@2.1.1) (2019-07-02)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+# [2.1.0](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.15...gatsby-plugin-google-tagmanager@2.1.0) (2019-06-20)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.0.15](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.14...gatsby-plugin-google-tagmanager@2.0.15) (2019-05-30)
+
+### Bug Fixes
+
+- **gatsby-plugin-google-tagmanager:** guard against dataLayer being undefined in development ([#14437](https://github.com/gatsbyjs/gatsby/issues/14437)) ([ecb5d7b](https://github.com/gatsbyjs/gatsby/commit/ecb5d7b)), closes [#14424](https://github.com/gatsbyjs/gatsby/issues/14424)
+
+## [2.0.14](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.13...gatsby-plugin-google-tagmanager@2.0.14) (2019-05-29)
+
+### Bug Fixes
+
+- **gatsby-plugin-google-tagmanager:** Properly communicate site title with GTM services ([#14384](https://github.com/gatsbyjs/gatsby/issues/14384)) ([f9bb78a](https://github.com/gatsbyjs/gatsby/commit/f9bb78a))
+
+### Features
+
+- **gatsby-plugin-google-tagmanager:** Allow to place the GTM script … ([#13424](https://github.com/gatsbyjs/gatsby/issues/13424)) ([0b56c3b](https://github.com/gatsbyjs/gatsby/commit/0b56c3b))
+
+## [2.0.13](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.12...gatsby-plugin-google-tagmanager@2.0.13) (2019-04-11)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.0.12](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.11...gatsby-plugin-google-tagmanager@2.0.12) (2019-03-28)
+
+### Bug Fixes
+
+- **gatsby-plugin-google-tagmanager:** update dataLayer to be camelCased ([#12920](https://github.com/gatsbyjs/gatsby/issues/12920)) ([057dc9a](https://github.com/gatsbyjs/gatsby/commit/057dc9a))
+
+## [2.0.11](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.10...gatsby-plugin-google-tagmanager@2.0.11) (2019-03-25)
+
+### Features
+
+- **gatsby-plugin-google-tagmanager:** Add plugin option for custom dataLayer name ([#12783](https://github.com/gatsbyjs/gatsby/issues/12783)) ([4a149c](https://github.com/gatsbyjs/gatsby/commit/4a149c))
+
+## [2.0.10](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.9...gatsby-plugin-google-tagmanager@2.0.10) (2019-03-11)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+## [2.0.9](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.8...gatsby-plugin-google-tagmanager@2.0.9) (2019-02-01)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+
+
+## [2.0.8](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.7...gatsby-plugin-google-tagmanager@2.0.8) (2019-01-24)
+
+### Bug Fixes
+
+- **gatsby-plugin-google-tagmanager:** handle line breaks ([#11169](https://github.com/gatsbyjs/gatsby/issues/11169)) ([d974f80](https://github.com/gatsbyjs/gatsby/commit/d974f80))
+
+
+
+## [2.0.7](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.6...gatsby-plugin-google-tagmanager@2.0.7) (2018-11-29)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+
+
+## [2.0.6](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.5...gatsby-plugin-google-tagmanager@2.0.6) (2018-10-29)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+
+
+## [2.0.5](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.0-rc.1...gatsby-plugin-google-tagmanager@2.0.5) (2018-09-17)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+
+
+# [2.0.0-rc.1](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.0-rc.0...gatsby-plugin-google-tagmanager@2.0.0-rc.1) (2018-08-29)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+
+
+# [2.0.0-rc.0](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.0-beta.3...gatsby-plugin-google-tagmanager@2.0.0-rc.0) (2018-08-21)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+
+
+# [2.0.0-beta.3](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.0-beta.2...gatsby-plugin-google-tagmanager@2.0.0-beta.3) (2018-07-21)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+
+
+# [2.0.0-beta.2](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.0-beta.1...gatsby-plugin-google-tagmanager@2.0.0-beta.2) (2018-06-20)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+
+
+# [2.0.0-beta.1](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@2.0.0-beta.0...gatsby-plugin-google-tagmanager@2.0.0-beta.1) (2018-06-17)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
+
+
+
+# [2.0.0-beta.0](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-google-tagmanager@1.0.19...gatsby-plugin-google-tagmanager@2.0.0-beta.0) (2018-06-17)
+
+**Note:** Version bump only for package gatsby-plugin-google-tagmanager
diff --git a/plugins/gatsby-plugin-google-tagmanager/LICENSE b/plugins/gatsby-plugin-google-tagmanager/LICENSE
new file mode 100644
index 000000000..720fea247
--- /dev/null
+++ b/plugins/gatsby-plugin-google-tagmanager/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Gatsbyjs
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/plugins/gatsby-plugin-google-tagmanager/README.md b/plugins/gatsby-plugin-google-tagmanager/README.md
new file mode 100644
index 000000000..4d727e639
--- /dev/null
+++ b/plugins/gatsby-plugin-google-tagmanager/README.md
@@ -0,0 +1,102 @@
+# gatsby-plugin-google-tagmanager
+
+Easily add Google Tagmanager to your Gatsby site.
+
+## Install
+
+`npm install gatsby-plugin-google-tagmanager`
+
+## How to use
+
+// In your gatsby-config.js
+plugins: [
+ {
+ resolve: "gatsby-plugin-google-tagmanager",
+ options: {
+ id: "YOUR_GOOGLE_TAGMANAGER_ID",
+
+ // Include GTM in development.
+ //
+ // Defaults to false meaning GTM will only be loaded in production.
+ includeInDevelopment: false,
+
+ // datalayer to be set before GTM is loaded
+ // should be an object or a function that is executed in the browser
+ //
+ // Defaults to null
+ defaultDataLayer: { platform: "gatsby" },
+
+ // Specify optional GTM environment details.
+ gtmAuth: "YOUR_GOOGLE_TAGMANAGER_ENVIRONMENT_AUTH_STRING",
+ gtmPreview: "YOUR_GOOGLE_TAGMANAGER_ENVIRONMENT_PREVIEW_NAME",
+ dataLayerName: "YOUR_DATA_LAYER_NAME",
+
+ // Name of the event that is triggered
+ // on every Gatsby route change.
+ //
+ // Defaults to gatsby-route-change
+ routeChangeEventName: "YOUR_ROUTE_CHANGE_EVENT_NAME",
+ // Defaults to false
+ enableWebVitalsTracking: true,
+ // Defaults to https://www.googletagmanager.com
+ selfHostedOrigin: "YOUR_SELF_HOSTED_ORIGIN",
+ // Defaults to gtm.js
+ selfHostedPath: "YOUR_SELF_HOSTED_PATH",
+
+ // Defer loading of GTM script until consent is given.
+ deferLoading: true,
+ },
+ },
+]
+
+If you like to use data at runtime for your defaultDataLayer you can do that by defining it as a function.
+
+// In your gatsby-config.js
+plugins: [
+ {
+ resolve: "gatsby-plugin-google-tagmanager",
+ options: {
+ // datalayer to be set before GTM is loaded
+ // should be a stringified object or object
+ //
+ // Defaults to null
+ defaultDataLayer: function () {
+ return {
+ pageType: window.pageType,
+ }
+ },
+ },
+ },
+]
+
+This plugin only initiates the tag manager _container_. If you want to use Google Analytics, please also add `gatsby-plugin-google-analytics`.
+
+If you want to link analytics use with anything inside the container (for example, a cookie consent manager such as OneTrust), you will need to ensure that the tag manager script comes _before_ the analytics script in your `gatsby-config.js`.
+
+#### Tracking routes
+
+This plugin will fire a new event called `gatsby-route-change` (or as in the `gatsby-config.js` configured `routeChangeEventName`) whenever a route is changed in your Gatsby application. To record this in Google Tag Manager, we will need to add a trigger to the desired tag to listen for the event:
+
+1. Visit the [Google Tag Manager console](https://tagmanager.google.com/) and click on the workspace for your site.
+2. Navigate to the desired tag using the 'Tags' tab of the menu on the right hand side.
+3. Under "Triggering", click the pencil icon, then the "+" button to add a new trigger.
+4. In the "Choose a trigger" window, click on the "+" button again.
+5. Choose the trigger type by clicking the pencil button and clicking "Custom event". For event name, enter `gatsby-route-change` (or as in the `gatsby-config.js` configured `routeChangeEventName`).
+
+This tag will now catch every route change in Gatsby, and you can add Google tag services as you wish to it.
+
+#### Tracking Core Web Vitals
+
+Optimizing for the quality of user experience is key to the long-term success of any site on the web. Capturing Real user metrics (RUM) helps you understand the experience of your user/customer. By setting `enableWebVitalsTracking` to `true`, GTM will get ["core-web-vitals"](https://web.dev/vitals/) events with their values.
+
+You can save this data in Google Analytics or any database of your choosing.
+
+We send three metrics:
+
+- **Largest Contentful Paint (LCP)**: measures loading performance. To provide a good user experience, LCP should occur within 2.5 seconds of when the page first starts loading.
+- **First Input Delay (FID)**: measures interactivity. To provide a good user experience, pages should have a FID of 100 milliseconds or less.
+- **Cumulative Layout Shift (CLS)**: measures visual stability. To provide a good user experience, pages should maintain a CLS of 0.1. or less.
+
+#### Note
+
+Out of the box this plugin will simply load Google Tag Manager on the initial page/app load. It's up to you to fire tags based on changes in your app. See the above "Tracking routes" section for an example.
diff --git a/plugins/gatsby-plugin-google-tagmanager/gatsby-browser.js b/plugins/gatsby-plugin-google-tagmanager/gatsby-browser.js
new file mode 100644
index 000000000..69ff33923
--- /dev/null
+++ b/plugins/gatsby-plugin-google-tagmanager/gatsby-browser.js
@@ -0,0 +1,99 @@
+const listOfMetricsSend = new Set();
+
+const debounce = (fn, timeout) => {
+ let timer = null;
+
+ return (...args) => {
+ if (timer) {
+ clearTimeout(timer);
+ }
+
+ timer = setTimeout(fn, timeout, ...args);
+ };
+};
+
+const sendWebVitals = (dataLayerName = "dataLayer") => {
+ const win = window;
+
+ const sendData = (data) => {
+ if (listOfMetricsSend.has(data.name)) {
+ return;
+ }
+ listOfMetricsSend.add(data.name);
+
+ sendToGTM(data, win[dataLayerName]);
+ };
+
+ return import("web-vitals/base").then(({ getLCP, getFID, getCLS }) => {
+ const debouncedCLS = debounce(sendData, 3000);
+ // we don't need to debounce FID - we send it when it happens
+ const debouncedFID = sendData;
+ // LCP can occur multiple times so we debounce it
+ const debouncedLCP = debounce(sendData, 3000);
+
+ // With the true flag, we measure all previous occurrences too, in case we start listening too late.
+ getCLS(debouncedCLS, true);
+ getFID(debouncedFID, true);
+ getLCP(debouncedLCP, true);
+ });
+};
+
+const sendToGTM = ({ name, value, id }, dataLayer) => {
+ // Log warning and return if dataLayer is undefined
+ if (!dataLayer) {
+ console.log("GTM dataLayer is undefined. Consent granted?");
+ return;
+ }
+
+ dataLayer.push({
+ event: "core-web-vitals",
+ webVitalsMeasurement: {
+ name: name,
+ // The `id` value will be unique to the current page load. When sending
+ // multiple values from the same page (e.g. for CLS), Google Analytics can
+ // compute a total by grouping on this ID (note: requires `eventLabel` to
+ // be a dimension in your report).
+ id,
+ // Google Analytics metrics must be integers, so the value is rounded.
+ // For CLS the value is first multiplied by 1000 for greater precision
+ // (note: increase the multiplier for greater precision if needed).
+ value: Math.round(name === "CLS" ? value * 1000 : value)
+ }
+ });
+};
+
+export const onRouteUpdate = (_, pluginOptions) => {
+ if (
+ process.env.NODE_ENV === "production" ||
+ pluginOptions.includeInDevelopment
+ ) {
+ // wrap inside a timeout to ensure the title has properly been changed
+ setTimeout(() => {
+ const data = pluginOptions.dataLayerName
+ ? window[pluginOptions.dataLayerName]
+ : window.dataLayer;
+
+ // Log warning and return if dataLayer is undefined
+ if (!data) {
+ console.log("GTM dataLayer is undefined. Consent granted?");
+ return;
+ }
+
+ const eventName = pluginOptions.routeChangeEventName
+ ? pluginOptions.routeChangeEventName
+ : "gatsby-route-change";
+
+ data.push({ event: eventName });
+ }, 50);
+ }
+};
+
+export const onInitialClientRender = (_, pluginOptions) => {
+ // we only load the polyfill in production so we can't enable it in development
+ if (
+ process.env.NODE_ENV === "production" &&
+ pluginOptions.enableWebVitalsTracking
+ ) {
+ sendWebVitals(pluginOptions.dataLayerName);
+ }
+};
diff --git a/plugins/gatsby-plugin-google-tagmanager/gatsby-node.js b/plugins/gatsby-plugin-google-tagmanager/gatsby-node.js
new file mode 100644
index 000000000..81953cb2a
--- /dev/null
+++ b/plugins/gatsby-plugin-google-tagmanager/gatsby-node.js
@@ -0,0 +1,53 @@
+/** @type {import('gatsby').GatsbyNode["onPreInit"]} */
+exports.onPreInit = (args, options) => {
+ if (options.defaultDataLayer) {
+ options.defaultDataLayer = {
+ type: typeof options.defaultDataLayer,
+ value: options.defaultDataLayer
+ }
+
+ if (options.defaultDataLayer.type === "function") {
+ options.defaultDataLayer.value = options.defaultDataLayer.value.toString()
+ }
+ }
+}
+
+exports.pluginOptionsSchema = ({ Joi }) =>
+ Joi.object({
+ id: Joi.string().description(
+ "Google Tag Manager ID that can be found in your Tag Manager dashboard."
+ ),
+ includeInDevelopment: Joi.boolean()
+ .default(false)
+ .description(
+ "Include Google Tag Manager when running in development mode."
+ ),
+ defaultDataLayer: Joi.alternatives()
+ .try(Joi.object(), Joi.function())
+ .default(null)
+ .description(
+ "Data layer to be set before Google Tag Manager is loaded. Should be an object or a function."
+ ),
+ gtmAuth: Joi.string().description(
+ "Google Tag Manager environment auth string."
+ ),
+ gtmPreview: Joi.string().description(
+ "Google Tag Manager environment preview name."
+ ),
+ dataLayerName: Joi.string().description("Data layer name."),
+ routeChangeEventName: Joi.string()
+ .default("gatsby-route-change")
+ .description(
+ "Name of the event that is triggered on every Gatsby route change."
+ ),
+ enableWebVitalsTracking: Joi.boolean().default(false),
+ selfHostedOrigin: Joi.string()
+ .default("https://www.googletagmanager.com")
+ .description("The origin where GTM is hosted."),
+ selfHostedPath: Joi.string()
+ .default("gtm.js")
+ .description("The path where GTM is hosted."),
+ deferLoading: Joi.boolean()
+ .default(false)
+ .description("Defer loading of Google Tag Manager script until consent is given.")
+ })
diff --git a/plugins/gatsby-plugin-google-tagmanager/gatsby-ssr.js b/plugins/gatsby-plugin-google-tagmanager/gatsby-ssr.js
new file mode 100644
index 000000000..788d25451
--- /dev/null
+++ b/plugins/gatsby-plugin-google-tagmanager/gatsby-ssr.js
@@ -0,0 +1,127 @@
+import * as React from "react";
+import { oneLine, stripIndent } from "common-tags";
+
+const generateGTM = ({
+ id,
+ environmentParamStr,
+ dataLayerName,
+ selfHostedOrigin,
+ selfHostedPath,
+}) => stripIndent`
+ (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
+ new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
+ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
+ '${selfHostedOrigin}/${selfHostedPath}?id='+i+dl+'${environmentParamStr}';f.parentNode.insertBefore(j,f);
+ })(window,document,'script','${dataLayerName}', '${id}');`;
+
+const generateGTMIframe = ({ id, environmentParamStr, selfHostedOrigin, deferLoading }) => {
+ const iframeSrc = deferLoading ? `data-src` : `src`;
+ return oneLine``;
+}
+
+const generateDefaultDataLayer = (dataLayer, reporter, dataLayerName) => {
+ let result = `window.${dataLayerName} = window.${dataLayerName} || [];`
+
+ if (dataLayer.type === "function") {
+ result += `window.${dataLayerName}.push((${dataLayer.value})());`
+ } else {
+ if (dataLayer.type !== "object" || dataLayer.value.constructor !== Object) {
+ reporter.panic(
+ `Oops the plugin option "defaultDataLayer" should be a plain object. "${dataLayer}" is not valid.`
+ )
+ }
+
+ result += `window.${dataLayerName}.push(${JSON.stringify(
+ dataLayer.value
+ )});`
+ }
+
+ return stripIndent`${result}`;
+}
+
+export const onRenderBody = (
+ { setHeadComponents, setPreBodyComponents, reporter },
+ {
+ id,
+ includeInDevelopment = false,
+ gtmAuth,
+ gtmPreview,
+ defaultDataLayer,
+ dataLayerName = "dataLayer",
+ enableWebVitalsTracking = false,
+ selfHostedOrigin = "https://www.googletagmanager.com",
+ selfHostedPath = "gtm.js",
+ deferLoading = false
+ }
+) => {
+ if (process.env.NODE_ENV === "production" || includeInDevelopment) {
+ const environmentParamStr =
+ gtmAuth && gtmPreview
+ ? oneLine`>m_auth=${gtmAuth}>m_preview=${gtmPreview}>m_cookies_win=x`
+ : "";
+
+ let defaultDataLayerCode = "";
+ if (defaultDataLayer) {
+ defaultDataLayerCode = generateDefaultDataLayer(
+ defaultDataLayer,
+ reporter,
+ dataLayerName
+ );
+ }
+
+ selfHostedOrigin = selfHostedOrigin.replace(/\/$/, "");
+
+ const inlineScripts = [];
+ if (enableWebVitalsTracking) {
+ // web-vitals/polyfill (necessary for non chromium browsers)
+ // @seehttps://www.npmjs.com/package/web-vitals#how-the-polyfill-works
+ inlineScripts.push(
+