Stub-text
Tracking-infrastrukturen för Safariresor: hur data samlas in och flödar. GTM-stack (web GTM-5MZLHLWR + server GTM-PM5FJNG), Cloud Run gtm-server europe-west1, server-side tagging-container med custom domains tracking.safariresor.se/safarirejser.dk/safarireiser.no. Catch first-party-proxy (LIVE 2026-04-29) som monkey-patchar fetch+XHR och dirigerar form-submits till tracking-domän. Server template Catch Submit Proxy. Sanity-check-rutin efter deploy. SST-cookies FPID 730d, sr_first_touch 90d, _gcl/_fbp 90d. Meta CAPI server (tag 13 skicka_forfragan + tag 15 Lead) på pixel 565967720230784. Web Tag 9, Tag 66 standard Lead. Advanced matching (4 Custom JS-vars User Email/Phone/First Name/Last Name) mappad i GA4 Form Event tag 27. PII-flödet: server-CAPI saknar email/phone idag eftersom Catch Submit Receiver-templaten parsar bara request_body_raw, inte multipart-bodyn. Fix-vägar A) patcha receiver, B) AAM på web Tag 8, C) städa dual-tracking. Tracking-audit 1 maj-fynd: server-tags consent notSet, dual CAPI Tag 13+15, GA4 form_submit auto-tracking missar Catch (relativ fetch), cross-domain self-referrals safariresor.se/no/dk, payex.com strippar UTM, generate_lead = 0 i GA4 men 50 i Meta. Meta-pixel-blockering 2 maj: firstName + lastName i URL query parameters på PageView blockerade. Hidden field attribution v57 (Tag 99 First-Touch Capture, Tag 100 Form Hidden Fields, 18 fält). Centrala IDs: GTM Account 235612249, GCP gen-lang-client-0542783734 (47737689696), Google Ads SE/DK 1424453022 NO 8777829078, GA4 property 353827513, Meta act_1504707639832600 + pixel 565967720230784, BidTheatre Network 774. Använd vid frågor om GTM-tags, server-side tagging, Cloud Run gtm-server, Catch-proxyn, fetch-monkey-patch, hidden fields, CAPI, advanced matching, PII, consent, tracking-domän, payex, cross-domain attribution, sanity-check.
Fullständigt arkiv
Tracking-stack: GTM, server-container, Catch-proxyn, CAPI, PII-flöde
Senast uppdaterad: 2026-05-03 Refresh-källa: /workspace/project/groups/safariresor/memory.md + /workspace/project/groups/safariresor/memory/catch-form-proxy-gtm.md + /workspace/project/groups/safariresor/memory/gtm-stack.md
GTM-containrar och versioner
- Account: 235612249
- Web container: GTM-5MZLHLWR (intern 172767100). Workspace 55 v51 publicerat 2026-04-15. Workspace 61 v57 publicerat 2026-04-23 med hidden field attribution. Workspace 64 v2 publicerat 2026-04-29 med Catch-proxy.
- Server container: GTM-PM5FJNG (intern 113031329). Default workspace publicerat 2026-04-15. Workspace 18 publicerat 2026-04-29 med Catch Submit Proxy. Workspace 4 (Meta CAPI) skapat men EJ publicerat ursprungligen, aktiverat senare.
- Legacy web container: GTM-P93KF7 (ej i bruk).
Server-side på Cloud Run
- GCP-projekt:
gen-lang-client-0542783734 (projektnummer 47737689696)
- Cloud Run service:
gtm-server i europe-west1, URL https://gtm-server-c2nznglgia-ew.a.run.app
- Preview service:
gtm-server-preview (RUN_AS_PREVIEW_SERVER=true), separat service annars infinite loop
- Image:
gcr.io/cloud-tagging-10302018/gtm-cloud-image:stable, min/max 1/3 instanser, 512Mi
- CONTAINER_CONFIG:
aWQ9R1RNLVBNNUZKTkcmZW52PTEmYXV0aD0zZWVoQTdkRnVHWGJRc2dGeVM5Q3R3
Tracking-domäner (first-party)
tracking.safariresor.se LIVE
tracking.safarirejser.dk LIVE
tracking.safarireiser.no väntar på TXT-verifiering i Loopia
- DNS: CNAME
tracking → ghs.googlehosted.com.. Domain verification via INET_DOMAIN, dataextractor SA som verified owner.
- Web-containerns transport URL routas via Lookup Table-variabel "Lookup - Transport URL" (ID 97) baserat på Page Hostname.
Catch first-party-proxy (LIVE 2026-04-29 ~18:55)
Catch-widgeten submitar via fetch med relativ URL ajax, INTE native form-submit. Submit-event-listener på <form> fångar därför ALDRIG submission. Lösningen är monkey-patch.
- Web Tag 102 "Catch Form Re-routing" (workspace 64): patchar
window.fetch + XMLHttpRequest.prototype.open. Matchar www.safariresor.se|safarirejser.dk|safarireiser.no + /ajax(/)? och dirigerar om till tracking.safariresor.se/catch-submit?path=/<lokalt path>. Trigger 101 = Page View All Pages. Fingerprint 1777481689635.
- Server Template 16 "Catch Submit Proxy" (workspace 18): all-in-one Custom Client (claimRequest + sendHttpRequest + returnResponse). Client 19 har
forwardUrlMap SE/DK/NO origin → www/ajax. pathWhitelist: /forfragan, /foresporgsel, /foresporsel.
- Verifierat på safarireiser.no/foresporsel 18:57: POST → tracking-domän, 200 OK, multipart/form-data preserverat, response 4139 bytes, "Takk for din forespørsel!" visas.
- dataLayer-events:
catch_proxy_initialized (pageload), catch_proxy_intercept (med catch_proxy_method: 'fetch', catch_proxy_orig_url: 'ajax').
- GTM ECMASCRIPT_5 strict mode-quirk: function declarations inuti block (inuti
try) ger compiler error. Använd ALLTID function expressions: var foo = function() {...}.
SST-cookies (server-set, livslängd)
FPID: 730 dagar (server-set via GA4 Client)
sr_first_touch: 90 dagar, .safariresor.se-domän
_gcl_*, _fbp: 90 dagar (default)
Meta Pixel + CAPI
- Pixel ID: 565967720230784 (samma som Topp Afrika använder, OBS!)
- Web Tag 9 (Custom HTML "Skicka forfragan"): avpausad + consent 2026-04-13.
- Web Tag 66: ändrad till standard
Lead-event. Dual-tracking pågår.
- Server Tag 13: override custom event
skicka_forfragan (workspace 4)
- Server Tag 15: standard
Lead-event
- CAPI access token: genererad 2026-04-14, Stape FB CAPI-template
- Auto Config: Tag 66 har
disableAutoConfig=false, Meta auto-detekterar form-interaktioner som Lead.
- Optimization: Meta-leadkampanjer optimerar mot custom event
skicka_forfragan. I API:t = action_type: offsite_conversion.fb_pixel_custom, INTE lead. Stora skillnader mot standard-Lead-API.
- 2 maj 2026: PII i URL blockerad av Meta.
firstName + lastName på PageView som URL query parameters, detected 2026-05-01, blocked 08:19. Wizard-flödet på /forfragan skriver PII till URL (deep linking/back-fwd). 199 events flaggade has_pii på 30 dagar (98 Lead + 98 skicka_forfragan). Fix-vägar: A) frontend-fix tar bort PII från URL, B) GTM-patch override page_location i pixel-tag innan Meta ser den, C) blockera PageView från /forfragan (drastiskt). v61 publicerades 2 maj med fix, has_pii-flagg gick till 0.
Advanced matching (web → CAPI)
- 4 Custom JS-vars i web container: User Email (91), User Phone (92), User First Name (93), User Last Name (94)
- GA4 - Form Event (tag 27) mappar PII till
user_data.email_address, phone_number, address.first_name, address.last_name. Setup-script: gtm-advanced-matching.js.
- 6 form event-params:
form_price, form_trip, form_country, form_type, form_budget, form_persons (vars Form Budget 95 + Form Persons 96).
PII-flödet (kritisk gotcha, 2 maj-genomgång)
Server-CAPI ser INGEN email/phone idag trots att advanced matching finns på web-sidan:
- Web tag 27 (GA4 Form Event) läser PII via Custom JS-vars och postar DIREKT till Google (klient-side GA4). Går aldrig via server-containern.
- Catch Submit Receiver-templaten (server) tar emot fetch-interceptet men parsar bara bodyn som rå sträng till
request_body_raw. Extraherar INTE email/phone/namn ur multipart-bodyn till top-level eventData.
- Stape FB CAPI-template (server tag 13/15) letar efter
email, phone, firstName, lastName på root-nivå eller user_data.em/ph/fn/ln. Hittar inget.
Konsekvens: Server CAPI-tags 13+15 har inga userDataObject/customDataObject. CAPI till Meta saknar match-quality.
Fix-vägar (rekommenderad: A + C i ny workspace):
- A) Patcha Receiver-templaten att parsa multipart-bodyn och pusha email/phone/firstName/lastName som top-level fält i eventData.
- B) Lägg AAM-objekt i web Tag 8 (Meta - Config):
em: {{JS - User Email}}, ph: {{JS - User Phone}}, .... Pixeln skickar hashade user_data via web direkt.
- C)
Städa Tag 13 + Tag 15 Inte dubbelräkning. Tag 13 = skicka_forfragan (custom event som leadkampanjer optimerar mot), Tag 15 = standard Lead. Olika events, medvetet upplägg.
- D) Separat web tag som vid form submit gör direkt fetch till
tracking.safariresor.se med JSON-PII parallellt.
Tracking-audit-fynd 1 maj
Live-genomgång av GTM-stack, GA4 och Meta:
- Server-tags consent: GA4, Conversion Linker, Google Ads SE/NO, Meta CAPI x2 har alla
consentStatus: notSet. Webcontainer kräver consent men server-tags fyrar utan check, inkonsekvent men troligen by design.
- Dual Meta CAPI (medvetet, INTE dubbelräkning): Tag 13 (skicka_forfragan, custom event som leadkampanjer optimerar mot) + Tag 15 (standard Lead). Två olika events, designat så.
- GA4 form-events dual-trackar: form_start (Enhanced Measurement) + Form Started (Tag 48) ~identiska volymer (314 vs 311 på 7d /mina-sidor/).
- GA4 form_submit auto-tracking fångar inte Catch-formuläret (relativ fetch): 14d har 153 "Skicka forfrågan" events vs 2 form_submit.
- Cross-domain self-referrals: safariresor.se (22 sess), safarireiser.no (16), safarirejser.dk (5). Sessioner splittas mellan deras egna domäner.
- Direct/(none) 21% + (not set) 268 sessioner. Stor andel attribution tappad.
- admin.safariresor.se /referral 20 sess + payex.com /referral 27 sess: backend-redirects och betalretur strippar UTM-params.
- generate_lead = 0 events i GA4 (7d), Meta rapporterar 50. Stort tracking-gap.
- CAPI tystnad 30 apr ~21:00 UTC: efter trigger-byte fyrar inte längre Tag 27, server-CAPI gick tyst tills v61-publish 3 maj.
Hidden field attribution (live 2026-04-23, GTM v57)
- Tag 99 First-Touch Capture: cookie
sr_first_touch 90d på .safariresor.se + localStorage
- Tag 100 Form Hidden Fields: 18 hidden inputs via MutationObserver. 10 first-touch (utm_*, gclid, fbclid, landing_page, referrer, first_touch_timestamp), 5 session, 3 click-IDs (gbraid, wbraid, msclkid).
- Catch backend (MODX/Catchmedia): Lagrade ursprungligen bara 5 UTM-fält i
assignment.properties.utm.. 2026-04-25 implementerade Henning backend-stöd för 13 nya fält under assignment.properties.trackers.. Verifierat: inquiry 17188 har riktig gclid lagrad.
- Bugg kvar:
inputFName/inputLName saknas i selectors för stegvist /forfragan.
- Bug Tag 99 (verifierad 4/5): Cookie-domän hardcodad till
.safariresor.se → cookien droppas silent på .no/.dk. Cookie-existens-check missar edge case där intern navigation skriver tom data över befintlig. Resultat: 0% tracker_gclid på .no/.dk inquiries (0/48), ~30% tappade på .se. Fix-väg: dynamisk resolveCookieDomain() + readExisting() läser localStorage+cookie + bail när !hasData.
- Preferens (Jonatan, 4/5): Default-fix för tracker_-fältsmissmatch är BQ-side parse i catch-bq-sync (post-process på
tracker_referrer-URL:en till tracker_gclid/utm_-kolumner), inte att vänta på Catch-backenden. Snabbare, fixar historik + framtid samtidigt.
Formulärtyper (DOM)
Tre formulärtyper finns på Safariresor:
- Trip / destination: använder
primaryInputName (gemensamt fält).
- Stegvist
/forfragan: använder inputFName / inputLName (selectors saknas i Tag 27 advanced matching, öppen bugg).
- Kontakt: använder
inputFornamn / inputEfternamn.
DOM-struktur stegvist /forfragan:
- Formulär-ID:
allDate
- Steg via
data-step (date, month, country, journey, withPerson, budget, last)
- Companion-val: 4 DIV-knappar med
data-next. "Min familj" / "Mina vänner" går till räknare. "Min partner" / "Jag reser själv" skippar.
- Vald knapp markeras
btn-danger
- Räknare: 3x
.js-counter-span (vuxna, barn 12-16, barn 0-11)
- Budget radios: 80-150k, 60-80k, 45-60k, 35-45k, 150k+, Obestämd
Catch REST API
- Base:
https://api.safariresor.se/rest/
- Auth: Bearer (
CATCH_API_KEY i .env)
- Endpoints:
/inquiry, /offer, /booking, /sales, /trips, /destination, /assignment
- Filter-syntax:
filter[field][operator]=value. T.ex. /booking/?filter[editedon][gt]=... fungerar för delta-sync.
- Response-format:
{ success, list, total }. Bookings-endpointen ger intermittent HTTP 500, hanteras med page-size-halvering.
- Hidden attribution-fält lagras under
assignment.properties.utm. (5 UTM) och assignment.properties.trackers. (13 övriga, sedan 2026-04-25).
- Referensdoc: https://docs.google.com/document/d/16dryvr8RyvNYQEafr63FQWeSpqmnCx12DcfbeGlhJwI/edit
Centrala IDs (snabbreferens)
- GTM Account: 235612249, Web GTM-5MZLHLWR, Server GTM-PM5FJNG (113031329)
- GCP:
gen-lang-client-0542783734 (47737689696), Cloud Run europe-west1
- Google Ads: MCC 337-360-7442, NO 8777829078, SE/DK 1424453022, SE conv 994089998, NO conv 828096526, API v20
- GA4: Property 353827513, SE G-F0132X7QFJ, NO G-P61VDXLDD3 (pausad)
- Meta: Pixel 565967720230784, AdAcc act_1504707639832600, FB Page SE 434566843285052, NO 323906687650283
- Microsoft UET: 211072413
- Cookiebot: 03fe834b-acf1-44e1-b59e-db707ac8c9bb
- SA:
republiken-shared för GA4/GTM/BQ, dataextractor för Drive/DWD (har INTE access på GA4 property 353827513). dataextractor har edit men inte publish på GTM, Jonatan publicerar manuellt.
[2026-04-23] Hidden field attribution live (GTM v57) + Catch-API integrerat
- GTM: Workspace 61 → version 57 publicerad. Tag 99 First-Touch Capture (cookie
sr_first_touch 90d, .safariresor.se, + localStorage) + Tag 100 Form Hidden Fields (18 hidden inputs, MutationObserver).
- 18 fält: 10 first-touch (utm_*, gclid, fbclid, landing_page, referrer, first_touch_timestamp) + 5 session + 3 click-IDs (gbraid, wbraid, msclkid).
- Catch backend (MODX Revolution via Catchmedia): Tar emot alla 18 fält men LAGRAR bara de 5 UTM-fälten (
assignment.properties.utm.*). 13 övriga persisteras inte utan backend-extension.
- Test-inquiry 2026-04-23: inquiry.id=17188, assignment.id=17191, customer.id=20172, trip_id=4194 (channel SE).
- Catch REST API: Base
https://api.safariresor.se/rest/, Bearer-auth (CATCH_API_KEY). Endpoints: /inquiry, /offer, /booking, /sales, /trips, /destination, /assignment. Filter: filter[field][operator]=value.
- Mail till Henning 2026-04-23 ~11:41 (tråd "Sv: API el. databas?"): behåll UTM, utöka backend för 13 fält, modifiedon-filter, destination-modellering.
- Referensdoc: https://docs.google.com/document/d/16dryvr8RyvNYQEafr63FQWeSpqmnCx12DcfbeGlhJwI/edit