Estoy usando nextjs y agrego el administrador de etiquetas de Google por secuencia de comandos
<script dangerouslySetInnerHTML={{ __html: `(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= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-P35C2ZJ');`, }} ></script>pero después de agregar este script en _documetn.js, aparece un hash inesperado en la página inferior después de la etiqueta del cuerpo

y aquí

Creo que la curiosidad de @evolutionxbox es razonable. No hay razón para usar dangerouslySetInnerHTML .
Para agregarlo a su _document.js , primero lea los documentos y luego sígalos.
Por ejemplo:
import Document, { Html, Head, Main, NextScript } from 'next/document' class MyDocument extends Document { static async getInitialProps(ctx:any) { const initialProps = await Document.getInitialProps(ctx) return { ...initialProps } } render() { return ( <Html> <Head> <script> { function ({w, d, s, l, i}: any) { 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 = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); } } (window, document, 'script', 'dataLayer', 'GTM-XXXXXX'); </script> </Head> <body> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXXXX" height="0" width="0" style={{ display: 'none', visibility: 'hidden' }}></iframe></noscript> <Main /> <NextScript /> </body> </Html> ) } } export default MyDocument_Nota: lo he probado en TypeScript. Si está utilizando Javascript, edítelo según sea necesario.