← 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")