over mij

Breng je tags op locatie: custom geolocatie headers in sGTM

25 November 2023 | 4 minuten lezen | Deel dit blog viaFacebook,LinkedIn,Twitter,WhatsApp
In de wereld van digitale ads en analytics is informatie over de globale locatie van gebruikers vaak nuttig. Een beter begrip van verschillen per regio betekent immers meer granulair inzicht in het gedrag van je gebruikers. Het kan het verschil zijn tussen een succesvolle of mislukte campagne. In dit blogartikel beschrijf ik hoe je geolocatie headers kunt integreren in server-side Google Tag Manager (sGTM).
Geolocatie Integratie in sGTM - Wereldbol met Dataconnecties
Afbeelding van een wereldbol met dataconnecties, gemaakt met DALL-E
Dit blog bouwt (wederom) voort op de kennis van ‘Host server-side GTM voor een paar euro per maand’ en ‘Host server-side GTM volledig bulletproof met logging’. Ik sta daarom niet zo nadrukkelijk stil bij de Docker commands, maar wel bij de configuratie van de Caddy proxy en Docker. Voor degenen die direct aan de slag willen met geolocaties en sGTM: je kan direct naar het einde van dit artikel springen voor een eenvoudig stappenplan. Een korte leeswijzer:
  1. Belangrijkste aanpassingen in het Caddy Image en Docker-Compose
  2. Configuratie van de Caddyfile voor Geolocatie
  3. MaxMind account + eenvoudig stappenplan

(1) Belangrijkste aanpassingen in het Caddy Image en Docker-Compose

Caddy Dockerfile en integratie van caddy-geoip2 plugin

Om geolocatie headers te onsluiten naar sGTM maken we gebruik van een aangepaste Caddy server. We maken hiervoor gebruik van de Caddy plugin ‘caddy-geoip2 ‘. Deze plugin stelt Caddy instaat om binnenkomende IP-adressen om te zetten naar geolocaties. De Dockerfile ziet er als volgt uit:
FROM caddy:2.7.4-builder AS builder
RUN xcaddy build \
	--with github.com/zhangjiayin/caddy-geoip2
FROM caddy:2.7.4-alpine
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
De Docker Image variant van bovenstaande Dockerfile is overigens beschikbaar in mijn repository. Het image kan je als volgt downloaden:
docker pull ghcr.io/frankdevlabs/caddy-geo-headers:v1.0.1

Docker-Compose bestand voor integratie van nieuwe Caddy image

De volgende stap is het vervangen van de standaard Caddy server. Het relevante snippet in het Docker-Compose bestand is als volgt:
version: '3.9'
services:
	…
proxy:
	image: ghcr.io/frankdevlabs/caddy-geo-headers:latest
	…
Deze aanpassing zorgt ervoor dat Caddy proxy de geolocatie doorgeeft aan de server-side tagging containers.

(2) Configuratie van de Caddyfile voor geolocatie

Caddy wordt geconfigureerd door de Caddyfile aan te passen. Het is nu van belang om de settings van het plugin caddy-geoip2 in dit bestand op te nemen. Want pas daarna zal de geolocatie kunnen worden doorgegeven aan sGTM. De documentatie van het plugin is hier te vinden. Het overnemen van deze settings is vrij eenvoudig en resulteert in het volgende Caddyfile betand:
{
  order geoip2_vars first
  # Only configure databaseDirectory and editionID when autoupdate is not desired.
  geoip2 {
	accountId     	{$MAXMIND_ACCOUNT_ID}
	databaseDirectory "/tmp/"
	licenseKey    	{$MAXMIND_LICENSE_KEY}
	lockFile      	"/tmp/geoip2.lock"
	editionID     	"GeoLite2-City"
	updateUrl     	"https://updates.maxmind.com"
	updateFrequency   86400   # in seconds
  }
}

(default_headers) {
  header_up Host {remote_host}
  header_up X-Forwarded-For {client_ip}
  # header_up X-Forwarded-Proto {scheme} Unnecessary header_up X-Forwarded-Proto: the reverse proxy's default behavior is to pass headers to the upstream
  header_up X-Forwarded-Host {remote_host}
}

(geoip_headers) {
  header_up X-GeoIP-City-Name {geoip2.city_name}
  header_up X-GeoIP-Continent-Code {geoip2.continent_code}
  header_up X-GeoIP-Continent-Name {geoip2.continent_name}
  header_up X-GeoIP-Country-Code {geoip2.country_code}
  header_up X-GeoIP-Country-Name {geoip2.country_name}
  header_up X-GeoIP-Country-EU {geoip2.country_eu}
  header_up X-GeoIP-Location-Accuracy-Radius {geoip2.location_accuracy_radius}
  header_up X-GeoIP-Location-Latitude {geoip2.location_latitude}
  header_up X-GeoIP-Location-Longitude {geoip2.location_longitude}
  header_up X-GeoIP-Location-Time-Zone {geoip2.location_time_zone}
}

{$TAG_SERVER_DOMAIN} {
  log {
	output file   	/etc/logs/{$TAG_SERVER_DOMAIN}-access.json {
  	roll_size 50mib
  	roll_keep 10
	}
  }
  geoip2_vars strict
  @hasGeoip expression {geoip2.country_code} != ""

    reverse_proxy @hasGeoip http://tag-server:8080 {
	import geoip_headers
	import default_headers
  }

  reverse_proxy http://tag-server:8080 {
	import default_headers
  }
}
{$PREVIEW_SERVER_DOMAIN} {
  log {
	output file   	/etc/logs/{$PREVIEW_SERVER_DOMAIN}-access.json {
  	roll_size 50mib
  	roll_keep 10
	}
  }
    reverse_proxy http://preview-server:8080 {
	import default_headers
    }
}
Door de headers ((geoip_headers) { … }) op te nemen in de reverse proxy-configuratie, zorgen we ervoor dat elke keer als een verzoek wordt doorgestuurd naar de sGTM-service, deze verrijkt wordt met waardevolle geolocatiegegevens. Dit stelt sGTM in staat om tags te genereren die aangepast zijn aan de locatie van de gebruiker, wat cruciaal is voor locatiegebaseerde personalisatie en analytics.Als je alles goed hebt gedaan, dan zijn de headers 'X-GeoIP-*' uit te lezen in je sGTM setup. Note: wat je precies met de geolocatie kan doen, laat ik even buiten beschouwing in dit blog!

(3) MaxMind account + eenvoudig stappenplan

Tot slot nog een kort stappenplan om bovenstaande setup te implementeren. Ik ga er (wederom) vanuit dat je al een docker swam hebt draaien (lees anders mijn eerdere blog). In aanvulling op eerdere blogs heb je ook nog een Maxmind account nodig. Dit is de technologie waarmee IP-adressen worden omgezet in een geolocatie.
  • (1) Maak een Maxmind account aan
Ga naar deze website en maak een Maxmind account aan. Je hebt dit nodig omdat de Caddy server de gratis Maxmind API gebruikt. In het .env bestand - wat hierna in nr. 3wordt beschreven - voer je de environment variables MAXMIND_LICENSE_KEY en MAXMIND_ACCOUNT_ID.
  • (2) Clone het repository
git clone https://github.com/frankdevlabs/sgtm-manual-server
  • (3) Maak het .env bestand aan:
cd sgtm-manual-server
cp .env.template .env
vim .env
Vervang vervolgens de placeholders met de relevante waarden voor jouw setup, waaronder ook de Maxmind variabelen die in stap 1 zijn beschreven. Note: dat DNS mapping naar je server al goed moet staan (zie wederom mijn eerdere blog).
  • (4) Start het docker sGTM stack
cd $HOME
cd sgtm-manual-server
git checkout feat/with-geo-headers
env $(cat ./.env | xargs) envsubst < ./docker-compose.yml | doc

Afsluiting

Dat is alles. Hiermee heb je een gedetailleerd overzicht van hoe je custom geolocatie headers kunt integreren in sGTM. Het enige wat je nodig hebt is in feite een proxy die het IP-adres omzet in een geolocatie. Dit is mogelijk met Caddy (met de geoip2 plugin), maar ook met NGINX of een andere proxyserver. De meeste sGTM-as-a-server providers (bijvoorbeeld Stape) beschikken overigens standaard over geolocatie headers. Dit is nog wat eenvoudiger dan alles handmatig instellen. Mocht je nog vragen of opmerkingen hebben, laat het weten!

Meer lezen?

Bekijk mijn andere blogs.

© 2021 Frank de Vries. Alle rechten voorbehouden
Privacy
RSS Feed