[object Object]

← back to Re Coverage Dashboard

add HomesOnSpec gauge group (builder-site/listing/phone coverage) + DW-network ad slot (nofollow sponsored footer-strip embed)

bbec632782fd4556fadad383c98ca3a0219e453c · 2026-08-06 12:32:14 -0700 · Steve Abrams

Files touched

Diff

commit bbec632782fd4556fadad383c98ca3a0219e453c
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu Aug 6 12:32:14 2026 -0700

    add HomesOnSpec gauge group (builder-site/listing/phone coverage) + DW-network ad slot (nofollow sponsored footer-strip embed)
---
 public/index.html | 8 +++++++-
 server.js         | 8 ++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/public/index.html b/public/index.html
index 3a24062..bacfd11 100644
--- a/public/index.html
+++ b/public/index.html
@@ -81,7 +81,7 @@ class LiquidGauge {
   }
 }
 
-const COLORS = { usre: '#3fb950', CRCP: '#58a6ff' };
+const COLORS = { usre: '#3fb950', CRCP: '#58a6ff', HomesOnSpec: '#d29922' };
 const gauges = {};
 let built = false;
 
@@ -126,5 +126,11 @@ async function refresh() {
 }
 refresh(); setInterval(refresh, 15000);
 </script>
+<!-- DW-network ad slot (per the DW build standard): renders a "Sponsored" unit;
+     every ad link is rel="nofollow sponsored noopener". Fail-open — no fill = nothing. -->
+<script src="https://ads.agentabrams.com/embed.js"
+        data-slot="footer-strip"
+        data-site="coverage.agentabrams.com"
+        data-context="real-estate,analytics,agents,brokers"></script>
 </body>
 </html>
diff --git a/server.js b/server.js
index 5b18e05..d749b79 100755
--- a/server.js
+++ b/server.js
@@ -39,6 +39,11 @@ function coverage() {
     cAttempted = v.length; cFound = v.filter(x => x.status === 'found').length; cPhone = v.filter(x => x.phone).length;
   } catch {}
 
+  // HomesOnSpec (builder-direct spec homes — Mac2 local DB). Builder = the firm here,
+  // so coverage is naturally high (spec homes carry a listing URL + builder site).
+  const h = nums(psql1('homesonspec', `SELECT (SELECT count(*) FROM "Builder"), (SELECT count(*) FROM "Builder" WHERE "websiteUrl" IS NOT NULL AND "websiteUrl"<>''), (SELECT count(*) FROM "InventoryHome" WHERE status='PUBLISHED'), (SELECT count(*) FROM "InventoryHome" WHERE status='PUBLISHED' AND "sourceUrl" IS NOT NULL), (SELECT count(*) FROM "Community"), (SELECT count(*) FROM "Community" WHERE "salesPhone" IS NOT NULL)`));
+  const [hBTot, hBSite, hHomes, hHomeUrl, hCTot, hCPhone] = h.length === 6 ? h : [0, 0, 0, 0, 0, 0];
+
   const pct = (n, d) => d > 0 ? Math.round((n / d) * 1000) / 10 : 0;
   const metrics = [
     { key: 'usre_firm', group: 'usre', label: 'Agents tied to a firm', pct: pct(bFirm, bTotal), num: bFirm, den: bTotal, unit: 'agents' },
@@ -48,6 +53,9 @@ function coverage() {
     { key: 'crcp_swept', group: 'CRCP', label: 'CRCP agents searched', pct: pct(cAttempted, cTotal), num: cAttempted, den: cTotal, unit: 'agents' },
     { key: 'crcp_site', group: 'CRCP', label: 'CRCP agent sites found', pct: pct(cFound, Math.max(cAttempted, 1)), num: cFound, den: cAttempted, unit: 'of searched' },
     { key: 'crcp_phone', group: 'CRCP', label: 'CRCP phones found', pct: pct(cPhone, Math.max(cAttempted, 1)), num: cPhone, den: cAttempted, unit: 'of searched' },
+    { key: 'hos_buildersite', group: 'HomesOnSpec', label: 'Builders with a website', pct: pct(hBSite, hBTot), num: hBSite, den: hBTot, unit: 'builders' },
+    { key: 'hos_listing', group: 'HomesOnSpec', label: 'Homes with a listing link', pct: pct(hHomeUrl, hHomes), num: hHomeUrl, den: hHomes, unit: 'homes' },
+    { key: 'hos_phone', group: 'HomesOnSpec', label: 'Communities with a phone', pct: pct(hCPhone, hCTot), num: hCPhone, den: hCTot, unit: 'communities' },
   ];
   const totals = {
     sites_found: bSite + cFound,

← eaa3d50 gate dashboard with Basic Auth (admin:DW2024!) before public  ·  back to Re Coverage Dashboard  ·  auto-data-snapshot: 2026-08-06T13:27:53 (1 data files) — lau 8480887 →