← back to Domain Landings
ops/tk10631/create_12_ga4.py
61 lines
#!/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")