← back to Domain Landings
TK-10631: stage gated 12-property GA4 create script (approval-gated Google write)
c630ac0fd1f64137345b1cada8e8fa8a3209c58a · 2026-08-27 10:27:18 -0700 · Steve Abrams
Files touched
A ops/tk10631/create_12_ga4.py
Diff
commit c630ac0fd1f64137345b1cada8e8fa8a3209c58a
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu Aug 27 10:27:18 2026 -0700
TK-10631: stage gated 12-property GA4 create script (approval-gated Google write)
---
ops/tk10631/create_12_ga4.py | 60 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)
diff --git a/ops/tk10631/create_12_ga4.py b/ops/tk10631/create_12_ga4.py
new file mode 100644
index 0000000..d5ff36e
--- /dev/null
+++ b/ops/tk10631/create_12_ga4.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python3
+"""TK-10631: create 12 GA4 properties for DW domain landers lacking GA4.
+GATED: this is a Google-account write — run only with approval.
+Idempotent (skips existing display names under APPS). Read-back verifies
+each domain->measurement_id mapping before recording it."""
+import json, time
+from google.oauth2 import service_account
+from google.analytics.admin import AnalyticsAdminServiceClient
+from google.analytics.admin_v1alpha.types import Property, DataStream
+
+KEY="/Users/macstudio3/.config/ga-analytics-agent/service-account.json"
+APPS_ACCOUNT="accounts/371997142" # Steve Abrams APPS
+SCOPES=["https://www.googleapis.com/auth/analytics.edit",
+ "https://www.googleapis.com/auth/analytics.readonly"]
+NAMES={
+ "designerswallpapers.com":"Designers Wallpapers",
+ "designerwallpaints.com":"Designer Wall Paints",
+ "designerwalltiles.com":"Designer Wall Tiles",
+ "handmadewallpapers.com":"Handmade Wallpapers",
+ "handscreenedwallpaper.com":"Handscreened Wallpaper",
+ "hospitalitymurals.com":"Hospitality Murals",
+ "luxurymurals.com":"Luxury Murals",
+ "theatrewallpaper.com":"Theatre Wallpaper",
+ "wallpapernashville.com":"Wallpaper Nashville",
+ "wallpapernyc.com":"Wallpaper NYC",
+ "wc01wallpaper.com":"WC01 Wallpaper",
+ "hospitalityfabrics.net":"Hospitality Fabrics",
+}
+creds=service_account.Credentials.from_service_account_file(KEY,scopes=SCOPES)
+client=AnalyticsAdminServiceClient(credentials=creds)
+existing={}
+for s in client.list_account_summaries():
+ if s.account==APPS_ACCOUNT:
+ for p in s.property_summaries:
+ existing[p.display_name]=p.property
+results={}
+for domain,name in NAMES.items():
+ if name in existing:
+ prop_name=existing[name]; mid=None
+ for st in client.list_data_streams(parent=prop_name):
+ if st.web_stream_data and st.web_stream_data.measurement_id:
+ mid=st.web_stream_data.measurement_id; break
+ print(f"EXISTS {domain:30} {prop_name} mid={mid}")
+ results[domain]={"property":prop_name,"measurement_id":mid,"created":False}; continue
+ prop=Property(parent=APPS_ACCOUNT,display_name=name,time_zone="America/Los_Angeles",
+ currency_code="USD",industry_category="SHOPPING")
+ created=client.create_property(property=prop); prop_name=created.name
+ stream=DataStream(type_=DataStream.DataStreamType.WEB_DATA_STREAM,
+ display_name=f"{name} Web",
+ web_stream_data=DataStream.WebStreamData(default_uri=f"https://{domain}"))
+ st=client.create_data_stream(parent=prop_name,data_stream=stream)
+ mid=st.web_stream_data.measurement_id; ok=False
+ for s2 in client.list_data_streams(parent=prop_name):
+ if s2.web_stream_data and s2.web_stream_data.measurement_id==mid:
+ ok=(domain in s2.web_stream_data.default_uri) and mid.startswith("G-")
+ print(f"CREATED {domain:30} {prop_name} mid={mid} readback_ok={ok}")
+ results[domain]={"property":prop_name,"measurement_id":mid,"created":True,"readback_ok":ok}
+ time.sleep(0.4)
+json.dump(results,open("/tmp/tk10631_results.json","w"),indent=2)
+print("\nSUMMARY:",sum(1 for r in results.values() if r.get('measurement_id')),"of",len(NAMES),"have measurement_id")
← 677a4bc chore: v0.3.2 (session close — favicon fix lint/review)
·
back to Domain Landings
·
TK-10631: stage expanded GA4 create script for all 150 remai f5789c1 →