[object Object]

← 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

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 →