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.
Before you begin
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:
- Open Google Tag Manager
- In your server container, click Clients.
- Click New
Select the Google Tag Manager: Web Container client type.
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.
Name the client and Save.
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:
- Locate the existing Tag Manager code on the page.
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:
- Open your website in a new browser tab.
- Open the browser's developer tools. In Google Chrome, you can right-click anywhere on the page and select Inspect.
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.
- ❌ If the Sources tab displays
www.googletagmanager.com
as the source forgtm.js
, the dependencies are still loaded from Google servers.
- Check if you've modified the source URL in your code, see step 2.
- Check if the code is live.
- ✅ Your implementation is correct if
Next steps
If you are using consent mode, you can set up region-specific tag behavior for even more control.