iMyke
iMyke

Reputation: 613

Google Analytics 4 with React

I've been trying to use react-ga package with google analytics 4 in my app. The measurement id doesn't work with it and there is no tracking code in google analytics 4 I can use. Please, I need help!

import ReactGA from 'react-ga';
const trackingId = 'G-XXXXXXXXXX'; // UA-XXXXXXXXX-X isn't available in GA4
ReactGA.initialize(trackingId, options);
ReactGA.pageview(page);

Upvotes: 40

Views: 46298

Answers (10)

thisismydesign
thisismydesign

Reputation: 25072

Background: There are 2 types of Google Analytics properties: Universal Analytics (UA-xxxxxxxxx-x) which is deprecated with the end of life on 2023.07.01 and Google Analytics 4 property (G-xxxxxxxxxx) which is the replacement.

react-ga was popular for Universal Analytics but the maintainer doesn't plan to update it (related issues: 1, 2, 3) and it had maintenance issues (1). react-ga4 and ga-4-react popped up as replacements but since these are similar wrappers you're at the mercy of the maintainers to implement and support all functionality.

The simplest way to get started is to follow Google's guide: include gtag on the page and use it as window.gtag. This method works for both old and new tags and there's even TypeScript support via @types/gtag.js. The script can be loaded async as recommended.

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <!-- ... -->

    <script
      async
      src="https://www.googletagmanager.com/gtag/js?id=G-xxxxxxxxxx" >
    </script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'G-xxxxxxxxxx')
    </script>

    <!-- ... -->
  </head>

  <body>
    <!-- ... -->
  </body>
</html>

Keep in mind that Google Analytics does automatic page tracking, but this will not work for every use case. For example, hash and search parameter changes are not tracked. This can lead to a lot of confusion. For example, when using HashRouter or anchor links the navigation will not be tracked. To have full control over page view tracking you can disable automatic tracking. See for a detailed explanation: The Ultimate Guide to Google Analytics (UA & GA4) on React (Or Anything Else

Manual page tracking: https://stackoverflow.com/a/63249329/2771889

You can see this working in cra-typescript-starter where I'm also setting the tag from an env var.

Upvotes: 15

Daniel
Daniel

Reputation: 1267

Adblock. Disable your Ad Block extension.

It took me quiet a few long and painful hours to realize that the problem was with an Ad Block chrome extension.

Once I disabled the extension, the events started to trigger.

Upvotes: 0

Saqib Naseeb
Saqib Naseeb

Reputation: 741

You probably know about the react-ga npm package but the sad news is, it does not work with the latest Google Analytics 4 version. It works with the old UA-0000-01 tags that was associated with Universal Analytics , but not with the G-XXXXXX tags that is Google Analytics 4. Universal Analytics will stop working in the near future.

Solution: To tackle this issue you should start using react-ga4 npm package which supports Google Analytics 4.

https://www.npmjs.com/package/react-ga4

Note: Universal analytics properties will stop collecting data starting july 1, 2023. it’s recommended that you create a google analytics 4 property instead. Reference: Google Analytics Support

Upvotes: 2

Anthony Dito
Anthony Dito

Reputation: 3670

Doesn't specifically answer the question. But, you can create a Firebase web app to log events. Worked for me as a workaround to get data into Google Analytics as it does not seem like you can create a UA identifier to me anymore.

Upvotes: 0

Riyasaat Ahmed Rahul
Riyasaat Ahmed Rahul

Reputation: 266

There are 2 versions of google analytics

  1. Google Analytics 4 ( the updated one )
  2. Universal Analytics ( the older one )

react-ga works fine with Universal Analytics as it takes the Tracking Id to initialize the connection between react and google analytics.

The problem is that whenever a user creates a new account, GA4 is being offered by default. But the GA4 doesn't have the Tracking Id that is required. GA4 has the Measurement ID but the react-ga doesn't want it. So we need the Tracking Id in order to set up the react-ga in our react app.

So the solution is, "Either downgrade from GA4 to Universal Analytics or Create a property that contains both of them as in GA4 and Universal Analytics together."

I would recommend watching the following videos:

GA4 vs Universal Analytics: https://www.youtube.com/watch?v=Y6WxUEk6clw

How to downgrade or keep both: https://www.youtube.com/watch?v=jRmb0jMNUKU

Upvotes: 2

Robin Aegerter
Robin Aegerter

Reputation: 467

You may want to have a look at this package: https://www.npmjs.com/package/react-ga4

It offers the same API as the normal react-ga. So just change your package name from react-ga to react-ga4 and it should work.

Tried it myself and it works great!

Upvotes: 4

TG___
TG___

Reputation: 501

.. react-ga does not work with Google Analytics 4.

Use ga-4-react instead: https://github.com/unrealmanu/ga-4-react

npm i ga-4-react

By adding

import GA4React from "ga-4-react";
const ga4react = new GA4React("G-XXXXXXXXXX");
ga4react.initialize().then().catch()

Thanks to the comments, I updated this post a little. I added a try/catch (for preventing AddBlocker Crashes) and a setTimeout. The ".catch()"-Methode should be trailed to "ga4react.initialize()" to handle errors inside the initialize promise. Analytics Systems should not be loaded at the beginning of a Page load. React apps are mostly single page applications, so this code is only loaded once (if needed you can replace "4000" milliseconds to "0").

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import GA4React from "ga-4-react";

ReactDOM.render(<App />, document.getElementById("root"));

try {
  setTimeout(_ => {
    const ga4react = new GA4React("G-XXXXXXXXXX");
    ga4react.initialize().catch(err => console.error(err));
  }, 4000);
} catch (err) {
      console.error(err);
}

// G-XXXXXXXXXX is your MESS-ID from Google Analytics 

How to find the MESS-ID in Google Analytics 4 (new) properties => https://analyticshelp.io/blog/google-analytics-property-tracking-id/

Upvotes: 26

spencer741
spencer741

Reputation: 1175

react-ga does not work with GA-4. I will also say that in react-ga's issues, the owner has said that unless someone creates a PR, he does not intend to add GA-4 support. The project is also not well maintained anymore.

You could theoretically create a universal property in the GA admin dashboard for backwards compatibility with earlier GA versions. At that point, you could use react-ga, but your best bet is to use ga-4-react instead: https://github.com/unrealmanu/ga-4-react

npm i ga-4-react

...

I will add on to @TG___ 's answer. The code he provided in his answer is a good start, but I will mention that it typically crashes the app if someone has an adblocker (adblocker blocks analytics request endpoints, no error handling, etc).

ERROR: Loading failed for the with source “https://www.google-analytics.com/analytics.js”

... Below is an expansion of his code to use the promise that ga4react.initialize() returns. This way, you can essentially detect whether the script didn't load and hence derive if the user has an adblocker that's preventing the GA script from loading. In my example code, I just ignore it and load the app... in other scenarios, I suppose you could invoke a modal to tell them to disable it (of course, that would come with extra code).

By adding

 await ga4react.initialize()

to your index.js in src GA-4 will start and add a pageview. Works also with react-router without adding any code. By the Promise (await) you have to wrap it into an async-function (below as a closure).


import React from "react";
import ReactDOM from "react-dom";
import App from "./App";

const ga4react = new GA4React("G-XXXXXXXXXX");

(async _ => {
  
await ga4react.initialize()
.then(res => console.log("Analytics Success."))
.catch(err => console.log("Analytics Failure."))
.finally(() => {
  ReactDOM.render(
    <React.StrictMode>
      <Router>
        <App />
      </Router>
    </React.StrictMode>,
    document.getElementById('root')
  );
});
})();

Upvotes: 7

Michele Pisani
Michele Pisani

Reputation: 14179

The code you entered in the example, G-XXXXXXXXXX , refers to the new Google Analytics 4 which, being a different system from the previous one and does not work (yet) with that plugin.

So you can follow the instructions mentioned in the answer of @Shyam or (and I suggest you because GA4 is too unripe at the moment) create a Universal Analytics type Property and use its ID (UA-XXXXX-X) with the plugin you indicated. You can find it by clicking on Show advanced options (when you create a new property):

enter image description here

Upvotes: 33

Shyam
Shyam

Reputation: 1454

Google Analytics 4 is different from pre ga 4. react-ga does not support this yet. https://github.com/react-ga/react-ga/issues/460

You may need to do this manually https://support.google.com/analytics/answer/9325020 https://developers.google.com/analytics/devguides/collection/ga4/tag-guide

Upvotes: 9

Related Questions