[object Object]

← back to Ga Allsites

rollout-status: cycle 9 — Meta pixel paused on shared confs after 2 nginx breaks (recovered)

1ebbbf8ef3a83c85c7e01aef2815d85077019ded · 2026-08-17 15:57:35 -0700 · Steve Abrams

Files touched

Diff

commit 1ebbbf8ef3a83c85c7e01aef2815d85077019ded
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Aug 17 15:57:35 2026 -0700

    rollout-status: cycle 9 — Meta pixel paused on shared confs after 2 nginx breaks (recovered)
---
 _verify_ga4_gap.py                  |   27 +
 cache/_yoloforever_ledger.md        |    8 +
 create_dw_ga4.py                    |   46 ++
 create_shell_ga4.py                 |   38 ++
 gtm/coverage-matrix.json            | 1282 ++++++++++++++++++++++++++++++-----
 gtm/dw-no-meta.json                 |   33 +
 gtm/rollout-status.md               |   13 +
 scripts/batch_create_ga4.py         |  119 ++++
 scripts/batch_create_properties.py  |  172 +++++
 scripts/create_inject_properties.py |  125 ++++
 10 files changed, 1687 insertions(+), 176 deletions(-)

diff --git a/_verify_ga4_gap.py b/_verify_ga4_gap.py
new file mode 100644
index 0000000..862de3c
--- /dev/null
+++ b/_verify_ga4_gap.py
@@ -0,0 +1,27 @@
+import json,pathlib,re,ssl,urllib.request
+from concurrent.futures import ThreadPoolExecutor
+cand=open("/tmp/ga4_62.txt").read().split()
+ctx=ssl.create_default_context(); ctx.check_hostname=False; ctx.verify_mode=ssl.CERT_NONE
+# FIX (Cody): add gtm.js (GA4-via-GTM) + analytics.js so GTM-managed sites aren't false NO_GA4
+GA4=re.compile(r"(G-[A-Z0-9]{6,}|googletagmanager\.com/gtag/js|googletagmanager\.com/gtm\.js|gtag\('config'|GTM-[A-Z0-9]+|UA-\d{4,}|google-analytics\.com/analytics\.js|dataLayer)")
+def probe(d):
+    for s in ("https","http"):
+        try:
+            req=urllib.request.Request(f"{s}://{d}/",headers={"User-Agent":"Mozilla/5.0"})
+            html=urllib.request.urlopen(req,timeout=12,context=ctx).read(250000).decode("utf-8","ignore")
+            return (d,"HAS_GA4" if GA4.search(html) else "NO_GA4")
+        except Exception as e:
+            if s=="http": return (d,"UNREACHABLE")
+    return (d,"UNREACHABLE")
+res=list(ThreadPoolExecutor(max_workers=24).map(probe,cand))
+from collections import Counter
+c=Counter(x[1] for x in res)
+print("RE-VERIFY (with GTM/dataLayer detection):")
+for k,v in c.most_common(): print(f"  {k:12} {v}")
+no=sorted(d for d,s in res if s=="NO_GA4")
+unreach=sorted(d for d,s in res if s=="UNREACHABLE")
+pathlib.Path("cache/_ga4_inject_targets.json").write_text(json.dumps(no))
+pathlib.Path("cache/_ga4_unreachable.json").write_text(json.dumps(unreach))   # FIX: durable record
+print(f"\nTRUE inject targets (NO_GA4 even w/ GTM check): {len(no)}")
+print(f"UNREACHABLE (saved to cache/_ga4_unreachable.json for a retry): {len(unreach)}")
+print("unreachable:", unreach)
diff --git a/cache/_yoloforever_ledger.md b/cache/_yoloforever_ledger.md
index 403c6ad..bfddde6 100644
--- a/cache/_yoloforever_ledger.md
+++ b/cache/_yoloforever_ledger.md
@@ -6,3 +6,11 @@
 - **FINAL DTD:** C (HOLD-FOR-STEVE), unanimous among 3 voting (codex/kimi/qwen) + Claude.
 - **Cost:** DTD ~$0.004 · agents (Anthropic tokens) · probes $0 (local).
 - **Status:** PAUSED — only gated work remains; resumes on Steve's APPROVE.
+
+## Cycle 2 — 2026-08-17 (GA4 coverage → 200+)
+- **Landed (verified):** 21 GA4 properties created (Steve ran the write); 15 abrams-* migrated coming-soon→full GA4 landings (15/15 live+gtag); 6 real sites gtag-injected via nginx sub_filter (6/6 correct single id, no double-tag); fixed a pre-existing broken abramscivic nginx conf.
+- **Coverage: ~220 tracked (126 developed + 73 landings + 15 abrams + 6 real) — PAST 200+ target.**
+- **In pending-approval:** cleanup-15-stale-abrams-nginx-confs.md (LOW, hygiene, non-functional — classifier-gated).
+- **Cody (cycle 1) → FIX FIRST applied; cycle 2 self-verified (no double-tag, dl-batch-7 wins, nginx -t ok).**
+- **Verdict:** SHIP the cycle (objective met). PAUSE loop — only gated cleanup + 1 unreachable retry (lacountyeats) remain.
+- **Cost:** $0 (GA4 free, rest local/CF/nginx).
diff --git a/create_dw_ga4.py b/create_dw_ga4.py
new file mode 100644
index 0000000..ded2f05
--- /dev/null
+++ b/create_dw_ga4.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+"""Create the 2 pending DW GA4 properties in the DesignerWallcoverings.com
+account (15714274) — where the analytics SA already has Editor. Steve-run.
+Writes the new G-IDs back into the analytics rollout pending file.
+Usage:  python3 ~/Projects/ga-allsites/create_dw_ga4.py
+"""
+import json
+import pathlib
+from google.analytics.admin import AnalyticsAdminServiceClient, Property, DataStream
+
+KEY = pathlib.Path.home() / ".config" / "ga-analytics-agent" / "service-account.json"
+PENDING = pathlib.Path.home() / ".claude" / "skills" / "analytics" / "rollout" / "pending_ga.json"
+ACCOUNT = "accounts/15714274"  # DesignerWallcoverings.com — SA has Editor here
+
+TARGETS = [
+    ("Commercial Wallcovering", "commercialwallcovering.com"),
+    ("Hollywood Wallcovering",  "hollywoodwallcovering.com"),
+]
+
+client = AnalyticsAdminServiceClient.from_service_account_file(str(KEY))
+created = {}
+for display, domain in TARGETS:
+    try:
+        prop = client.create_property(property=Property(
+            parent=ACCOUNT, display_name=display,
+            time_zone="America/Los_Angeles", currency_code="USD",
+            industry_category="ONLINE_COMMUNITIES"))
+        stream = client.create_data_stream(parent=prop.name, data_stream=DataStream(
+            type_=DataStream.DataStreamType.WEB_DATA_STREAM,
+            display_name=f"{display} Web",
+            web_stream_data=DataStream.WebStreamData(default_uri=f"https://{domain}")))
+        mid = stream.web_stream_data.measurement_id
+        created[domain] = mid
+        print(f"CREATED  {domain:30} {mid}  ({prop.name})")
+    except Exception as e:  # noqa: BLE001
+        print(f"ERROR    {domain:30} {type(e).__name__}: {str(e)[:140]}")
+
+# write the measurement ids back into pending_ga.json
+if created and PENDING.exists():
+    data = json.loads(PENDING.read_text())
+    for s in data.get("sites", []):
+        if s.get("domain") in created and not s.get("measurement_id"):
+            s["measurement_id"] = created[s["domain"]]
+    PENDING.write_text(json.dumps(data, indent=2))
+    print(f"\nWrote {len(created)} G-ID(s) back to {PENDING}")
+print("\nNext: inject gtag via the staged runbook, then rebuild ga-allsites cache.")
diff --git a/create_shell_ga4.py b/create_shell_ga4.py
new file mode 100644
index 0000000..3359edf
--- /dev/null
+++ b/create_shell_ga4.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python3
+"""Create GA4 properties for the 25 zero-tracking 'shell' sites in the
+DesignerWallcoverings GA4 account (15714274, SA has Editor). Steve-run.
+Writes G-ids to gtm/shell-ga4.json; then Claude injects the gtag per site.
+Usage: python3 ~/Projects/ga-allsites/create_shell_ga4.py
+"""
+import json, pathlib
+from google.analytics.admin import AnalyticsAdminServiceClient, Property, DataStream
+KEY = pathlib.Path.home()/".config"/"ga-analytics-agent"/"service-account.json"
+ACCT = "accounts/15714274"
+SHELLS = {
+ "818butler.com":"818 Butler","abramscivic.com":"Abrams Civic","abramsdirectory.com":"Abrams Directory",
+ "abramsguide.com":"Abrams Guide","abramsindex.com":"Abrams Index","abramsindustries.com":"Abrams Industries",
+ "abramsintelligence.com":"Abrams Intelligence","abramslive.com":"Abrams Live","abramslocal.com":"Abrams Local",
+ "abramsmaps.com":"Abrams Maps","abramsmarkets.com":"Abrams Markets","abramsos.com":"Abrams OS",
+ "abramsprotection.com":"Abrams Protection","abramsspace.com":"Abrams Space","abramsterminal.com":"Abrams Terminal",
+ "abramsvc.com":"Abrams VC","allnewsdaily.com":"All News Daily","beverlyhillsbutler.com":"Beverly Hills Butler",
+ "beverlyhillsvideos.com":"Beverly Hills Videos","bhbutler.com":"BH Butler","boulevardbutler.com":"Boulevard Butler",
+ "cypresawards.com":"Cypres Awards","nodailyworries.com":"No Daily Worries","petitionyour.com":"Petition Your",
+ "studentdebtcrisis.org":"Student Debt Crisis"}
+client = AnalyticsAdminServiceClient.from_service_account_file(str(KEY))
+outf = pathlib.Path(__file__).parent/"gtm"/"shell-ga4.json"
+out = json.loads(outf.read_text()) if outf.exists() else {}
+for dom, name in SHELLS.items():
+    if out.get(dom):
+        print(f"SKIP {dom} (already {out[dom]})"); continue
+    try:
+        p = client.create_property(property=Property(parent=ACCT, display_name=name,
+            time_zone="America/Los_Angeles", currency_code="USD", industry_category="ONLINE_COMMUNITIES"))
+        s = client.create_data_stream(parent=p.name, data_stream=DataStream(
+            type_=DataStream.DataStreamType.WEB_DATA_STREAM, display_name=f"{name} Web",
+            web_stream_data=DataStream.WebStreamData(default_uri=f"https://{dom}")))
+        out[dom] = s.web_stream_data.measurement_id
+        print(f"CREATED {dom:32} {out[dom]}")
+    except Exception as e:  # noqa: BLE001
+        print(f"ERR {dom:32} {type(e).__name__}: {str(e)[:90]}")
+outf.write_text(json.dumps(out, indent=2))
+print(f"\n{len(out)}/25 -> {outf}. Now tell Claude 'inject the shells'.")
diff --git a/gtm/coverage-matrix.json b/gtm/coverage-matrix.json
index 1c456c9..1eb4c08 100644
--- a/gtm/coverage-matrix.json
+++ b/gtm/coverage-matrix.json
@@ -11,20 +11,20 @@
   },
   {
     "domain": "1800wallcoverings.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
   },
   {
     "domain": "1800wallpapers.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -131,10 +131,10 @@
   },
   {
     "domain": "800wallpaper.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -144,37 +144,67 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "818butlercom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "90210rentals.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "90210rentalscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "aaatreetrimming.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "aaatreetrimmingcom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "abramsatlas.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -184,51 +214,101 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramsciviccom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramsdirectory.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramsdirectorycom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramsguide.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramsguidecom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramsindex.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramsindexcom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramsindustries.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramsindustriescom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramsintel.com",
     "http": 429,
@@ -244,101 +324,201 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramsintelligencecom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramslive.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramslivecom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramslocal.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramslocalcom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramsmaps.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramsmapscom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramsmarkets.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramsmarketscom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramsos.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramsoscom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramsprotection.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramsprotectioncom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramsspace.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramsspacecom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramsterminal.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramsterminalcom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "abramsvc.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "abramsvccom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "agedwallpaper.com",
     "http": 200,
@@ -364,11 +544,21 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "allnewsdailycom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "apartmentwallpaper.com",
     "http": 200,
@@ -402,49 +592,59 @@
   {
     "domain": "asknonna.ai",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "asknonnaai.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "asseeninhotels.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
   },
   {
     "domain": "asseeninla.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
   },
   {
     "domain": "asseeninmovies.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
   },
   {
     "domain": "asseeninshowrooms.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -461,10 +661,10 @@
   },
   {
     "domain": "barwallpaper.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -472,22 +672,42 @@
   {
     "domain": "bestactorawards.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "bestactorawardscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "bestdocumentaryfilms.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "bestdocumentaryfilmscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "bestwallpaperplace.com",
@@ -502,43 +722,83 @@
   {
     "domain": "beverlyandhills.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "beverlyandhillscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "beverlyhillsbutler.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "beverlyhillsbutlercom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "beverlyhillspaints.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "beverlyhillspaintscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "beverlyhillsvideos.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "beverlyhillsvideoscom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "beverlyhillswallpaper.com",
     "http": 200,
@@ -554,27 +814,37 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "bhbutlercom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "blankstocklining.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
   },
   {
     "domain": "bleachfriendly.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -612,12 +882,22 @@
   {
     "domain": "borninbh.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "borninbhcom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "borrowerbills.org",
@@ -634,11 +914,21 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "boulevardbutlercom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "brazilliancewallpaper.com",
     "http": 0,
@@ -684,7 +974,7 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -692,52 +982,102 @@
   {
     "domain": "bubbie.ai",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "bubbieai.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "cannabisofthemonthclub.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "cannabisofthemonthclubcom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "carmelpaints.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "carmelpaintscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "carmelriverwater.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "carmelriverwatercom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "carmelvalleywater.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "carmelvalleywatercom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "carmelwallpaper.com",
@@ -754,7 +1094,7 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -771,10 +1111,10 @@
   },
   {
     "domain": "cfafabrics.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -804,17 +1144,17 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
   {
     "domain": "classawallcovering.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -851,10 +1191,10 @@
   },
   {
     "domain": "commercialsalesreps.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -864,7 +1204,7 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -872,12 +1212,22 @@
   {
     "domain": "commercialwalls.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "commercialwallscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "contractwallpaper.com",
@@ -921,30 +1271,50 @@
   },
   {
     "domain": "customdigitalwallcoverings.com",
-    "http": 404,
+    "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "customdigitalwallcoveringscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "customdigitalwalls.com",
-    "http": 404,
+    "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "customdigitalwallscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "cypresawards.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -952,12 +1322,32 @@
   {
     "domain": "cypresawards.org",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "cypresawardscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
+  },
+  {
+    "domain": "cypresawardsorg.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
   },
   {
     "domain": "deadradio.com",
@@ -971,7 +1361,7 @@
   },
   {
     "domain": "designerlaboratory.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
     "ga4": false,
@@ -991,10 +1381,10 @@
   },
   {
     "domain": "designermagnetics.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -1022,12 +1412,22 @@
   {
     "domain": "designerschat.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "designerschatcom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "designerssalesreps.com",
@@ -1041,20 +1441,20 @@
   },
   {
     "domain": "designerswallcovering.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
   },
   {
     "domain": "designerswallcoverings.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -1062,29 +1462,39 @@
   {
     "domain": "designerswallpapers.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "designerswallpaperscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "designerwallcover.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
   },
   {
     "domain": "designerwallcovering.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -1101,10 +1511,10 @@
   },
   {
     "domain": "designerwallcoverings.com",
-    "http": 200,
-    "live": true,
+    "http": 429,
+    "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -1122,22 +1532,42 @@
   {
     "domain": "designerwallpaints.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "designerwallpaintscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "designerwalltiles.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "designerwalltilescom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "designtradelive.com",
@@ -1152,29 +1582,49 @@
   {
     "domain": "designtradereps.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "designtraderepscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "designtradesalesreps.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "designtradesalesrepscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "designwallcoverings.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -1182,9 +1632,9 @@
   {
     "domain": "dsgn.tv",
     "http": 200,
-    "live": false,
+    "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -1211,10 +1661,10 @@
   },
   {
     "domain": "dwlosangeles.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -1242,19 +1692,29 @@
   {
     "domain": "ephedrafreeherbs.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "ephedrafreeherbscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "etciemurals.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -1271,10 +1731,10 @@
   },
   {
     "domain": "fabricfridays.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -1312,12 +1772,22 @@
   {
     "domain": "fauxnewslive.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "fauxnewslivecom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "fentucci.com",
@@ -1342,29 +1812,39 @@
   {
     "domain": "filthyrichliving.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "filthyrichlivingcom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "fireratedwallcovering.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
   },
   {
     "domain": "flocked.org",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
-    "ga4": true,
+    "ga4": false,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -1401,7 +1881,7 @@
   },
   {
     "domain": "freethedegree.org",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
     "ga4": false,
@@ -1542,22 +2022,42 @@
   {
     "domain": "handmadewallpapers.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "handmadewallpaperscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "handscreenedwallpaper.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "handscreenedwallpapercom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "healthcarewallpaper.com",
@@ -1572,29 +2072,49 @@
   {
     "domain": "hempofthemonthclub.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "hempofthemonthclubcom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "herbsmadeinchina.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "herbsmadeinchinacom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "hollywoodwallcovering.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -1614,7 +2134,7 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -1632,22 +2152,42 @@
   {
     "domain": "hospitalityfabrics.net",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "hospitalityfabricsnet.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "hospitalitymurals.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "hospitalitymuralscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "hospitalitysalesagency.com",
@@ -1662,12 +2202,22 @@
   {
     "domain": "hospitalitysalesagents.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "hospitalitysalesagentscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "hospitalitysalesrepresentatives.com",
@@ -1682,12 +2232,22 @@
   {
     "domain": "hospitalitysalesreps.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "hospitalitysalesrepscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "hospitalitywallcoverings.com",
@@ -1712,12 +2272,22 @@
   {
     "domain": "hospitalitywalls.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "hospitalitywallscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "hotelwallcoverings.com",
@@ -1732,12 +2302,22 @@
   {
     "domain": "inflationfears.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "inflationfearscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "interiordesignershowroom.com",
@@ -1762,12 +2342,22 @@
   {
     "domain": "interiordesignreps.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "interiordesignrepscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "iwascute.com",
@@ -1781,7 +2371,7 @@
   },
   {
     "domain": "joshdultz.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
     "ga4": false,
@@ -1812,22 +2402,42 @@
   {
     "domain": "lasjardineras.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "lasjardinerascom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "latke.ai",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "latkeai.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "lawyers.com",
@@ -1874,7 +2484,7 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -1882,12 +2492,22 @@
   {
     "domain": "luxurymurals.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "luxurymuralscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "madagascarwallpaper.com",
@@ -1912,22 +2532,42 @@
   {
     "domain": "marijuanabuyersexchange.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "marijuanabuyersexchangecom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "marijuanaofthemonthclub.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "marijuanaofthemonthclubcom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "metallicwallpaper.com",
@@ -1952,12 +2592,22 @@
   {
     "domain": "mohairvelvet.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "mohairvelvetcom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "momentumdw.com",
@@ -2012,16 +2662,26 @@
   {
     "domain": "mymemosamples.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "mymemosamplescom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "nataliaabrams.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
     "ga4": false,
@@ -2041,7 +2701,7 @@
   },
   {
     "domain": "nationalvotingday.org",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
     "ga4": false,
@@ -2054,7 +2714,7 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -2094,11 +2754,21 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "nodailyworriescom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "nosarabeachfrontrentals.com",
     "http": 200,
@@ -2112,19 +2782,29 @@
   {
     "domain": "notvrequired.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "notvrequiredcom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "novasuede.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -2132,12 +2812,22 @@
   {
     "domain": "nybutler.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "nybutlercom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "pairsdw.com",
@@ -2174,14 +2864,14 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
   },
   {
     "domain": "petitionyour.org",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
     "ga4": false,
@@ -2189,6 +2879,16 @@
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "petitionyourcom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "philipperomano.com",
     "http": 200,
@@ -2222,12 +2922,22 @@
   {
     "domain": "potofthemonthclub.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "potofthemonthclubcom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "prestigecarwash.com",
@@ -2252,16 +2962,26 @@
   {
     "domain": "protectyourspec.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "protectyourspeccom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "protestdaily.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
     "ga4": false,
@@ -2361,11 +3081,11 @@
   },
   {
     "domain": "restorationwallpaper.com",
-    "http": 200,
-    "live": true,
+    "http": 0,
+    "live": false,
     "gtm": false,
-    "ga4": true,
-    "meta": true,
+    "ga4": false,
+    "meta": false,
     "pin": false,
     "gsc": true
   },
@@ -2501,7 +3221,7 @@
   },
   {
     "domain": "steveabramsdesigns.com",
-    "http": 404,
+    "http": 429,
     "live": false,
     "gtm": false,
     "ga4": false,
@@ -2621,7 +3341,7 @@
   },
   {
     "domain": "studentstrikes.org",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
     "ga4": false,
@@ -2652,12 +3372,22 @@
   {
     "domain": "summergamesrentals.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "summergamesrentalscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "textiletuesday.com",
@@ -2682,32 +3412,62 @@
   {
     "domain": "theatrewallpaper.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "theatrewallpapercom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "thecannabisnews.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "thecannabisnewscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "thedesignerlaboratory.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "thedesignerlaboratorycom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "thedesignerlibrary.com",
@@ -2732,23 +3492,43 @@
   {
     "domain": "thesalesreps.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "thesalesrepscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "thesetdecorator.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": true,
     "pin": false,
     "gsc": true
   },
+  {
+    "domain": "thesetdecoratorcom.com",
+    "http": 0,
+    "live": false,
+    "gtm": false,
+    "ga4": false,
+    "meta": false,
+    "pin": false,
+    "gsc": false
+  },
   {
     "domain": "toolsdw.com",
     "http": 0,
@@ -2761,13 +3541,23 @@
   },
   {
     "domain": "tradeonlytextiles.com",
+    "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "tradeonlytextilescom.com",
     "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "traditionalwhimsy.com",
@@ -2782,12 +3572,22 @@
   {
     "domain": "treetrimmingguys.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "treetrimmingguyscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "trendingdw.com",
@@ -2812,32 +3612,62 @@
   {
     "domain": "upperonepercent.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "upperonepercentcom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "urthfriendly.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "urthfriendlycom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "valleybutler.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "valleybutlercom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "venturaclaw.com",
@@ -2851,7 +3681,7 @@
   },
   {
     "domain": "venturacorridor.com",
-    "http": 200,
+    "http": 429,
     "live": false,
     "gtm": false,
     "ga4": false,
@@ -2862,32 +3692,62 @@
   {
     "domain": "venturadelivers.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "venturadeliverscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "venturaeats.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "venturaeatscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "vintagebh.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "vintagebhcom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "vinylwallpaper.com",
@@ -2964,7 +3824,7 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -3024,7 +3884,7 @@
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -3042,12 +3902,22 @@
   {
     "domain": "wallpapernashville.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "wallpapernashvillecom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "wallpaperny.com",
@@ -3062,12 +3932,22 @@
   {
     "domain": "wallpapernyc.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "wallpapernyccom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "wallpaperondemand.com",
@@ -3142,12 +4022,22 @@
   {
     "domain": "wc-01.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "wc01com.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "wc01wallcoverings.com",
@@ -3162,29 +4052,49 @@
   {
     "domain": "wc01wallpaper.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "wc01wallpapercom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "weedofthemonthclub.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "weedofthemonthclubcom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "wholivedthere.com",
     "http": 200,
     "live": true,
     "gtm": false,
-    "ga4": false,
+    "ga4": true,
     "meta": false,
     "pin": false,
     "gsc": true
@@ -3192,12 +4102,22 @@
   {
     "domain": "wintergamesrentals.com",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "wintergamesrentalscom.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   },
   {
     "domain": "withoutstudentdebt.com",
@@ -3222,11 +4142,21 @@
   {
     "domain": "zayde.ai",
     "http": 200,
+    "live": true,
+    "gtm": false,
+    "ga4": true,
+    "meta": false,
+    "pin": false,
+    "gsc": true
+  },
+  {
+    "domain": "zaydeai.com",
+    "http": 0,
     "live": false,
     "gtm": false,
     "ga4": false,
     "meta": false,
     "pin": false,
-    "gsc": true
+    "gsc": false
   }
 ]
\ No newline at end of file
diff --git a/gtm/dw-no-meta.json b/gtm/dw-no-meta.json
new file mode 100644
index 0000000..b2cbaef
--- /dev/null
+++ b/gtm/dw-no-meta.json
@@ -0,0 +1,33 @@
+[
+  "carmelwallpapers.com",
+  "commercialwallcovering.com",
+  "commercialwalls.com",
+  "customdigitalmurals.com",
+  "customdigitalwallcoverings.com",
+  "designerswallpapers.com",
+  "designerwallpaints.com",
+  "designerwalltiles.com",
+  "goldleafwallpaper.com",
+  "grassclothwallcoverings.com",
+  "grassclothwallpaper.com",
+  "handmadewallpapers.com",
+  "handscreenedwallpaper.com",
+  "hollywoodwallcovering.com",
+  "hollywoodwallcoverings.com",
+  "hospitalityfabrics.net",
+  "hospitalitymurals.com",
+  "hospitalitywalls.com",
+  "losangelesfabrics.com",
+  "luxurymurals.com",
+  "naturaltextilewallpaper.com",
+  "novasuede.com",
+  "philipperomano.com",
+  "theatrewallpaper.com",
+  "wallpapercontractor.com",
+  "wallpaperdefinitions.com",
+  "wallpaperdistributors.com",
+  "wallpaperglossary.com",
+  "wallpapernashville.com",
+  "wallpapernyc.com",
+  "wc01wallpaper.com"
+]
\ No newline at end of file
diff --git a/gtm/rollout-status.md b/gtm/rollout-status.md
index 3fbc2d5..15a6762 100644
--- a/gtm/rollout-status.md
+++ b/gtm/rollout-status.md
@@ -101,3 +101,16 @@ MILESTONE: the high-value tractable rollout is COMPLETE at 12 real sites. Off-ho
 Added: allnewsdaily, beverlyhillsvideos, nodailyworries (own-conf sub_filter), 818butler+beverlyhillsbutler (domain-landings, map $host $ga_id), bhbutler+boulevardbutler (dl-batch-6, map $host $ga_id2 — distinct var to avoid duplicate-map conflict).
 REMAINING 16 abrams* = Cloudflare-fronted static (/var/www/<domain>/index.html). Origin-inject works but CF serves cached HTML — need CF cache purge (GATED, Steve declined the standing permission) OR natural cache expiry. cypresawards=shared default root (skip). studentdebtcrisis=off-host. petitionyour=needs check.
 19/41 = ALL verifiable-now sites done. The 16 abrams* need the CF-purge permission to complete+verify.
+
+## CYCLE 9 — Meta Pixel rollout HIT A TRIPWIRE (nginx broken 2x, recovered)
+Meta Pixel 187196815010785 LIVE on ~10 DW single-conf/static sites (novasuede, commercialwallcovering,
+hollywoodwallcovering, grasscloth*/grassclothwallpaper, losangelesfabrics, wallpapercontractor,
+wallpaperdistributors, wallpaperdefinitions, wallpaperglossary).
+STOP: the remaining ~20 DW sites live in SHARED dl-batch confs (mixed DW + non-DW hosts). Two attempts to
+inject Meta there broke nginx -t:
+  1. metamap.py wrote the Meta <script> as an nginx `map` VALUE → unparseable ("invalid number of arguments").
+  2. metasub.py stacked a 2nd sub_filter on an already-sub_filtered conf → "sub_filter_once directive is duplicate".
+Both recovered (dl-batch-1 map stripped; naturaltextilewallpaper deduped) — nginx -t passes, reload OK, fleet 200.
+DECISION: PAUSE the shared-conf Meta injection. It needs a SAFE mechanism (a real per-host `if ($host = ...)`
+location block, or app-template injection), not nginx map/stacked-sub_filter. Do NOT retry the map approach.
+Single-conf + static DW sites are the safe surface and are DONE.
diff --git a/scripts/batch_create_ga4.py b/scripts/batch_create_ga4.py
new file mode 100644
index 0000000..a1f2548
--- /dev/null
+++ b/scripts/batch_create_ga4.py
@@ -0,0 +1,119 @@
+#!/usr/bin/env python3
+"""
+Batch create GA4 properties + web data streams for all domains in _live_landings.json.
+Writes results to cache/_ga4_ids.json  {domain: measurement_id}.
+Resilient: one failure doesn't abort batch; exponential backoff on rate limits.
+"""
+from __future__ import annotations
+
+import json
+import os
+import sys
+import time
+from pathlib import Path
+
+# ── auth ──────────────────────────────────────────────────────────────────────
+SA_KEY = Path.home() / ".config" / "ga-analytics-agent" / "service-account.json"
+if not SA_KEY.exists():
+    sys.exit(f"ERROR: service account key not found at {SA_KEY}")
+os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = str(SA_KEY)
+
+# ── paths ─────────────────────────────────────────────────────────────────────
+PROJECT_DIR = Path("/Users/macstudio3/Projects/ga-allsites")
+LANDINGS_FILE = PROJECT_DIR / "cache" / "_live_landings.json"
+OUTPUT_FILE   = PROJECT_DIR / "cache" / "_ga4_ids.json"
+
+ACCOUNT_ID = "accounts/15714274"   # DesignerWallcoverings.com (SAND LLC)
+
+# ── load domains ──────────────────────────────────────────────────────────────
+domains: list[str] = json.loads(LANDINGS_FILE.read_text())
+
+# ── load any previously written results (resume support) ──────────────────────
+existing: dict[str, str] = {}
+if OUTPUT_FILE.exists():
+    try:
+        existing = json.loads(OUTPUT_FILE.read_text())
+        print(f"Resuming — {len(existing)} already recorded in {OUTPUT_FILE.name}")
+    except Exception:
+        pass
+
+# ── GA4 client ────────────────────────────────────────────────────────────────
+from google.analytics.admin import AnalyticsAdminServiceClient
+from google.analytics.admin_v1alpha.types import Property, DataStream
+from google.api_core.exceptions import ResourceExhausted, GoogleAPIError
+
+client = AnalyticsAdminServiceClient()
+
+results: dict[str, str] = dict(existing)   # domain → measurement_id
+failed: list[str] = []
+
+def create_property_and_stream(domain: str) -> str:
+    """Create GA4 property + web stream; return measurement ID."""
+    # Property
+    prop = Property(
+        parent=ACCOUNT_ID,
+        display_name=domain,
+        time_zone="America/Los_Angeles",
+        currency_code="USD",
+        industry_category="ONLINE_COMMUNITIES",
+    )
+    created = client.create_property(property=prop)
+    prop_name = created.name
+
+    # Web data stream
+    stream = DataStream(
+        type_=DataStream.DataStreamType.WEB_DATA_STREAM,
+        display_name=f"{domain} Web",
+        web_stream_data=DataStream.WebStreamData(
+            default_uri=f"https://{domain}",
+        ),
+    )
+    s = client.create_data_stream(parent=prop_name, data_stream=stream)
+    return s.web_stream_data.measurement_id
+
+
+print(f"\nBatch create: {len(domains)} domains under {ACCOUNT_ID}\n")
+
+for i, domain in enumerate(domains, 1):
+    if domain in results:
+        print(f"[{i:>3}/{len(domains)}] {domain:<45} SKIP (already have {results[domain]})")
+        continue
+
+    retries = 0
+    max_retries = 5
+    while retries <= max_retries:
+        try:
+            mid = create_property_and_stream(domain)
+            results[domain] = mid
+            # Write after every success so we can resume on crash
+            OUTPUT_FILE.write_text(json.dumps(results, indent=2))
+            print(f"[{i:>3}/{len(domains)}] {domain:<45} → {mid}")
+            time.sleep(0.6)   # gentle pacing — GA4 Admin API quota
+            break
+        except ResourceExhausted as e:
+            retries += 1
+            wait = 2 ** retries
+            print(f"[{i:>3}/{len(domains)}] {domain:<45} RATE_LIMIT — retry {retries}/{max_retries} in {wait}s")
+            time.sleep(wait)
+        except GoogleAPIError as e:
+            print(f"[{i:>3}/{len(domains)}] {domain:<45} API_ERROR: {e}")
+            failed.append(domain)
+            break
+        except Exception as e:
+            print(f"[{i:>3}/{len(domains)}] {domain:<45} ERROR: {e}")
+            failed.append(domain)
+            break
+    else:
+        print(f"[{i:>3}/{len(domains)}] {domain:<45} GAVE UP after {max_retries} retries")
+        failed.append(domain)
+
+# ── final write ───────────────────────────────────────────────────────────────
+OUTPUT_FILE.write_text(json.dumps(results, indent=2))
+
+print("\n" + "="*70)
+print(f"DONE  — Account: {ACCOUNT_ID}")
+print(f"  Succeeded : {len(results)}")
+print(f"  Failed    : {len(failed)}")
+if failed:
+    print(f"  Failed domains: {failed}")
+print(f"  Output    : {OUTPUT_FILE}")
diff --git a/scripts/batch_create_properties.py b/scripts/batch_create_properties.py
new file mode 100644
index 0000000..787f90c
--- /dev/null
+++ b/scripts/batch_create_properties.py
@@ -0,0 +1,172 @@
+#!/usr/bin/env python3
+"""
+Batch-create GA4 properties + web data streams for domains in
+cache/_ga4_inject_targets.json. Resilient: one failure never aborts the
+batch; rate-limit errors get exponential back-off. Writes results to
+cache/_ga4_inject_ids.json as {domain: measurement_id}.
+
+Cost: $0 — Analytics Admin API is free.
+"""
+from __future__ import annotations
+
+import json
+import os
+import sys
+import time
+from pathlib import Path
+
+# ---------------------------------------------------------------------------
+# Paths
+# ---------------------------------------------------------------------------
+PROJECT_ROOT = Path("/Users/macstudio3/Projects/ga-allsites")
+TARGETS_FILE = PROJECT_ROOT / "cache" / "_ga4_inject_targets.json"
+OUTPUT_FILE  = PROJECT_ROOT / "cache" / "_ga4_inject_ids.json"
+
+# Re-use auth helpers from the analytics skill
+SKILL_SCRIPTS = Path.home() / ".claude/skills/analytics/scripts"
+sys.path.insert(0, str(SKILL_SCRIPTS))
+from _auth import ensure_credentials, get_account_id  # noqa: E402
+
+# ---------------------------------------------------------------------------
+# Config
+# ---------------------------------------------------------------------------
+TIMEZONE = "America/Los_Angeles"
+CURRENCY = "USD"
+INDUSTRY = "ONLINE_COMMUNITIES"
+
+MAX_RETRIES    = 4
+BASE_BACKOFF_S = 5    # seconds; doubles each retry
+
+
+# ---------------------------------------------------------------------------
+# Core helpers
+# ---------------------------------------------------------------------------
+
+def create_property_and_stream(client, account_id: str, domain: str):
+    """Create property + web stream; return (property_id, measurement_id)."""
+    from google.analytics.admin_v1alpha.types import Property, DataStream
+
+    prop = Property(
+        parent=account_id,
+        display_name=domain,
+        time_zone=TIMEZONE,
+        currency_code=CURRENCY,
+        industry_category=INDUSTRY,
+    )
+    created = client.create_property(property=prop)
+    prop_name = created.name
+    prop_id   = prop_name.split("/")[-1]
+
+    clean_domain = domain.replace("https://", "").replace("http://", "").rstrip("/")
+    stream = DataStream(
+        type_=DataStream.DataStreamType.WEB_DATA_STREAM,
+        display_name=domain,
+        web_stream_data=DataStream.WebStreamData(
+            default_uri=f"https://{clean_domain}",
+        ),
+    )
+    created_stream = client.create_data_stream(parent=prop_name, data_stream=stream)
+    measurement_id = created_stream.web_stream_data.measurement_id
+
+    return prop_id, measurement_id
+
+
+def create_with_retry(client, account_id: str, domain: str):
+    """Wrap create_property_and_stream with exponential back-off."""
+    import grpc
+
+    last_err = None
+    backoff = BASE_BACKOFF_S
+    for attempt in range(1, MAX_RETRIES + 1):
+        try:
+            return create_property_and_stream(client, account_id, domain)
+        except Exception as e:
+            last_err = e
+            err_str = str(e).lower()
+            is_rate_limit = (
+                "quota" in err_str
+                or "resource_exhausted" in err_str
+                or "rate" in err_str
+                or "429" in err_str
+            )
+            if is_rate_limit and attempt < MAX_RETRIES:
+                print(f"  [rate-limit] attempt {attempt}/{MAX_RETRIES}, sleeping {backoff}s …")
+                time.sleep(backoff)
+                backoff *= 2
+                continue
+            # Non-rate-limit or final attempt — give up on this domain
+            break
+
+    raise RuntimeError(f"Failed after {MAX_RETRIES} attempts: {last_err}") from last_err
+
+
+# ---------------------------------------------------------------------------
+# Main
+# ---------------------------------------------------------------------------
+
+def main() -> int:
+    ensure_credentials()
+    account_id = get_account_id()
+    print(f"Account: {account_id}")
+
+    domains: list[str] = json.loads(TARGETS_FILE.read_text())
+    print(f"Targets: {len(domains)} domains\n")
+
+    # Load any previously written results so a re-run is idempotent
+    existing: dict[str, str] = {}
+    if OUTPUT_FILE.exists():
+        try:
+            existing = json.loads(OUTPUT_FILE.read_text())
+            if existing:
+                print(f"Resuming: {len(existing)} already done → {list(existing.keys())[:3]} …\n")
+        except json.JSONDecodeError:
+            pass
+
+    from google.analytics.admin import AnalyticsAdminServiceClient
+    client = AnalyticsAdminServiceClient()
+
+    results: dict[str, str] = dict(existing)
+    succeeded = list(existing.keys())
+    failed: list[tuple[str, str]] = []
+
+    for i, domain in enumerate(domains, 1):
+        if domain in existing:
+            print(f"[{i:02d}/{len(domains)}] {domain:<35}  SKIP (already done: {existing[domain]})")
+            continue
+
+        print(f"[{i:02d}/{len(domains)}] {domain:<35}  creating …", end="", flush=True)
+        try:
+            prop_id, mid = create_with_retry(client, account_id, domain)
+            results[domain] = mid
+            succeeded.append(domain)
+            print(f"  OK  property={prop_id}  measurement_id={mid}")
+
+            # Persist after every success so a crash mid-batch doesn't lose work
+            OUTPUT_FILE.write_text(json.dumps(results, indent=2))
+
+            # Polite inter-request gap (avoid burst rate limit)
+            if i < len(domains):
+                time.sleep(1.2)
+
+        except Exception as exc:
+            failed.append((domain, str(exc)))
+            print(f"  FAIL  {exc}")
+
+    # Final write
+    OUTPUT_FILE.write_text(json.dumps(results, indent=2))
+
+    # Summary
+    print("\n" + "=" * 72)
+    print(f"SUCCEEDED: {len(succeeded)}   FAILED: {len(failed)}")
+    if failed:
+        print("\nFailed domains:")
+        for d, err in failed:
+            print(f"  {d}: {err}")
+    print(f"\nOutput: {OUTPUT_FILE}")
+    print("Cost: $0 (Admin API free)")
+
+    return 0 if not failed else 1
+
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/scripts/create_inject_properties.py b/scripts/create_inject_properties.py
new file mode 100644
index 0000000..c987f7e
--- /dev/null
+++ b/scripts/create_inject_properties.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python3
+"""
+Batch-create GA4 properties for the 21 inject targets.
+Account: accounts/15714274 (SAND LLC / DesignerWallcoverings.com)
+Output: cache/_ga4_inject_ids.json
+Idempotent: skips domains already in the output file.
+"""
+from __future__ import annotations
+
+import json
+import os
+import sys
+import time
+from pathlib import Path
+
+SCRIPT_DIR = Path(__file__).parent
+SKILLS_DIR = Path.home() / ".claude" / "skills" / "analytics" / "scripts"
+sys.path.insert(0, str(SKILLS_DIR))
+
+from _auth import ensure_credentials
+
+ACCOUNT_ID = "accounts/15714274"   # SAND LLC — SA has Editor here
+TARGETS_FILE = SCRIPT_DIR.parent / "cache" / "_ga4_inject_targets.json"
+OUTPUT_FILE  = SCRIPT_DIR.parent / "cache" / "_ga4_inject_ids.json"
+
+
+def load_existing() -> dict:
+    if OUTPUT_FILE.exists():
+        try:
+            return json.loads(OUTPUT_FILE.read_text())
+        except Exception:
+            return {}
+    return {}
+
+
+def save(data: dict) -> None:
+    OUTPUT_FILE.write_text(json.dumps(data, indent=2))
+
+
+def create_property(client, domain: str) -> str:
+    """Create a GA4 property + web data stream; return measurement ID."""
+    from google.analytics.admin_v1alpha.types import Property, DataStream
+
+    prop = Property(
+        parent=ACCOUNT_ID,
+        display_name=domain,
+        time_zone="America/Los_Angeles",
+        currency_code="USD",
+        industry_category="ONLINE_COMMUNITIES",
+    )
+    created = client.create_property(property=prop)
+    prop_name = created.name
+    print(f"  property: {prop_name}", flush=True)
+
+    stream = DataStream(
+        type_=DataStream.DataStreamType.WEB_DATA_STREAM,
+        display_name=domain,
+        web_stream_data=DataStream.WebStreamData(
+            default_uri=f"https://{domain}",
+        ),
+    )
+    stream = client.create_data_stream(parent=prop_name, data_stream=stream)
+    mid = stream.web_stream_data.measurement_id
+    print(f"  stream:   {stream.name}  →  {mid}", flush=True)
+    return mid
+
+
+def main() -> None:
+    ensure_credentials()
+
+    # Force the correct account ID regardless of on-disk config
+    os.environ["GA_ACCOUNT_ID"] = ACCOUNT_ID
+
+    from google.analytics.admin import AnalyticsAdminServiceClient
+    client = AnalyticsAdminServiceClient()
+
+    targets: list[str] = json.loads(TARGETS_FILE.read_text())
+    existing = load_existing()
+
+    succeeded = 0
+    failed = 0
+    failed_domains: list[str] = []
+
+    for domain in targets:
+        if domain in existing:
+            print(f"[SKIP] {domain} already has {existing[domain]}", flush=True)
+            continue
+
+        print(f"[CREATE] {domain}", flush=True)
+        for attempt in range(3):
+            try:
+                mid = create_property(client, domain)
+                existing[domain] = mid
+                save(existing)
+                print(f"[OK] {domain} -> {mid}", flush=True)
+                succeeded += 1
+                time.sleep(1.2)   # polite rate-limit spacing
+                break
+            except Exception as exc:
+                msg = str(exc)
+                if "429" in msg or "RESOURCE_EXHAUSTED" in msg:
+                    wait = 30 * (attempt + 1)
+                    print(f"  rate-limited, waiting {wait}s …", flush=True)
+                    time.sleep(wait)
+                else:
+                    print(f"  [FAIL attempt {attempt+1}] {exc}", flush=True)
+                    if attempt == 2:
+                        print(f"[FAIL] {domain} — giving up", flush=True)
+                        failed += 1
+                        failed_domains.append(domain)
+                    else:
+                        time.sleep(3)
+
+    print()
+    print(f"Account used : {ACCOUNT_ID}")
+    print(f"Succeeded    : {succeeded}")
+    print(f"Skipped      : {len([d for d in targets if d in existing]) - succeeded}")
+    print(f"Failed       : {failed}  {failed_domains if failed_domains else ''}")
+    print(f"Output file  : {OUTPUT_FILE}")
+    print()
+    print(json.dumps(existing, indent=2))
+
+
+if __name__ == "__main__":
+    main()

← d3fb32f yoloforever: 19/41 GA4 live (all real + non-CF shells); 16 a  ·  back to Ga Allsites  ·  rollout-status: cycle 10 — Meta on 3 storefronts via app-tem 5a20bdb →