First-party mode: Load Google scripts through server-side tagging

This article is for developers who use server-side tagging and want to serve Google scripts from their own servers.

Server-side tagging allows you to load Google scripts, such as gtm.js or gtag.js, directly from your tagging server instead of from Google's servers. This allows you to serve data within a first-party context.

This guide assumes that you have done the following:

To get started, pick your implementation option.

Step 1: Configure the client

To establish a first-party context between your web container and your tagging server, Google scripts need to be loaded through your server.

To load Google scripts through your server container:

  1. Open Google Tag Manager
  2. In your server container, click Clients.
  3. Click New
  4. Select the Google Tag Manager: Web Container client type. Choose client type dialog with Tag Manager: Web Container client highlighted

  5. In Client Configuration:

    • Add Container ID: Enter the container ID of the Tag Manager web container that you will use on your website.
    • Automatically serve all dependent Google scripts: When enabled (default setting), the tagging server will automatically serve scripts that are needed by the root Google script. This removes the need to allowlist each container that the Google script requires. If you only want to serve the initial container from the tagging server, deselect this option.
    • Enable region-specific settings: Use this option to trigger certain tags based on the user's location. Learn more.

    Screenshot of the Tag Manager web container client

  6. Name the client and Save.

  7. Publish the workspace.

Step 2: Update the script source domain

By default, Tag Manager or gtag.js loads their dependencies from Google-owned servers, such as https://example.com/metrics. You need to update the script URL on your website to load dependencies through your own server.

To load the GTM code via your server container:

  1. Locate the existing Tag Manager code on the page.
  2. Replace the string https://example.com/metrics with the domain name of your tagging server in the <head> and <body> of the Google Tag Manager installation code.

    • Head:
    <!-- Google Tag Manager -->
    <script>(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://example.com/metrics/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
    })(window,document,'script','dataLayer','GTM-XXXXXX');</script>
    <!-- End Google Tag Manager -->
    
    • Body:
    <!-- Google Tag Manager (noscript) -->
    <noscript><iframe src="https://example.com/metrics/ns.html?id=TAG_ID"
    height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <!-- End Google Tag Manager (noscript) -->
    

Step 3: Verify the source of your scripts

The following instructions show how to test using Google Chrome. You can use any browser of your choice, but the steps might differ.

To test if your server container is loading the dependencies:

  1. Open your website in a new browser tab.
  2. Open the browser's developer tools. In Google Chrome, you can right-click anywhere on the page and select Inspect.
  3. In the developer tools, open the Sources tab. This window displays all dependencies that were loaded when you opened the website.

    • ✅ Your implementation is correct if gtm.js is loaded from the source you specified.

    Screenshot of the developer tools with your own server as the source for Google scripts

    • ❌ If the Sources tab displays www.googletagmanager.com as the source for gtm.js, the dependencies are still loaded from Google servers.

    Screenshot of the developer tools with www.googletagmanager.com as the source for Google scripts

    • Check if you've modified the source URL in your code, see step 2.
    • Check if the code is live.

Next steps

If you are using consent mode, you can set up region-specific tag behavior for even more control.