← All docs

Lead Drop Diagnosis — 2026-04-28

Costa asked: "Why has lead production been down severely the past week?"

Real (spam-filtered) inbound by week

WeekRealSpamSpam ratio
W15 (Apr 6-12)800%
W16 (Apr 13-19)11635%
W17 (Apr 20-26)9847%
W18 (Apr 27+, 2 days)100%

Real call rate is FLAT at ~9-11/wk. The "drop" perception was caused by a combination of:

  1. 1. W17's reported 17 calls was 47% spam (8 robocalls inflated it). Real W17 = 9, in line with W15+W16.
  2. 2. W18 has only 2 days of data (Mon Apr 27 + Tue Apr 28 morning). Extrapolating: trending similar to W15-W17.
  3. 3. 4 sites had wrong-number tel: links until 09:42 today — Elkhorn, Orlando, Boulder, SA Pool. Anyone tapping click-to-call rang someone else's business. Calls never hit our Twilio numbers, so they don't appear in the count.

What the data actually shows

GSC organic clicks (28-day rolling):

Stable. Search visibility is fine. This is NOT a ranking problem.

Top sites by GSC clicks (28d):

Root causes (ranked)

  1. 1. Wrong tel: numbers on 4 sites for ~unknown duration (FIXED today, commit e2d8a5a5). Lead-loss vector now closed but historical leakage unrecoverable.
  2. 2. Spam inflated W17 perceived count by 47%. Real-call rate has been steady. (3 spammers blocked today in Worker KV — see "Actions" below.)
  3. 3. Sites with no Twilio assignment getting clicks (e.g. deltatreedoctors.com — 34 GSC clicks, 0 attributed calls because no destination number is mapped). Either form-only conversion or unmonitored phone path.
  4. 4. Most sites under low-traffic threshold — only 11/29 sites have GA4 data above 50 sessions/wk. The rank-and-rent fleet is concentrated in a few performers.

Actions implemented today

#ActionWhereStatus
14 wrong-number sites patchedElkhorn / Orlando / Boulder / SA Pool repos✅ commit e2d8a5a5 (earlier today)
23 spam callers blocked at Worker levelKV namespace SPAM_LOG (id 6bfe2a37...)✅ done — see below
3Spam-filtered lead summary tooltools/real-lead-summary.py✅ shipped

Spam blocks added (KV dyn_block: prefix):

Future calls from these numbers get intercepted at the Worker before reaching destination Twilio.

Actions queued for tonight

#ActionWhy
1Wire tools/real-lead-summary.py into morning briefSurface spam ratio + real-call trend daily
2Audit deltatreedoctors.com — assign Twilio?34 clicks/28d with no call attribution = blind spot
3Strikingdistance fallers → auto-action queueCurrently informational only; needs content-refresh trigger when query falls 3+ pos
4Re-run Twilio audit at 02:00 CTConfirm 4 fixes propagated through GH Pages cache cleanly

Automated SEO Improvement Plan — Status Audit

Costa asked: "What happened to our automated SEO improvement plan including the GA4/GSC feedback loop?"

Running today

CronScheduleStatusOutput
com.itd.gsc-weekly-pullWeekly Mon 11:00✅ Running28d clicks/impressions/CTR/position per site → data/gsc/<domain>/<date>.json + Telegram digest
com.itd.gsc-striking-distanceDaily✅ RunningRisers/fallers report → data/gsc/striking-distance/<date>.json + Telegram
com.itd.ga4-feedback-loopDaily✅ RunningPer-site session/conversion summary → data/ga4/feedback-loop/<date>.json + Telegram
com.itd.thin-content-dryrunDaily⚠️ Running but DRY-RUN"TOTAL FIXED: 0 pages" every day — never auto-fixes
com.itd.indexnow-dailyDaily⚠️ 27/29 succeedBloomington + Orlando 403 every day (need IndexNow key fix)
com.itd.innovation-sprintMondays 06:00✅ RunningWeekly research digest

What's BROKEN about the "feedback loop"

It's not actually a loop — it's a one-way reporting pipeline. Signals come in, but nothing closes the loop back to action.

Gaps:

  1. 1. Striking-distance fallers are reported, not acted on. When a query falls 3+ positions, no content refresh is triggered. We see the fall, log it, send Telegram, then nothing happens.
  1. 2. Thin-content runner is permanently dry-run. It identifies pages under 700 words every day but never expands them. The plist has no live-mode counterpart.
  1. 3. GA4 has data on only 11/29 sites. 18 sites show "no GA4 data" in the daily feedback-loop log. Either the GA4 measurement IDs are misconfigured or those sites genuinely have zero traffic. Need to differentiate.
  1. 4. IndexNow daily 403s on 2 sites (Orlando + Bloomington) for weeks. Stale API keys. Crawl signal blocked.
  1. 5. No unified "site health" trend. Each cron writes its own JSON. No dashboard merges GSC × GA4 × thin-content × striking-distance into a per-site action queue.

Closing the loop — proposed

ActionCost
Striking-distance fallers (≥3 pos drop) → enqueue page for content refresh in data/action-queue/seo-refresh.jsonl1 hr
Thin-content runner: switch from DRY-RUN to LIVE for services/ and locations/ only (lowest risk)2 hr + Costa review
Fix IndexNow 403s — regenerate keys for Orlando + Bloomington15 min
Per-site dashboard merging GSC + GA4 + thin-content + spam ratio → data/site-health/<domain>.json, surfaced in morning brief2 hr
Investigate GA4 install on 18 "no data" sites — verify measurement ID is correct + tag is firing1 hr per site batch

Recommend: Wire striking-distance auto-action + IndexNow fix tonight. Keep thin-content in dry-run until Costa reviews the planned changes for one site as proof-of-concept.


TL;DR for Costa