[object Object]

← back to Ga Allsites

ABORT orphan-GA4 deletion: dry-run proved all 3 are legit (DW subdomain, goodquestion.ai, live Nosara site) — corrected exclusion record

34f211e61c2dab0a9b82d79e59cbf7452e8f1190 · 2026-08-17 16:27:56 -0700 · Steve Abrams

Files touched

Diff

commit 34f211e61c2dab0a9b82d79e59cbf7452e8f1190
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Aug 17 16:27:56 2026 -0700

    ABORT orphan-GA4 deletion: dry-run proved all 3 are legit (DW subdomain, goodquestion.ai, live Nosara site) — corrected exclusion record
---
 gtm/not-owned-exclusions.json | 11 ++++++-----
 gtm/rollout-status.md         | 11 +++++++++++
 resolve_orphan_ga4.py         | 33 +++++++++++++++++++++++++++++++++
 3 files changed, 50 insertions(+), 5 deletions(-)

diff --git a/gtm/not-owned-exclusions.json b/gtm/not-owned-exclusions.json
index 6da3793..4e9bbe7 100644
--- a/gtm/not-owned-exclusions.json
+++ b/gtm/not-owned-exclusions.json
@@ -1,8 +1,9 @@
 {
-  "_note": "Domains that appeared in tracking scans ONLY via an orphan GA4 property name, but are NOT owned (verified via GoDaddy specific-domain 404 + no CF zone, 2026-08-17). NEVER target these for injection/deploy. Consider deleting the orphan GA4 properties.",
-  "not_owned": {
-    "momentumdw.com":              { "orphan_ga4": "G-9K93LH6GH1", "host": "AWS 13.248.243.5", "ns": "domaincontrol (not our account)" },
-    "nosarabeachfrontrentals.com": { "orphan_ga4": "G-JZRGWSY1F6", "host": "Cloudflare Pages (not our zone)" },
-    "goodquestion.com":            { "orphan_ga4": "G-QG3DGNYWZX", "host": "openresty 74.91.138.139 (Coming Soon placeholder, not ours)" }
+  "_note": "CORRECTED 2026-08-17. The bare domains momentumdw.com / goodquestion.com / nosarabeachfrontrentals.com are NOT owned (GoDaddy 404 + no CF zone) and must NEVER be targeted for injection/deploy. BUT the GA4 properties I initially called 'orphans' are NOT orphans — their real data-stream URIs point to legit properties. DO NOT DELETE these properties.",
+  "not_owned_bare_domains": ["momentumdw.com", "goodquestion.com", "nosarabeachfrontrentals.com"],
+  "ga4_properties_KEEP_do_not_delete": {
+    "G-9K93LH6GH1": { "name": "Momentum DW", "property": "properties/548357651", "real_stream": "https://momentum.designerwallcoverings.com", "owned": true, "reason": "your DW subdomain, not momentumdw.com" },
+    "G-QG3DGNYWZX": { "name": "goodquestion", "property": "properties/535741032", "real_stream": "https://goodquestion.ai", "owned": true, "reason": "goodquestion.ai (GoDaddy+CF confirm you own it), not goodquestion.com" },
+    "G-JZRGWSY1F6": { "name": "nosarabeachfrontrentals", "property": "properties/535735055", "real_stream": "https://nosarabeachfrontrentals.com", "owned": "unclear", "reason": "live production rentals site; domain not in GoDaddy/CF but may be another registrar or client-built. Do not delete without Steve confirming." }
   }
 }
diff --git a/gtm/rollout-status.md b/gtm/rollout-status.md
index 5c5426a..0d4ec78 100644
--- a/gtm/rollout-status.md
+++ b/gtm/rollout-status.md
@@ -168,3 +168,14 @@ ownership. Fix: gtm/not-owned-exclusions.json now lists these 3 — never target
 flagged for Steve to delete (GATED — not touching GA4 props without approval).
 REVISED REAL DENOMINATOR: the "41 zero-tracking" count was inflated by ~3 non-owned domains. True remaining
 GA4 gaps you own = studentdebtlawyers.org, studentdebtcrisis.org, cypresawards.com (each off-host/own pipeline).
+
+## CYCLE 14 — DELETION ABORTED: the "3 orphans" are LEGIT properties (safety check caught it)
+Before deleting, the dry-run resolved each measurement ID -> property + verified the real stream URI:
+  - G-9K93LH6GH1 "Momentum DW" -> momentum.designerwallcoverings.com (YOUR subdomain, live). NOT momentumdw.com.
+  - G-QG3DGNYWZX "goodquestion" -> goodquestion.AI (you OWN it: GoDaddy 200 + CF zone). NOT goodquestion.com.
+  - G-JZRGWSY1F6 "nosarabeachfrontrentals" -> live "Beachfront Rentals Nosara" production site.
+CONCLUSION: NONE are orphans; deleting would have destroyed live analytics. No properties deleted.
+The only true fact stands: the BARE domains momentumdw.com/goodquestion.com aren't owned — but no GA4 property
+actually measures them. not-owned-exclusions.json corrected accordingly.
+LESSON: verify a GA4 property by its data-stream URI, never by its display NAME. The DOMAIN_MATCH dry-run
+gate is what prevented a 3-property destructive delete.
diff --git a/resolve_orphan_ga4.py b/resolve_orphan_ga4.py
new file mode 100644
index 0000000..65077ca
--- /dev/null
+++ b/resolve_orphan_ga4.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python3
+"""Resolve the 3 orphan measurement IDs -> GA4 property (+ verify domain), DRY RUN (no delete)."""
+import pathlib
+from google.analytics.admin import AnalyticsAdminServiceClient
+KEY = pathlib.Path.home()/".config"/"ga-analytics-agent"/"service-account.json"
+ORPHANS = {
+ "G-9K93LH6GH1": "momentumdw.com",
+ "G-JZRGWSY1F6": "nosarabeachfrontrentals.com",
+ "G-QG3DGNYWZX": "goodquestion.com",
+}
+c = AnalyticsAdminServiceClient.from_service_account_file(str(KEY))
+found = {}
+for acct in c.list_account_summaries():
+    for ps in acct.property_summaries:
+        prop = ps.property  # "properties/NNN"
+        try:
+            for ds in c.list_data_streams(parent=prop):
+                mid = getattr(getattr(ds, "web_stream_data", None), "measurement_id", "")
+                if mid in ORPHANS:
+                    uri = ds.web_stream_data.default_uri
+                    found[mid] = {"property": prop, "prop_name": ps.display_name,
+                                  "acct": acct.display_name, "stream_uri": uri,
+                                  "expected_domain": ORPHANS[mid]}
+        except Exception:
+            pass
+print(f"Resolved {len(found)}/3 orphan measurement IDs:\n")
+for mid, info in found.items():
+    dom = info["expected_domain"]
+    match = dom in (info["stream_uri"] or "")
+    print(f"  {mid}  -> {info['property']}  '{info['prop_name']}'  (acct: {info['acct']})")
+    print(f"      stream_uri={info['stream_uri']}  expected={dom}  DOMAIN_MATCH={match}")
+missing = set(ORPHANS) - set(found)
+if missing: print("\n  NOT FOUND (SA has no access / already deleted):", ", ".join(missing))

← fb0bb41 ownership audit: 3 off-host domains NOT owned (momentumdw/no  ·  back to Ga Allsites  ·  GA4 cleanup: deleted Momentum DW property; goodquestion.ai + 1ad6463 →