← back to Ga Allsites
rollout-status: cycle 10 — Meta on 3 storefronts via app-template inject; parked domains skipped (ad-audience scoping)
5a20bdbcf6b2df6119579696e2664a844adb9889 · 2026-08-17 16:07:25 -0700 · Steve Abrams
Files touched
A _track_audit.pyM gtm/rollout-status.md
Diff
commit 5a20bdbcf6b2df6119579696e2664a844adb9889
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Mon Aug 17 16:07:25 2026 -0700
rollout-status: cycle 10 — Meta on 3 storefronts via app-template inject; parked domains skipped (ad-audience scoping)
---
_track_audit.py | 36 ++++++++++++++++++++++++++++++++++++
gtm/rollout-status.md | 17 +++++++++++++++++
2 files changed, 53 insertions(+)
diff --git a/_track_audit.py b/_track_audit.py
new file mode 100644
index 0000000..bfd1309
--- /dev/null
+++ b/_track_audit.py
@@ -0,0 +1,36 @@
+import json,pathlib,re,ssl,urllib.request
+from concurrent.futures import ThreadPoolExecutor
+sites=[s["domain"] for s in json.load(open("/Users/macstudio3/Projects/domain-landings/data/all-sites.json"))]
+ctx=ssl.create_default_context(); ctx.check_hostname=False; ctx.verify_mode=ssl.CERT_NONE
+PAT={
+ "ga4": re.compile(r"(gtag/js\?id=G-|gtag\('config',\s*'G-|G-[A-Z0-9]{8,})"),
+ "meta": re.compile(r"(connect\.facebook\.net|fbq\('init'|fbevents\.js|facebook.*pixel)",re.I),
+ "gads": re.compile(r"(gtag/js\?id=AW-|AW-\d{6,}|googleadservices)"),
+ "gtm": re.compile(r"(googletagmanager\.com/gtm\.js|GTM-[A-Z0-9]+)"),
+}
+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,{k:bool(p.search(html)) for k,p in PAT.items()},True)
+ except Exception:
+ if s=="http": return (d,{},False)
+ return (d,{},False)
+res=list(ThreadPoolExecutor(max_workers=24).map(probe,sites))
+reach=[r for r in res if r[2]]
+def pct(k):
+ n=sum(1 for _,f,ok in reach if f.get(k)); return f"{n}/{len(reach)} ({100*n//max(1,len(reach))}%)"
+print(f"reachable: {len(reach)}/{len(res)}")
+print(f" GA4: {pct('ga4')}")
+print(f" Meta pixel: {pct('meta')}")
+print(f" Google Ads: {pct('gads')}")
+print(f" GTM: {pct('gtm')}")
+# who lacks GA4? who lacks meta?
+no_ga4=sorted(d for d,f,ok in reach if not f.get('ga4'))
+no_meta=sorted(d for d,f,ok in reach if not f.get('meta'))
+pathlib.Path("cache/_no_ga4_all.json").write_text(json.dumps(no_ga4))
+pathlib.Path("cache/_no_meta_all.json").write_text(json.dumps(no_meta))
+print(f"\nreachable sites WITHOUT GA4: {len(no_ga4)}")
+print(f"reachable sites WITHOUT Meta pixel: {len(no_meta)} (essentially all — no pixel deployed yet)")
+print("no-GA4 sample:", no_ga4[:15])
diff --git a/gtm/rollout-status.md b/gtm/rollout-status.md
index 15a6762..c5b03c0 100644
--- a/gtm/rollout-status.md
+++ b/gtm/rollout-status.md
@@ -114,3 +114,20 @@ Both recovered (dl-batch-1 map stripped; naturaltextilewallpaper deduped) — ng
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.
+
+## CYCLE 10 — Meta via app-template injection (Steve's choice) → +3 storefronts, 14 total
+Steve chose app-template injection over more nginx edits. Resolved the 22 "missing Meta" DW sites:
+ - **15 are PARKED "buy this domain" sale pages** (domain-landings app :9794, Host-routed). DELIBERATELY
+ SKIPPED — putting the DW ad-retargeting pixel on parked domain-sale pages pollutes the wallcovering
+ ad audience with domain-buyers (honors the "scope Meta to ad-funnel, not all" rule). GA4 stays (fine).
+ - **2 CF-fronted** (philipperomano.com, interiordesignershowroom.com) — origin inject won't surface until
+ a Cloudflare cache purge (gated). Deferred.
+ - **2 non-funnel** (carmelwallpapers = staged-for-active viewer; designersalesreps = a reps directory) — skip.
+ - **3 genuine Kamatera storefronts → Meta injected + LIVE:** customdigitalmurals.com (server.js :9896),
+ goldleafwallpaper.com (index.html :9890), hollywoodwallcoverings.com (server.js :9832).
+Method: pull file → inject standard fbq snippet before </head> (idempotent) → node --check → rsync → pm2 restart → verify live.
+GOTCHA logged: first injection pass silently no-op'd (relative-path/cwd mismatch in the heredoc); fixed by
+passing the abs base dir as argv and verifying pixel_count immediately after each write. Always verify the
+write landed locally BEFORE rsync.
+META TOTAL: 14 DW storefronts live (11 prior + these 3). Remaining Meta gaps are parked (skip by design)
+or CF-cached (need purge). No nginx touched this cycle — zero fleet risk.
← 1ebbbf8 rollout-status: cycle 9 — Meta pixel paused on shared confs
·
back to Ga Allsites
·
rollout-status: cycle 11 — GA4 35/41 (CF cache self-expired) 1100373 →