Knowledge > Reference Data > Measurement Baseline 2026-08-24
Portfolio Measurement Baseline — 2026-08-24
A large measurement audit ran on 2026-08-24 across GSC, DB-level traffic tables, the chatbot conversation table, and the outreach funnel. It contradicted several numbers that had been circulating in knowledge/ — some since 2026-04-11, four and a half months stale. This doc is the dated record of what was actually measured, so the next agent has a real baseline instead of re-deriving one or trusting a stale figure.
Read this before quoting any of: church directory count, GSC clicks/impressions/position, indexing status for any property, chatbot conversation volume, outreach funnel conversion, or whether PostHog/GA4/analytics_events/telemetry_events can be trusted for a traffic claim.
What this doc is NOT: a diagnosis of causes, or a re-run of the /search-audit four-gate procedure. It is the raw, dated measurement record. For indexing/traffic diagnosis, use /search-audit (loads the current gated procedure); knowledge/processes/property-search-audit-playbook.md is superseded and kept only for host-routing/hydration specifics.
1. Church directory count (corrected)
churches where directory_visible = true = 222,498 (measured 2026-08-24 via direct SQL).
This corrects the "218K+ / 218,339 / 218,369" figure that had propagated through ~48 knowledge docs since it was last measured 2026-04-11 (data/stats.yaml carried last_verified: 2026-04-11 the whole time — the drift went undetected for over 4 months). All of those docs were corrected in this same pass (see git log / DECISION_LOG.md 2026-08-24 entry for the file list); the canonical source is now data/stats.yaml → church_directory.value: 222498.
Raw total row count was NOT re-verified 2026-08-24 — the Supabase MCP token had expired at query time (see §6 below and FOUNDER_ACTIONS.md). The last known raw total is 261,139 (measured 2026-03-25). Do not quote "~261K total" as current without re-verifying; it may well have grown too. architecture/db/pewsearch.md carries this caveat inline.
2. Google Search Console — trailing 90 days (read at /u/3/, all sc-domain: properties)
| Property | Clicks | Impressions | Avg position |
|---|---|---|---|
| churchwiseai.com | 169 | 11.6K | 13.2 |
| sermonwise.ai | 57 | 2.89K | 15.7 |
| funeralwiseai.com | 36 | 2.54K | 41.3 |
| johnmoelker.com | 15 | 493 | 16.0 |
| wiseaiagency.com | 12 | 452 | 32.7 |
| pewsearch.com | 9 | 5.11K | 6.7 |
| comparelocal.ca | 1 | 1.19K | 42.7 |
| illustratetheword.com | 1 | 28 | 9.4 |
| realtywiseai.com | 1 | 83 | 40.9 |
| sharewiseai.com | 0 | 63 | 7.4 |
| TOTAL | 301 | ~24.4K |
Impressions shown with "K" are GSC's own rounded display — treat as approximate, not exact. This is the entire organic-search yield of the portfolio over 90 days: 301 clicks. Note how small pewsearch.com's share is (9 clicks) despite owning the 222K-listing directory and the best average position (6.7) of any property — position is not the bottleneck there, something upstream of the click is (see §4, sitemap defect).
GSC is the only source of truth for traffic claims. PostHog undercounts and is bot-contaminated (§6); do not blend the two.
3. Indexing status (GSC Pages report, last update 8/20/26)
| Property | Indexed | Not indexed | Notable buckets |
|---|---|---|---|
| churchwiseai.com | 95 | 147 | Alternate-canonical 21, noindex 18, redirect 11, robots.txt 4, other-4xx 1, soft-404 1, Crawled–not-indexed 52, Discovered–not-indexed 25, Not-found(404) 14 |
| sermonwise.ai | 613 | 992 | — |
| illustratetheword.com | 1 | 8.44K | Largest bucket Crawled–currently-not-indexed 6,984; "Excluded by noindex" 1,167 with validation status Failed |
| realtywiseai.com | 4 | 7 | — |
illustratetheword.com — status is "hands off, measure," not a new fire. The 2026-07-27 fix (410 Gone on 28,330 machine-generated fragments; 16,300 gated pages dropped from sitemap) was re-verified intact 28 days later: the invariant C:\dev\scripts\search-conformance\invariants\illustratetheword.com.mjs passes all 5 assertions with its own positive control — live sitemap has zero retired URLs, retired URLs still return 410, sampled live illustrations are 200 + index, follow + self-canonical. The 1-indexed/8.44K-not-indexed snapshot above is the state mid-reindex after a deliberate, large prune, not evidence the fix failed. Standing instruction unchanged: do not edit the illustrations, do not re-add any bulk corpus, give it time. knowledge/processes/seo-traffic-strategy-2026.md (dated 2026-05-22, pre-fix) still described ITW as "Best SEO infra in the portfolio" with a 50K-URL sitemap — that row has been flagged stale in place.
churchwiseai.com's 147-not-indexed breakdown is a useful worked example of the /search-audit hard gate: 52 Crawled-not-indexed + 25 Discovered-not-indexed is 77 of 147 (52%) that need per-URL classification before any "thin content" or "crawl budget" claim — do not quote this bucket as a verdict without opening a sample.
4. Live defects confirmed 2026-08-24
- wiseaiagency.com — duplicate hosts. Apex AND www both return HTTP 200 with no redirect between them, live 20+ days. Fix written, not deployed.
- wiseaiagency.com — canonical-self mismatch. 15 internal nav links point at
/wiseaiagency/*URLs whose own canonical tag declares the un-prefixed path authoritative; 7 of 25 sampled pages have no canonical tag at all. The same pattern was found on sermonwise.ai and realtywiseai.com. This is the same shape as the funeralwiseai.com defect fixed 2026-08-03 — it was not fully swept to the sibling properties at the time. - pewsearch.com sitemap — offset pagination degrades with depth.
/sitemaps/churches?page=— pages 1-2 fast, page 3 takes 38s, page 4 takes 53s, page 5 returns HTTP 500canceling statement due to statement timeout, page 6 404s. Roughly 12,500 URLs are unreachable via this path and another ~25,000 are too slow for Googlebot to bother with. This is a strong candidate explanation for pewsearch.com's disproportionately low click share in §2 despite its best-in-portfolio average position. - johnmoelker.com — broken checkout.
main.jshasTRIPWIRE_CHECKOUT_URL = ""— the $27 tripwire product cannot be bought. MailerLite capture on the same page still works. - Blog — duplicate articles + nondeterministic render. 3 published articles are stored TWICE with byte-identical content (slugs
ai-and-the-art-of-church-follow-up,anthropic-ai-safety-and-christian-conscience,five-questions-ai-provider-safety), rendering 4x on/blogagainst a 2x baseline.getArticleBySlug()has no.order(), so which copy renders is nondeterministic. Separately, 5 articles carry a doubled brand suffix inseo.metaTitle, and 2 have a title-year vspublished_atmismatch.
None of these were deployed/fixed as part of this documentation pass — they are reported findings. See FOUNDER_ACTIONS.md (2026-08-24 entries) for what needs a founder decision.
5. Chatbot conversations — the metric is not what any dashboard would imply
chatbot_conversations total = 23,834 rows. By session_id prefix:
| Prefix | Count | Share | What it is |
|---|---|---|---|
e2e-* | 19,497 | 81.8% | The end-to-end test suite, writing to production, still active today |
bhv-snap-* | 1,018 | 4.3% | Behavioral snapshot tests |
health-check-* | 762 | 3.2% | The 0 */4 * * * cron in /api/cron/health-check → src/lib/health-check-suite.ts checkChatbotStream(), which POSTs to production /api/chatbot/stream |
test-* | 216 | 0.9% | — |
demo-* | 74 | 0.3% | — |
| unprefixed remainder | 2,267 | 9.5% | Of these, only 317 have visitor_message_count >= 2 |
≈90.5% of the table is our own test traffic. Genuine human conversations across all time are in the low hundreds, not the thousands the raw row count would suggest to an agent glancing at SELECT COUNT(*).
Correction to record: user_agent, referrer, and message_count are never populated by any write path in this table — they are null/zero for every row, synthetic or real. Do not use them to try to distinguish test traffic from genuine visitors; visitor_message_count / bot_message_count are the columns that are actually populated and meaningful.
This has a direct implication for knowledge/products/growth-command-center.md and any future "conversations" KPI tile: filter session_id NOT LIKE 'e2e-%' AND session_id NOT LIKE 'bhv-snap-%' AND session_id NOT LIKE 'health-check-%' AND session_id NOT LIKE 'test-%' AND session_id NOT LIKE 'demo-%' before quoting a conversation count anywhere founder- or customer-facing.
6. Outreach funnel (outreach_contacts, positive-control verified)
| Stage | Count |
|---|---|
| sent | 3,430 |
| demo_viewed | 188 |
| demo_chatted | 33 |
| demo_cta_clicked | 1 |
| demo_claim_clicked | 2 |
| converted_at | 0 |
| replied | 28 |
The single demo_cta_clicked_at row is a test fixture, not a real prospect: demo_slug='cwa-e2e-funnel-fixture', every timestamp within ~1 second of the others, dated 2026-06-11. Real human CTA clicks: zero, all-time, as of 2026-08-24.
One genuine prospect (gospel-fellowship-b1d6) clicked the demo CTA on 2026-06-06 — five days before the RPC mapping that records demo_cta_clicked_at was fixed — and was never backfilled. Their click is real but absent from the table above.
7. Measurement infrastructure — what is actually dark
analytics_events: 0 rows, all time. Nothing writes it. PostHog is the real sink for in-product events, with the bot-contamination caveat below.telemetry_events: dead since 2025-08-30.billing_events/payment_events: 0 rows, all time. There is no in-DB revenue ledger; Stripe itself is the only source of truth for revenue.- No GSC persistence existed before 2026-08-24. A new table + ingest script were built this session specifically so the numbers in §2-§3 don't have to be re-derived from scratch next time.
GA4_API_SECRETwas never set in Vercel → the server-side purchase event (Measurement Protocol) is dark, even though client-sidegtaghas been live since 2026-06-10 (PR #845, perknowledge/products/growth-command-center.md). Client-side pageview/event tracking working does NOT mean the purchase conversion event is reaching GA4.- Google Ads offline-conversion mechanism does not exist — it is a credential-less stub (
ad-conversions.tsfan-out awaitingGOOGLE_ADS_*), not a working integration that merely lacks data. - PostHog is bot-contaminated and not usable for traffic claims. It once reported 3.6× growth that was traced to a single bot fleet; a dedicated sermonwise.ai measurement found 69% of its traffic was bot.
knowledge/products/growth-command-center.mdpreviously called PostHog "the analytics source of truth" — that line has been corrected in place. GSC is the source of truth for traffic/search; PostHog is at best directional for in-product behavior once a human is already inside the product. - Two parallel property registries exist and disagree:
geo_properties.key(GEO Command Center, a DB table) andPropertyTag(churchwiseai-web/src/lib/property-registry.ts, a code enum).PropertyTagis missing comparelocal, realtywise, and johnmoelker, all of whichgeo_propertiesalready has. Noted in place inknowledge/products/growth-command-center.md; not reconciled as part of this pass — that's a build task, not a docs fix.
8. Revenue state
4 active Stripe subscriptions, all four carrying a discount:
- Melvindale Church of God — internal test account, permanent 100% off, $0/mo.
- Beckwith Hills CRC — grandfathered at $14.95/mo for life.
- Calvary Chatham — accepted the offer 2026-08-13, has been invoiced nothing since. The
premium_churchesrow is stillplan='cwa_demo_prospect',status='preview'. The quoted $99.95/mo CRC rate does not exist as a Stripe price object — it cannot be invoiced until one is created. - Waterloo CRC and Blenheim CRC hold the same $99.95/mo CRC offer, unanswered as of 2026-08-24.
No knowledge/ doc asserted Calvary Chatham was billing correctly, so nothing needed correcting there — this is new information, recorded here and in FOUNDER_ACTIONS.md 2026-08-24 for the founder decision it requires.
9. How this baseline was produced / how to refresh it
- GSC: read at
/u/3/(memory:reference_gsc_properties_live_under_authuser3.md— the default Google account has zero properties registered). - Church count, chatbot composition, outreach funnel: direct SQL via the Supabase MCP against project
wrwkszmobuhvcfjipasi. - Live defects: direct HTTP probes + Playwright against the real hosts (not preview URLs — preview hosts skip hostname-rewrite middleware).
- Known gap in this sweep: the Supabase MCP token expired partway through, so the
churchesraw total (§1) and a handful of other read-only follow-up queries were not re-verified. SeeFOUNDER_ACTIONS.md2026-08-24 for the re-auth item. Re-run this section once re-authed rather than assuming the 2026-04-11 total still holds. - To refresh this baseline later: re-run the same four measurement surfaces (GSC 90-day pull, GSC Pages report,
chatbot_conversationsprefix breakdown,outreach_contactsfunnel counts) and update this doc'slast-verifieddate — do not silently let it go stale the waydata/stats.yamldid for 4+ months.