{"id":64911,"date":"2025-02-02T20:54:22","date_gmt":"2025-02-02T20:54:22","guid":{"rendered":"https:\/\/peraltafinancing.com\/analytics\/server-side-tagging-with-azure-app-service\/"},"modified":"2025-02-02T20:54:22","modified_gmt":"2025-02-02T20:54:22","slug":"server-side-tagging-with-azure-app-service","status":"publish","type":"post","link":"https:\/\/fivemor.com\/?p=64911","title":{"rendered":"Server-side Tagging With Azure App Service"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div>\n<p>To continue my extensive collection of <a href=\"https:\/\/tagmanager.google.com\/\">Google Tag Manager\u2019s<\/a> <a href=\"https:\/\/www.simoahava.com\/tags\/server-side-tagging\/\">server-side tagging articles<\/a>, in this guide I\u2019ll walk you through how to set up a Server container in <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/app-service\/\">Microsoft Azure\u2019s App Service<\/a> platform.<\/p>\n<p>For my previous guides on manually provisioning a Server container, follow these links:<\/p>\n<p>Azure\u2019s App Service is similar to AWS Elastic Beanstalk and GCP App Engine, in that it lets you create a web application from scratch with minimal effort.<\/p>\n<div style=\"aspect-ratio: 1856 \/ 612;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/server-side-gtm-azure.jpg\" title=\"Server-side Google Tag Manager for Azure\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"612\" width=\"1856\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/server-side-gtm-azure.jpg#ZgotmplZ\" alt=\"Server-side Google Tag Manager for Azure\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Out of these three competitors, I found Azure\u2019s setup to be the smoothest and the fastest. It\u2019s probably not <strong>the cheapest<\/strong>, and there are some roadblocks related to securing your tagging domains behind <strong>HTTPS<\/strong> (more on this later), but other than that it\u2019s a very pleasant ride.<\/p>\n<p>                <span class=\"simmer\"><br \/>\n  <span class=\"close\">X<\/span><\/p>\n<p>\n    <span class=\"fa fa-md fa-bell\"\/><br \/>\n    <strong>The Simmer Newsletter<\/strong>\n  <\/p>\n<p>\n    Subscribe to the <a href=\"https:\/\/www.simoahava.com\/newsletter\/\">Simmer newsletter<\/a> to get the latest news and content from Simo Ahava into your email inbox!\n  <\/p>\n<p>  <\/span><\/p>\n<h2 id=\"what-youll-need\">What you\u2019ll need<\/h2>\n<p>The prerequisites are similar to the other cloud stacks:<\/p>\n<ul>\n<li>A <strong>credit card<\/strong> to set up billing (if you\u2019re a first-time user, you\u2019ll get <a href=\"https:\/\/azure.microsoft.com\/en-us\/free\/\">USD200 trial credit<\/a>).<\/li>\n<li>A <strong>custom domain name<\/strong> to map the endpoint to (optional but strongly recommended).<\/li>\n<li>Some way of securing the custom domain name behind <strong>HTTPS<\/strong>.<\/li>\n<li>A <strong>Google Tag Manager Server container<\/strong>, created through the regular GTM container creation flow.<\/li>\n<\/ul>\n<p>If you recall from previous guides, a Google Tag Manager server-side tagging setup comprises <strong>two<\/strong> servers:<\/p>\n<ul>\n<li>The <strong>Preview server<\/strong>, which <em>must<\/em> be behind HTTPS, but doesn\u2019t need to be running on a custom domain.<\/li>\n<li>The <strong>Tagging server<\/strong>, which <em>should<\/em> be behind HTTPS, and <em>should<\/em> run on a custom (sub)domain.<\/li>\n<\/ul>\n<p>I will <em>not<\/em> be instructing you on how to integrate the <a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/server-side\/api#bigquery\">BigQuery API<\/a> \u2013\u00a0you can follow the <a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/server-side\/manual-setup-guide\">official documentation<\/a> for details on how to add service account credentials to your Azure service.<\/p>\n<p>In this guide, I\u2019ll walk you through the setup as a completely new user, so that you can follow the flow if you\u2019ve never tried Azure before. If you already <em>are<\/em> an established Azure user, you can skip to the beginning of the actual setup.<\/p>\n<h2 id=\"step-1-create-a-new-azure-account\">Step 1: Create a new Azure account<\/h2>\n<p>Browse to <a href=\"https:\/\/portal.azure.com\/\"><strong>https:\/\/portal.azure.com\/<\/strong><\/a>. You need to log in with a <strong>Microsoft<\/strong> account.<\/p>\n<p>If necessary, follow the prompts to create a new Microsoft account with the email address of your choice.<\/p>\n<div style=\"aspect-ratio: 503 \/ 586;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/sign-in-azure.jpg\" title=\"Sign in to Azure\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"586\" width=\"503\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/sign-in-azure.jpg#ZgotmplZ\" alt=\"Sign in to Azure\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>If you\u2019re a new Azure user, you can start with the free trial, which gives you <strong>$200<\/strong> credit to your billing.<\/p>\n<div style=\"aspect-ratio: 1061 \/ 433;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/azure-free-trial.jpg\" title=\"Azure free trial\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"433\" width=\"1061\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/azure-free-trial.jpg#ZgotmplZ\" alt=\"Azure free trial\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>When you click through to the free trial, you need to input some information to create your new Azure account.<\/p>\n<div style=\"aspect-ratio: 1281 \/ 934;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/free-trial.jpg\" title=\"Sign up for free account\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"934\" width=\"1281\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/free-trial.jpg#ZgotmplZ\" alt=\"Sign up for free account\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>After the credit runs out or you use the services paste the first <strong>30 days<\/strong>, Azure will prompt you if you want to continue with <strong>pay-as-you-go<\/strong>, so that you\u2019ll only pay for the actual services you use (beyond the free tiers).<\/p>\n<p>You\u2019ll need to also provide your <strong>credit card information<\/strong> for identity verification. Azure will also use this card for billing you for services when necessary.<\/p>\n<p>Once you\u2019re done inputting the credit card information, click <strong>Sign up<\/strong> to finally create the account.<\/p>\n<h2 id=\"azure-hierarchy\">Azure hierarchy<\/h2>\n<p>In Azure, the hierarchy of management is this:<\/p>\n<ul>\n<li>\n<p><strong>Management groups<\/strong> let you group together <strong>subscriptions<\/strong> to manage access, policy, and compliance across subscriptions. In this guide, we\u2019ll use the default <strong>Root<\/strong> management group.<\/p>\n<\/li>\n<li>\n<p><strong>Subscriptions<\/strong> associate users with the <strong>resources<\/strong> they create. With subscriptions, you can set budgets and policies that cover the resources you create in the subscription. A subscription should have been automatically created for you when you set up your Azure account.<\/p>\n<\/li>\n<li>\n<p><strong>Resource groups<\/strong> group <strong>resources<\/strong> (d\u2019oh) that have a similar purpose. In this guide, we\u2019ll create a single resource group to contain all the resources we create for the server-side tagging setup.<\/p>\n<\/li>\n<li>\n<p><strong>Resources<\/strong> are the individual cloud components you work with while in Azure. We\u2019re going to create a bunch of resources as we walk through the steps of this guide.<\/p>\n<\/li>\n<\/ul>\n<p>When you created the Azure account, a new subscription was automatically created for you, typically named <code>Azure subscription 1<\/code>.<\/p>\n<p>To find it, type <code>subscriptions<\/code> into the search bar in the top, and click the link to <strong>Subscriptions<\/strong>.<\/p>\n<div style=\"aspect-ratio: 952 \/ 390;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/subscriptions.jpg\" title=\"Subscriptions\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"390\" width=\"952\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/subscriptions.jpg#ZgotmplZ\" alt=\"Subscriptions\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>You might need to uncheck the \u201cShow only subscriptions selected in the global subscriptions filter\u201d option to see your subscription listed.<\/p>\n<div style=\"aspect-ratio: 1659 \/ 382;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/azure-subscription-1.jpg\" title=\"Azure subscription 1\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"382\" width=\"1659\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/azure-subscription-1.jpg#ZgotmplZ\" alt=\"Azure subscription 1\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>If you don\u2019t have any subscriptions listed, you can click <strong>+ Add<\/strong> to create a new one. Just follow the prompts and you\u2019ll be fine.<\/p>\n<p>If you click to open the subscription in the list, you can rename it, check its billing, and\/or set cost alerts and budgets!<\/p>\n<h2 id=\"step-2-create-a-new-resource-group\">Step 2: Create a new Resource Group<\/h2>\n<blockquote>\n<p>Note! You <em>could<\/em> simply go ahead and directly create a new <strong>App Service<\/strong> resource and a resource group would be automatically generated for you. But I like a more methodological approach, which is why I want to create all the assets manually.<\/p>\n<\/blockquote>\n<p>Type <code>resource groups<\/code> in the search bar and click the corresponding icon to open the <strong>Resource groups<\/strong> dashboard.<\/p>\n<p>Here, click the <strong>+ Create<\/strong> button to start creating a new resource group.<\/p>\n<div style=\"aspect-ratio: 493 \/ 289;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/create-resource-group.jpg\" title=\"Create resource group\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"289\" width=\"493\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/create-resource-group.jpg#ZgotmplZ\" alt=\"Create resource group\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>In the creation process, the three selections you need to make are:<\/p>\n<ul>\n<li><strong>Subscription<\/strong> \u2013\u00a0Select the <code>Azure subscription 1<\/code> or whatever subscription you want to use.<\/li>\n<li><strong>Resource group<\/strong> \u2013\u00a0Give the resource group a name (e.g. <code>gtm-server-side-tagging<\/code>).<\/li>\n<li><strong>Region<\/strong> \u2013\u00a0Choose the Azure region that\u2019s best for your use case.<\/li>\n<\/ul>\n<p>For more details about region selection, see <a href=\"https:\/\/azure.microsoft.com\/en-us\/global-infrastructure\/geographies\/\">this page<\/a>.<\/p>\n<p>Here\u2019s what I selected:<\/p>\n<div style=\"aspect-ratio: 738 \/ 333;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/resource-group-options.jpg\" title=\"Resource group options\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"333\" width=\"738\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/resource-group-options.jpg#ZgotmplZ\" alt=\"Resource group options\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Once finished configuring, click <strong>Review + create<\/strong> in the bottom bar.<\/p>\n<p>Once validation passes, click <strong>Create<\/strong> in the bottom bar.<\/p>\n<div style=\"aspect-ratio: 675 \/ 533;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/create-group.jpg\" title=\"Create resource group\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"533\" width=\"675\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/create-group.jpg#ZgotmplZ\" alt=\"Create resource group\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>You should see your new resource group listed in the dashboard:<\/p>\n<div style=\"aspect-ratio: 608 \/ 293;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/resource-group-done.jpg\" title=\"Resource group created\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"293\" width=\"608\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/resource-group-done.jpg#ZgotmplZ\" alt=\"Resource group created\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<h2 id=\"step-3-create-the-preview-server\">Step 3: Create the Preview server<\/h2>\n<p>The first thing we\u2019ll create is the <strong>Preview<\/strong> server.<\/p>\n<p>This is an HTTP endpoint to which the <em>tagging<\/em> server forwards all requests that need to be exposed in preview mode. The main requirement is that it\u2019s behind <strong>HTTPS<\/strong>. It does <em>not<\/em> need to reside on a custom domain, and you can just use the default domain that Azure provides (which is, conveniently, automatically accessible through HTTPS).<\/p>\n<h3 id=\"create-the-app-service\">Create the App Service<\/h3>\n<p>To create the server, type <code>app services<\/code> into the search bar and click the <strong>App Services<\/strong> link.<\/p>\n<p>In the dashboard, click <strong>+ Create<\/strong> to create a new App Service.<\/p>\n<div style=\"aspect-ratio: 439 \/ 291;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/create-app-service.jpg\" title=\"Create App Service\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"291\" width=\"439\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/create-app-service.jpg#ZgotmplZ\" alt=\"Create App Service\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<h3 id=\"configure-the-instance\">Configure the instance<\/h3>\n<p>The first thing to do in the creation flow is to select your <strong>subscription<\/strong> and <strong>resource group<\/strong>.<\/p>\n<div style=\"aspect-ratio: 729 \/ 197;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/select-subscription-and-resource-group.jpg\" title=\"Select subscription and resource group\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"197\" width=\"729\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/select-subscription-and-resource-group.jpg#ZgotmplZ\" alt=\"Select subscription and resource group\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Next, give the Preview server a <strong>name<\/strong>. This will become the subdomain under <code>azurewebsites.net<\/code> you\u2019ll use to access the server.<\/p>\n<p>Select <strong>Docker Container<\/strong> as the publish option. Keep <strong>Linux<\/strong> checked for the operating system.<\/p>\n<p>Select the App Service <strong>region<\/strong> you want to use \u2013\u00a0might make sense to select the same one you configured for the resource group earlier.<\/p>\n<div style=\"aspect-ratio: 715 \/ 264;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/instance-details.jpg\" title=\"Instance details\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"264\" width=\"715\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/instance-details.jpg#ZgotmplZ\" alt=\"Instance details\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Finally, click <strong>Create new<\/strong> for the <strong>Linux Plan<\/strong> option. Give the plan a name \u2013\u00a0you can just use the same name you gave to the instance previously.<\/p>\n<p>For <strong>Sku and size<\/strong>, click <strong>Change size<\/strong>. Under <strong>Dev \/ Test<\/strong>, choose <strong>B1<\/strong> (one of the lowest specs).<\/p>\n<blockquote>\n<p>We can choose a flimsy spec like this because the Preview server is only used occasionally and does not need to be that responsive. <strong>F1<\/strong> might be tempting, but the lack of compute minutes will really make it difficult to use Preview mode for longer stretches.<\/p>\n<\/blockquote>\n<div style=\"aspect-ratio: 1364 \/ 552;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/select-b1.jpg\" title=\"Select B1\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"552\" width=\"1364\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/select-b1.jpg#ZgotmplZ\" alt=\"Select B1\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>This is what <strong>App Service Plan<\/strong> should look like now:<\/p>\n<div style=\"aspect-ratio: 1454 \/ 488;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/app-service-plan.jpg\" title=\"App Service Plan\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"488\" width=\"1454\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/app-service-plan.jpg#ZgotmplZ\" alt=\"App Service Plan\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>When happy, click the <strong>Next : Docker &gt;<\/strong> button in the bottom bar to open the Docker tab.<\/p>\n<h3 id=\"configure-the-docker-container\">Configure the Docker container<\/h3>\n<p>Docker is a technology that uses <em>containers<\/em> to provide all-inclusive application setups. For example, the entire Google Tag Manager server-side tagging infrastructure is handily available in a public Docker container, which you can configure with just a few environment variables (more on these in a bit).<\/p>\n<p>In the Docker tab, keep <strong>Options<\/strong> as it is (\u201cSingle Container\u201d), but choose <strong>Docker Hub<\/strong> as the Image source.<\/p>\n<p>Keep <strong>Access Type<\/strong> as Public, and past the following container URI into the <strong>Image and tag<\/strong> field:<\/p>\n<p><code>gcr.io\/cloud-tagging-10302018\/gtm-cloud-image:stable<\/code><\/p>\n<p>This is the public URL to the server-side GTM Docker container.<\/p>\n<p>Here\u2019s what your settings should look like:<\/p>\n<div style=\"aspect-ratio: 728 \/ 354;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/docker-tab.jpg\" title=\"Docker tab\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"354\" width=\"728\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/docker-tab.jpg#ZgotmplZ\" alt=\"Docker tab\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Now, you can click the <strong>Review + create<\/strong> button in the bottom bar. Review your configuration, and then click <strong>Create<\/strong> in the bottom bar to create the Preview server!<\/p>\n<h3 id=\"configure-application-settings\">Configure Application Settings<\/h3>\n<p>It will take a while for the service to deploy. Once it\u2019s done, the dashboard should have a button <strong>Go to resource<\/strong>, so click that.<\/p>\n<div style=\"aspect-ratio: 847 \/ 417;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/go-to-resource.jpg\" title=\"Go to resource\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"417\" width=\"847\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/go-to-resource.jpg#ZgotmplZ\" alt=\"Go to resource\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<blockquote>\n<p>If, for some reason, you can\u2019t see this button or you close the tab, you can always find your server by typing <code>app services<\/code> in the Azure search bar, clicking over to App Services, and then selecting the Preview server service from the list.<\/p>\n<\/blockquote>\n<p>The next thing we need to do is configure some <em>environment variables<\/em>, known as <strong>Application settings<\/strong> in Azure. These establish certain conditions for the Docker container.<\/p>\n<p>Click <strong>Configuration<\/strong> in the navigation.<\/p>\n<div style=\"aspect-ratio: 435 \/ 282;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/preview-configuration.jpg\" title=\"Preview server configuration\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"282\" width=\"435\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/preview-configuration.jpg#ZgotmplZ\" alt=\"Preview server configuration\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>You\u2019re going to be adding <strong>two<\/strong> new Application settings here. The first instructs the service that this particular server is the <strong>Preview server<\/strong>. The second instructs the service to which <strong>Google Tag Manager server container<\/strong> this server should be linked.<\/p>\n<p>Click <strong>+ New application setting<\/strong>.<\/p>\n<p>For <strong>Name<\/strong>, type <code>RUN_AS_PREVIEW_SERVER<\/code>. For <strong>Value<\/strong>, type <code>true<\/code>.<\/p>\n<div style=\"aspect-ratio: 421 \/ 210;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/run-as-preview-server.jpg\" title=\"Run as preview server\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"210\" width=\"421\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/run-as-preview-server.jpg#ZgotmplZ\" alt=\"Run as preview server\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Click <strong>OK<\/strong>.<\/p>\n<p>Click <strong>+ New application setting<\/strong> to add another environment variable.<\/p>\n<p>For <strong>Name<\/strong>, type <code>CONTAINER_CONFIG<\/code>.<\/p>\n<p>For <strong>Value<\/strong>, open the <strong>Server container<\/strong> you\u2019ve created in the <a href=\"https:\/\/tagmanager.google.com\/\"><strong>Google Tag Manager<\/strong> user interface<\/a>.<\/p>\n<p>Click the Container ID in the top bar to open the container information overlay.<\/p>\n<div style=\"aspect-ratio: 2450 \/ 960;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/container-id.jpg\" title=\"Container ID\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"960\" width=\"2450\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/container-id.jpg#ZgotmplZ\" alt=\"Container ID\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>If you\u2019re prompted about how to install Google Tag Manager, choose <strong>Manually provision tagging server<\/strong>.<\/p>\n<p>In any case, what you\u2019re looking for is the <strong>Container Config<\/strong> string. Copy it to the clipboard once you find it.<\/p>\n<div style=\"aspect-ratio: 1024 \/ 392;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/copy-container-config.jpg\" title=\"Copy container config\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"392\" width=\"1024\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/copy-container-config.jpg#ZgotmplZ\" alt=\"Copy container config\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Back in Azure, set this Container Config string as the <strong>Value<\/strong> of the <code>CONTAINER_CONFIG<\/code> application setting. Click <strong>OK<\/strong>.<\/p>\n<div style=\"aspect-ratio: 1564 \/ 392;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/container-config-setting.jpg\" title=\"Container Config Setting\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"392\" width=\"1564\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/container-config-setting.jpg#ZgotmplZ\" alt=\"Container Config Setting\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Finally, click <strong>Save<\/strong> in the top bar to save the new settings and force a redeployment of the Preview server.<\/p>\n<div style=\"aspect-ratio: 942 \/ 492;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/save-application-settings.jpg\" title=\"Save application settings\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"492\" width=\"942\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/save-application-settings.jpg#ZgotmplZ\" alt=\"Save application settings\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<h3 id=\"configure-health-check\">Configure Health check<\/h3>\n<p>The last thing you need to do before being able to test your setup is to configure the <strong>Health check<\/strong>.<\/p>\n<p>Azure can periodically ping a specific endpoint in your service to make sure that the service is up and running. If the service doesn\u2019t respond with a valid status, Azure flags it as <em>unhealthy<\/em>, forcing a scale-down and redeployment of the instance.<\/p>\n<p>This is <em>very<\/em> important, because Google Tag Manager also uses this mechanism to get your service to fetch the latest version of the server-side tagging software from Google server.<\/p>\n<p>In your Preview server service, scroll down the menu until you find the <strong>Health check<\/strong> option. Click it.<\/p>\n<p>Click <strong>Enable<\/strong> to activate the health check and type <code>\/healthz<\/code> as the <strong>Path<\/strong>.<\/p>\n<p>Finally, click <strong>Save<\/strong> to save the changes and force yet another redeployment of the service.<\/p>\n<div style=\"aspect-ratio: 1616 \/ 1320;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/configure-health-check.jpg\" title=\"Configure health check\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1320\" width=\"1616\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/configure-health-check.jpg#ZgotmplZ\" alt=\"Configure health check\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<h3 id=\"test-the-preview-server\">Test the Preview server<\/h3>\n<p>You\u2019re finally ready to test the server!<\/p>\n<p>Browse to the <strong>Overview<\/strong> dashboard of your App Service.<\/p>\n<p>Here, keep hitting the <strong>Refresh<\/strong> button in the top bar of the dashboard until the <strong>Health Check<\/strong> response is good. It might take a while!<\/p>\n<div style=\"aspect-ratio: 2072 \/ 674;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/health-check-ok.jpg\" title=\"Health check OK\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"674\" width=\"2072\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/health-check-ok.jpg#ZgotmplZ\" alt=\"Health check OK\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>The health check might even indicate that there\u2019s a <strong>Degraded<\/strong> instance, but keep hitting Refresh. If you\u2019ve followed these steps it <em>will<\/em> show <strong>Healthy<\/strong> soon.<\/p>\n<p>Finally, click the <strong>URL<\/strong> to open the <code>.azurewebsites.net<\/code> URL for your Preview server in a new tab. You should see a <code>Not Found<\/code> message on the page.<\/p>\n<p>Add the path <code>\/healthy<\/code> to the end of the URL and load the page. Now you should see <code>ok<\/code>.<\/p>\n<div style=\"aspect-ratio: 1604 \/ 256;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/healthy-ok.jpg\" title=\"Healthy OK\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"256\" width=\"1604\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/healthy-ok.jpg#ZgotmplZ\" alt=\"Healthy OK\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Congratulations! You\u2019ve created the Preview server. Now it\u2019s just the <strong>Tagging server<\/strong> left \u2013\u00a0luckily it\u2019s <em>almost<\/em> exactly the same steps, so it should be easy to do.<\/p>\n<h2 id=\"step-4-create-the-tagging-server\">Step 4: Create the Tagging server<\/h2>\n<p>The Tagging server becomes the actual endpoint with which you\u2019ll be communicating.<\/p>\n<p>This means that <em>ideally<\/em>, you\u2019d map one or more <strong>custom domains<\/strong> to this server, each of which is a subdomain of whatever website is sending data to your container. This is to ensure the data stream happens in a <em>first-party HTTP request-response context<\/em>.<\/p>\n<p>But let\u2019s not get ahead of ourselves.<\/p>\n<p>Setting up the Tagging server is remarkably similar to setting up the Preview server.<\/p>\n<h3 id=\"create-the-app-service-1\">Create the App Service<\/h3>\n<p>Type <code>app services<\/code> into the search bar, and click the <strong>App Services<\/strong> option.<\/p>\n<p>As before, click <strong>+ Create<\/strong> to create a new service.<\/p>\n<h3 id=\"configure-the-instance-1\">Configure the instance<\/h3>\n<p>Under <strong>Project Details<\/strong>, choose the <strong>Subscription<\/strong> you used before, and choose the <strong>Resource Group<\/strong> you used for the Preview server, too.<\/p>\n<p>Under <strong>Instance Details<\/strong>, give the server a descriptive name. It\u2019s a good idea to mirror the name you gave to the Preview server, so in my case the name would be <code>sgtm-ahava-tagging-server<\/code>.<\/p>\n<p>Choose <strong>Docker Container<\/strong> as the Publish type, keep <strong>Linux<\/strong> as the OS, and select the same region from the <strong>Region<\/strong> selector that you configured for the Preview server.<\/p>\n<p>This is what the setup should look like thus far:<\/p>\n<div style=\"aspect-ratio: 1472 \/ 1268;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/tagging-server-details.jpg\" title=\"Tagging server details\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1268\" width=\"1472\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/tagging-server-details.jpg#ZgotmplZ\" alt=\"Tagging server details\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>For <strong>App Service Plan<\/strong>, click <strong>Create new<\/strong>. Give it a descriptive name, such as the same one you set for the service instance. In my case, I set the name to <code>gtm-ahava-tagging-server<\/code>.<\/p>\n<p>Click <strong>Change size<\/strong> under <strong>Sku and size<\/strong> to choose the instance profile.<\/p>\n<p>For this example, I chose the <strong>S1<\/strong> instance type, which is the smallest instance type for <strong>Production<\/strong> setups.<\/p>\n<div style=\"aspect-ratio: 1582 \/ 1222;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/instance-s1.jpg\" title=\"Instance S1\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1222\" width=\"1582\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/instance-s1.jpg#ZgotmplZ\" alt=\"Instance S1\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Whatever you choose, make sure it supports <strong>Custom domains<\/strong> and <strong>Auto scale<\/strong>.<\/p>\n<p>Click <strong>Apply<\/strong> when you\u2019ve selected the instance type.<\/p>\n<div style=\"aspect-ratio: 1472 \/ 462;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/app-service-plan-tagging-server.jpg\" title=\"Tagging server app service plan\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"462\" width=\"1472\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/app-service-plan-tagging-server.jpg#ZgotmplZ\" alt=\"Tagging server app service plan\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Click the <strong>Next : Docker &gt;<\/strong> button in the bottom bar when ready.<\/p>\n<h3 id=\"configure-the-docker-container-1\">Configure the Docker container<\/h3>\n<p>Here, set the exact same settings as with the Preview server.<\/p>\n<p>Remember to set <code>gcr.io\/cloud-tagging-10302018\/gtm-cloud-image:stable<\/code> as the value of the <strong>Image and tag<\/strong> field.<\/p>\n<div style=\"aspect-ratio: 1442 \/ 678;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/docker-settings-tagging.jpg\" title=\"Docker settings tagging\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"678\" width=\"1442\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/docker-settings-tagging.jpg#ZgotmplZ\" alt=\"Docker settings tagging\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Finally, click <strong>Review + create<\/strong> in the bottom bar. Click <strong>Create<\/strong> if you\u2019re happy with your configuration overview.<\/p>\n<p>Once the instance has been deployed, click <strong>Go to resource<\/strong> on the deployment overview page.<\/p>\n<h3 id=\"configure-the-application-settings\">Configure the Application settings<\/h3>\n<p>It\u2019s time to add the environment variables again.<\/p>\n<p>Choose <strong>Configuration<\/strong> from the service navigation.<\/p>\n<p>Click <strong>+ New application setting<\/strong>.<\/p>\n<p>As the <strong>Name<\/strong>, set <code>PREVIEW_SERVER_URL<\/code>.<\/p>\n<p>As the value, add the <strong>origin URL<\/strong> of your Preview server. That is, everything up to the first <code>\/<\/code> path divider. This is what my setting looks like:<\/p>\n<div style=\"aspect-ratio: 1134 \/ 400;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/preview-server-url-setting.jpg\" title=\"Preview server URL setting\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"400\" width=\"1134\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/preview-server-url-setting.jpg#ZgotmplZ\" alt=\"Preview server URL setting\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Then, click <strong>+ New application setting<\/strong> to add a second setting.<\/p>\n<p>This is <code>CONTAINER_CONFIG<\/code> again, so copy-paste the Container Config string from the Google Tag Manager user interface as you did before.<\/p>\n<div style=\"aspect-ratio: 1564 \/ 392;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/container-config-setting.jpg\" title=\"Container config setting\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"392\" width=\"1564\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/container-config-setting.jpg#ZgotmplZ\" alt=\"Container config setting\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Click <strong>Save<\/strong> to apply the settings.<\/p>\n<h3 id=\"configure-the-health-check\">Configure the Health Check<\/h3>\n<p>Next, browse to the <strong>Health check<\/strong> settings in the service navigation.<\/p>\n<p>Configure this exactly as you did before. Here\u2019s a reminder of what it should look like:<\/p>\n<div style=\"aspect-ratio: 1616 \/ 1320;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/configure-health-check.jpg\" title=\"Configure health check\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1320\" width=\"1616\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/configure-health-check.jpg#ZgotmplZ\" alt=\"Configure health check\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Click <strong>Save<\/strong> to apply the settings.<\/p>\n<h3 id=\"configure-autoscaling\">Configure autoscaling<\/h3>\n<p><strong>Autoscaling<\/strong> means that the number of instances your app uses should scale <strong>out<\/strong> when the need for more instances arises (e.g. CPU utilization passes a threshold), and scale <strong>in<\/strong> when it\u2019s OK to decrease the number of instances.<\/p>\n<p>You don\u2019t <em>have<\/em> to configure autoscaling. You could use just the single instance you started with if it\u2019s powerful enough to handle your traffic.<\/p>\n<p>However, having <em>at least one instance<\/em> for redundancy is a good idea, especially if there are resource availability issues in your Azure region.<\/p>\n<p>Autoscaling is also a good idea to adjust to potential traffic peaks that you need to quickly react to with enough capacity to make sure that your endpoint doesn\u2019t become unresponsive.<\/p>\n<p>To configure autoscaling, choose <strong>Scale out (App Service plan)<\/strong> from the Tagging server navigation.<\/p>\n<blockquote>\n<p>Autoscaling needs to be done <em>only<\/em> to the Tagging server. Your Preview server is always going to have minimal utilization, so it does not need the type of power that your Tagging server requires.<\/p>\n<\/blockquote>\n<p>Here, choose <strong>Custom autoscale<\/strong> to configure autoscaling settings.<\/p>\n<div style=\"aspect-ratio: 1644 \/ 1252;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/set-custom-autoscale.jpg\" title=\"Set custom autoscale\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1252\" width=\"1644\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/set-custom-autoscale.jpg#ZgotmplZ\" alt=\"Set custom autoscale\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>You need to add <strong>two rules<\/strong>: a Scale Out rule and a Scale In rule. Click <strong>+ Add a rule<\/strong> to begin.<\/p>\n<p>How you configure these rules is really a matter of experience and preference. You can add more than one Scale Out rule, for example, to account for larger increases in utilization (i.e. larger traffic spikes), adding multiple instances in one go.<\/p>\n<p>I\u2019m just going to use a very simple setup here. When CPU utilization is greater than or equal to <strong>60%<\/strong>, I want to scale out to one additional instance. This is what the configuration looks like:<\/p>\n<div style=\"aspect-ratio: 1124 \/ 644;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/scale-out.jpg\" title=\"Scale Out\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"644\" width=\"1124\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/scale-out.jpg#ZgotmplZ\" alt=\"Scale Out\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Click <strong>Add<\/strong> when ready.<\/p>\n<p>Click <strong>+ Add a rule<\/strong> to add a second rule.<\/p>\n<p>Here, the rule is the converse of what I added for the Scale Out. This time, if the CPU threshold is <strong>below 60%<\/strong>, I want to <strong>decrease instance count by 1<\/strong>.<\/p>\n<div style=\"aspect-ratio: 1136 \/ 648;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/scale-in.jpg\" title=\"Scale In\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"648\" width=\"1136\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/scale-in.jpg#ZgotmplZ\" alt=\"Scale In\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Click <strong>Add<\/strong> when ready.<\/p>\n<p>Finally, set the <strong>Minimum<\/strong>, <strong>Maximum<\/strong>, and <strong>Default<\/strong> limits for your instances. The minimum is the lowest your setup will scale in to, the maximum is the highest number of instances to scale out to, and default is what App Service will attempt to scale to if autoscaling doesn\u2019t work, for whatever reason.<\/p>\n<div style=\"aspect-ratio: 1674 \/ 154;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/instance-limits.jpg\" title=\"Instance limits\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"154\" width=\"1674\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/instance-limits.jpg#ZgotmplZ\" alt=\"Instance limits\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Once you\u2019re happy, click <strong>Save<\/strong> to save and redeploy.<\/p>\n<blockquote>\n<p>Be careful with autoscaling! You can easily ramp up a huge bill if you set the thresholds too low or if you\u2019re too cavalier with the default instance limits. It\u2019s a good idea to configure your <strong>Subscription<\/strong> with some budgets and cost limits!<\/p>\n<\/blockquote>\n<p>If you see a <code>MissingSubscriptionRegistration<\/code> error when trying to save the settings, you need to browse to your <strong>Subscription<\/strong> in the Azure portal, click through to <strong>Resource providers<\/strong>, and <strong>Register<\/strong> <code>microsoft.insights<\/code>.<\/p>\n<div style=\"aspect-ratio: 1920 \/ 648;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/register-microsoft-insights.jpg\" title=\"Register microsoft insights\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"648\" width=\"1920\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/register-microsoft-insights.jpg#ZgotmplZ\" alt=\"Register microsoft insights\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<h3 id=\"test-the-server\">Test the server<\/h3>\n<p>Finally, go to the <strong>Overview<\/strong> leaf of the App Service.<\/p>\n<p>Here, click <strong>Refresh<\/strong> until you see as many <strong>Healthy<\/strong> instances as you configured the minimum for your autoscaling setup.<\/p>\n<div style=\"aspect-ratio: 1826 \/ 498;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/healthy-tagging-server.jpg\" title=\"Healthy tagging server\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"498\" width=\"1826\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/healthy-tagging-server.jpg#ZgotmplZ\" alt=\"Healthy tagging server\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Next, click the <strong>URL<\/strong> in the Overview dashboard to open the Tagging server URL in a new tab. You should see the <code>Not found<\/code> message again.<\/p>\n<p>And, again, add the <code>\/healthy<\/code> path to the end of the URL and you should see the <code>ok<\/code> message.<\/p>\n<p>If you want to take testing a step further, you can copy the URL to your Tagging server and add it to your <strong>Server container settings<\/strong> in the Google Tag Manager UI, like so:<\/p>\n<div style=\"aspect-ratio: 1142 \/ 628;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/container-settings.jpg\" title=\"Container Settings\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"628\" width=\"1142\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/container-settings.jpg#ZgotmplZ\" alt=\"Container Settings\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Click <strong>Save<\/strong> to save the settings.<\/p>\n<p>Now, you can click the <strong>Preview<\/strong> button in the GTM UI to open a Preview mode window to your server-side tagging environment.<\/p>\n<div style=\"aspect-ratio: 1034 \/ 436;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/preview-container.jpg\" title=\"Preview container\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"436\" width=\"1034\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/preview-container.jpg#ZgotmplZ\" alt=\"Preview container\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Then, in a new tab, browse to your Tagging server URL again. If you want, you can add a custom path to the request, such as <code>\/test<\/code>. When you browse to that URL, you should see an <strong>HTTP Error 400<\/strong> page.<\/p>\n<p>If you do, then <strong>everything is working fine!<\/strong>. A 400 error is returned by your Server container when there are no <a href=\"https:\/\/www.simoahava.com\/analytics\/server-side-tagging-google-tag-manager\/#clients-and-tags\">Clients to claim the request<\/a>.<\/p>\n<p>If you now open the Preview mode tab, you should see the request for the URL you visited.<\/p>\n<div style=\"aspect-ratio: 1522 \/ 1132;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/test-request.jpg\" title=\"Test request\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1132\" width=\"1522\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/test-request.jpg#ZgotmplZ\" alt=\"Test request\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Well done! You now have a fully functioning server-side tagging setup running on Azure.<\/p>\n<h2 id=\"optional-configure-a-custom-domain\">(Optional) Configure a custom domain<\/h2>\n<p>This is where it gets tricky with Azure, unfortunately.<\/p>\n<p>With <a href=\"https:\/\/www.simoahava.com\/analytics\/deploy-server-side-google-tag-manager-aws\/\">Amazon AWS<\/a> and <a href=\"https:\/\/www.simoahava.com\/analytics\/provision-server-side-tagging-application-manually\/\">Google Cloud Platform<\/a>, mapping a custom domain <em>and<\/em> provisioning a (free) SSL certificate for it is super easy.<\/p>\n<p>With Azure, it\u2019s definitely easy to map a custom domain, and it\u2019s also quite easy to assign a free, managed SSL certificate to it. However, you can only add the <em>managed<\/em> SSL certificate to a <strong>subdomain<\/strong> if that subdomain is mapped with a <strong>CNAME DNS record<\/strong>. If the domain is mapped with an A record, you can only assign the managed certificate to an <strong>apex domain<\/strong> (i.e. naked domain name).<\/p>\n<p>This is a bummer, because you <em>want<\/em> to map your server-side GTM endpoint as a <strong>subdomain<\/strong> (so not an apex domain), and <em>specifically<\/em> with A records. Why? Because <a href=\"https:\/\/www.cookiestatus.com\/safari\/#cname-cloaking\">Safari \/ WebKit browsers shorten the lifetime of first-party cookies<\/a> set with HTTP responses from domains mapped with CNAME records!<\/p>\n<p>This is a considerable limitation of first-party data collection, which is why you should <em>always<\/em> use A records to map the subdomains you\u2019ll use with server-side tagging.<\/p>\n<p>Because of this, I won\u2019t go into the details of how to actually secure the domain name behind HTTPS. There are many options for you:<\/p>\n<blockquote>\n<p>I recommend taking a look at <strong>Let\u2019s Encrypt<\/strong>! It\u2019s very easy to apply the LE certificate to your service. Just follow the guide behind the link above and you\u2019ll be set in Azure. The only downside is that the certificate <strong>won\u2019t auto-renew<\/strong>, so you\u2019ll need to manually renew it whenever it\u2019s about to expire.<\/p>\n<\/blockquote>\n<p>There are many ways to skin the cat, and I leave it up to you to figure out which works best in your environment.<\/p>\n<p>To map the custom domain itself, you need to open your <strong>Tagging server<\/strong> App Service again.<\/p>\n<blockquote>\n<p>Remember, the custom domain only needs to be mapped for the <em>Tagging server<\/em> \u2013\u00a0the Preview server can use the <code>*.azurewebsites.net<\/code> URL.<\/p>\n<\/blockquote>\n<p>Here, choose <strong>Custom domains<\/strong> in the navigation.<\/p>\n<p>Next, toggle <strong>HTTPS Only<\/strong> <em>on<\/em>.<\/p>\n<div style=\"aspect-ratio: 1590 \/ 1110;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/toggle-https-on.jpg\" title=\"Toggle HTTPS on\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"1110\" width=\"1590\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/toggle-https-on.jpg#ZgotmplZ\" alt=\"Toggle HTTPS on\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Now, copy the <strong>IP address<\/strong> string. In your <strong>DNS hosting service<\/strong>, add a new <strong>A record<\/strong> for the subdomain you want to map, and make that point to the IP address.<\/p>\n<p>This is what my subdomain mapping looks like in GoDaddy. I\u2019ve chosen <code>sgtm-demo.teamsimmer.com<\/code> as one of the custom domains I\u2019ll map to this service.<\/p>\n<div style=\"aspect-ratio: 1744 \/ 376;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/ip-a-record.jpg\" title=\"IP A record\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"376\" width=\"1744\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/ip-a-record.jpg#ZgotmplZ\" alt=\"IP A record\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Next, copy the <strong>Custom Domain Verification ID<\/strong> from the Azure App Service page. Create a new <strong>TXT record<\/strong> with that value, and set the host to your subdomain name <strong>prefixed with <code>asuid.<\/code><\/strong>. For example, this is what my TXT record looks like:<\/p>\n<div style=\"aspect-ratio: 2142 \/ 462;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/txt-record.jpg\" title=\"TXT record\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"462\" width=\"2142\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/txt-record.jpg#ZgotmplZ\" alt=\"TXT record\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>When done, return to the Azure App Service page and click <strong>+ Add custom domain<\/strong>. Type the full name of your custom domain. In my case it was <code>sgtm-demo.teamsimmer.com<\/code>.<\/p>\n<div style=\"aspect-ratio: 588 \/ 382;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/add-custom-domain.jpg\" title=\"Add custom domain\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"382\" width=\"588\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/add-custom-domain.jpg#ZgotmplZ\" alt=\"Add custom domain\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Click <strong>Validate<\/strong>, wait for the green checkmarks, and then click <strong>Add custom domain<\/strong>.<\/p>\n<blockquote>\n<p>You might have to wait a while for DNS to propagate, so don\u2019t lose hope if validation doesn\u2019t pass immediately.<\/p>\n<\/blockquote>\n<p>Now that you\u2019ve added the custom domain, you\u2019ll need to configure SSL for it. I\u2019ll let you figure out how to do this, following the tips I added at the beginning of this chapter.<\/p>\n<p>Here\u2019s what the setup looks like after configuring SSL properly. I used <a href=\"https:\/\/dev.to\/ope\/securing-your-azure-web-app-with-let-s-encrypt-4g99\">Let\u2019s Encrypt<\/a> to assign a free certificate for the domain.<\/p>\n<div style=\"aspect-ratio: 1542 \/ 364;\" class=\"figure nocaption\">\n<p>    <a href=\"https:\/\/www.simoahava.com\/images\/2021\/11\/ssl-domain.jpg\" title=\"SSL domain\"><\/p>\n<p>    <img decoding=\"async\" class=\"fig-img\" height=\"364\" width=\"1542\" loading=\"lazy\" src=\"https:\/\/www.simoahava.com\/images\/2021\/11\/ssl-domain.jpg#ZgotmplZ\" alt=\"SSL domain\"\/><\/p>\n<p>    <\/a><\/p>\n<\/div>\n<p>Once you\u2019ve configured the domain, you can add it to your Google Tag Manager Server <strong>container settings<\/strong> as the Server Container URL.<\/p>\n<p>After that, you can communicate with the server-side tagging endpoint using your custom domain!<\/p>\n<p>That\u2019s it \u2013\u00a0we\u2019re all set.<\/p>\n<h2 id=\"summary\">Summary<\/h2>\n<p>I hope the length of this guide didn\u2019t fool you \u2013 setting up the server-side tagging environment in Microsoft Azure is a <em>breeze<\/em>.<\/p>\n<p>I really like working in Azure. It gets far less love than AWS and GCP, for no good reason. The accessibility is almost on par with Google Cloud Platform, the documentation is <em>excellent<\/em>, and the costs are competitive.<\/p>\n<p>The only downside I could think of in this particular setup was the lack of a <strong>managed SSL certificate<\/strong> option for subdomains. However, I imagine it\u2019s on the roadmap, as provisioning the managed certificate for apex domains set with A records was introduced only a short while ago.<\/p>\n<p>With server-side tagging, it\u2019s important to <em>shop around<\/em>. Setting it up with the default, automatically provisioned Google App Engine service is very easy and very fast, but the lack of customization options and the fixed cost might be a turn-off for some.<\/p>\n<p>I wish someone out there would write an article comparing the realistic costs of different cloud infrastructure options for server-side tagging. It would be interesting to see how different cloud stacks balance between computation and cost in a way that still lets you collect data without too much compromise.<\/p>\n<p>I hope you found this guide useful! Please let me know in the comments if you have any questions.<\/p>\n<\/p><\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>To continue my extensive collection of Google Tag Manager\u2019s server-side tagging articles, in this guide I\u2019ll walk you through how to set up a Server container in Microsoft Azure\u2019s App Service platform. For my previous guides on manually provisioning a Server container, follow these links: Azure\u2019s App Service is similar to AWS Elastic Beanstalk and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":64912,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12033],"tags":[4364,16362,18475,4934,29117],"dealstore":[],"offerexpiration":[],"class_list":["post-64911","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","tag-app","tag-azure","tag-serverside","tag-service","tag-tagging"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Server-side Tagging With Azure App Service - Som2ny Network<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fivemor.com\/?p=64911\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Server-side Tagging With Azure App Service - Som2ny Network\" \/>\n<meta property=\"og:description\" content=\"To continue my extensive collection of Google Tag Manager\u2019s server-side tagging articles, in this guide I\u2019ll walk you through how to set up a Server container in Microsoft Azure\u2019s App Service platform. For my previous guides on manually provisioning a Server container, follow these links: Azure\u2019s App Service is similar to AWS Elastic Beanstalk and [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fivemor.com\/?p=64911\" \/>\n<meta property=\"og:site_name\" content=\"Som2ny Network\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-02T20:54:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/server-side-tagging-with-azure-app-service-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1442\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fivemor.com\/?p=64911#article\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/?p=64911\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\"},\"headline\":\"Server-side Tagging With Azure App Service\",\"datePublished\":\"2025-02-02T20:54:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=64911\"},\"wordCount\":3920,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=64911#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/server-side-tagging-with-azure-app-service-scaled.jpg\",\"keywords\":[\"APP\",\"Azure\",\"Serverside\",\"Service\",\"Tagging\"],\"articleSection\":[\"Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fivemor.com\/?p=64911#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fivemor.com\/?p=64911\",\"url\":\"https:\/\/fivemor.com\/?p=64911\",\"name\":\"Server-side Tagging With Azure App Service - Som2ny Network\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=64911#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=64911#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/server-side-tagging-with-azure-app-service-scaled.jpg\",\"datePublished\":\"2025-02-02T20:54:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fivemor.com\/?p=64911#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fivemor.com\/?p=64911\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/?p=64911#primaryimage\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/server-side-tagging-with-azure-app-service-scaled.jpg\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/server-side-tagging-with-azure-app-service-scaled.jpg\",\"width\":2560,\"height\":1442},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fivemor.com\/?p=64911#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fivemor.com\/?bp_activities=1\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Server-side Tagging With Azure App Service\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fivemor.com\/#website\",\"url\":\"https:\/\/fivemor.com\/\",\"name\":\"Som2ny Network\",\"description\":\"Daily Deals\",\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fivemor.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/fivemor.com\/#organization\",\"name\":\"Som2ny Network\",\"url\":\"https:\/\/fivemor.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png\",\"width\":300,\"height\":86,\"caption\":\"Som2ny Network\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png\",\"caption\":\"admin\"},\"sameAs\":[\"https:\/\/fivemor.com\"],\"url\":\"https:\/\/fivemor.com\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Server-side Tagging With Azure App Service - Som2ny Network","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fivemor.com\/?p=64911","og_locale":"en_US","og_type":"article","og_title":"Server-side Tagging With Azure App Service - Som2ny Network","og_description":"To continue my extensive collection of Google Tag Manager\u2019s server-side tagging articles, in this guide I\u2019ll walk you through how to set up a Server container in Microsoft Azure\u2019s App Service platform. For my previous guides on manually provisioning a Server container, follow these links: Azure\u2019s App Service is similar to AWS Elastic Beanstalk and [&hellip;]","og_url":"https:\/\/fivemor.com\/?p=64911","og_site_name":"Som2ny Network","article_published_time":"2025-02-02T20:54:22+00:00","og_image":[{"width":2560,"height":1442,"url":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/server-side-tagging-with-azure-app-service-scaled.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin","Est. reading time":"20 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fivemor.com\/?p=64911#article","isPartOf":{"@id":"https:\/\/fivemor.com\/?p=64911"},"author":{"name":"admin","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371"},"headline":"Server-side Tagging With Azure App Service","datePublished":"2025-02-02T20:54:22+00:00","mainEntityOfPage":{"@id":"https:\/\/fivemor.com\/?p=64911"},"wordCount":3920,"commentCount":0,"publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"image":{"@id":"https:\/\/fivemor.com\/?p=64911#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/server-side-tagging-with-azure-app-service-scaled.jpg","keywords":["APP","Azure","Serverside","Service","Tagging"],"articleSection":["Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fivemor.com\/?p=64911#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fivemor.com\/?p=64911","url":"https:\/\/fivemor.com\/?p=64911","name":"Server-side Tagging With Azure App Service - Som2ny Network","isPartOf":{"@id":"https:\/\/fivemor.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fivemor.com\/?p=64911#primaryimage"},"image":{"@id":"https:\/\/fivemor.com\/?p=64911#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/server-side-tagging-with-azure-app-service-scaled.jpg","datePublished":"2025-02-02T20:54:22+00:00","breadcrumb":{"@id":"https:\/\/fivemor.com\/?p=64911#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fivemor.com\/?p=64911"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/?p=64911#primaryimage","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/server-side-tagging-with-azure-app-service-scaled.jpg","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/02\/server-side-tagging-with-azure-app-service-scaled.jpg","width":2560,"height":1442},{"@type":"BreadcrumbList","@id":"https:\/\/fivemor.com\/?p=64911#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fivemor.com\/?bp_activities=1"},{"@type":"ListItem","position":2,"name":"Server-side Tagging With Azure App Service"}]},{"@type":"WebSite","@id":"https:\/\/fivemor.com\/#website","url":"https:\/\/fivemor.com\/","name":"Som2ny Network","description":"Daily Deals","publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fivemor.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/fivemor.com\/#organization","name":"Som2ny Network","url":"https:\/\/fivemor.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/#\/schema\/logo\/image\/","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png","width":300,"height":86,"caption":"Som2ny Network"},"image":{"@id":"https:\/\/fivemor.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png","caption":"admin"},"sameAs":["https:\/\/fivemor.com"],"url":"https:\/\/fivemor.com\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/64911","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=64911"}],"version-history":[{"count":0,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/64911\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/media\/64912"}],"wp:attachment":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=64911"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=64911"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=64911"},{"taxonomy":"dealstore","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fdealstore&post=64911"},{"taxonomy":"offerexpiration","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fofferexpiration&post=64911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}