'How to disable google analytics in document.js nextjs

When a user first visits the website they can choose to accept or decline tracking cookies. If they decline I set a cookie with value false. I would like to use that value of the cookie to conditionally run the gtag script. I tried accessing the cookies in the custom document.js but the req/res from getInitialProps are undefined and document.js only runs on the serverside so I'm not able to access the browsers cookies. How can I still conditionally inject the google analytics script?


class MyDocument extends Document {
    static async getInitialProps (ctx) {
        const initialProps = await Document.getInitialProps(ctx);
        return { ...initialProps, lang: ctx.query.lng}
    }

    render () {

        return (
            <Html lang={this.props.lang}>
                <Head>
                    <link
                        rel="stylesheet"
                        href="https://fonts.googleapis.com/css2?family=Poppins&display=swap"
                    />

                    <script
                        async
                        src={`https://www.googletagmanager.com/gtag/js?id=${GA_TRACKING_ID}`}
                    />
                    <script
                        dangerouslySetInnerHTML={{
                            __html: `
            window.dataLayer = window.dataLayer || [];
            function gtag(){dataLayer.push(arguments);}
            gtag('js', new Date());
            gtag('config', '${GA_TRACKING_ID}', {
              page_path: window.location.pathname,
            });
          `,
                        }}/>

                </Head>
                <body>
                <Main/>
                <NextScript/>
                </body>
            </Html>
        )
    }
}

export default MyDocument



Solution 1:[1]

How you are setting the cookie is not shown but setting it as httponly or secure will prevent client side access - you could omit it and the cookie would be available client-side or you could use a webstorage API and avoid the cookie route.

Once you have access on the client-side, you can make the script embedding conditional.

Solution 2:[2]

One possible solution is to move the GTM injection script to a useEffect in the _app.tsx.

Code placed in the UseEffect will only execute on the client-side.

const MyApp  = (props) => {
  
  useEffect(()=>{
     
     if(GDPRService.isConsentGiven()) { // your consent code
        const s = document.createElement('script');
        s.type =  'text/javascript';
        s.src = "..."; // your GTM link 
        document.getElementsByTagName('head')[0].appendChild(s);
        
        ...// code to push stuff into the datalayer. 

     }


    },[])

   ...
 }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Ramakay
Solution 2