Knowledge > Runbooks > Business Ops > Weekly Metrics Review
Weekly Metrics Review
A 30-minute weekly review of product, operational, and business metrics across all ChurchWiseAI properties. Run this once per week to track trajectory and catch trends before they become problems.
Prerequisites
- Access to Supabase SQL editor or MCP tool
- Stripe CLI (test and live mode access)
- Access to Vercel dashboard for infrastructure metrics
Metrics to Gather
1. Subscription Activity This Week
-- New subscriptions
SELECT count(*) as new_subscriptions
FROM premium_churches
WHERE created_at > now() - interval '7 days'
AND stripe_subscription_id IS NOT NULL;
-- Cancellations (subscriptions that lost their stripe_subscription_id)
-- Note: adjust query based on actual schema for tracking cancellations
SELECT count(*) FROM premium_churches
WHERE updated_at > now() - interval '7 days'
AND stripe_subscription_id IS NULL
AND plan != 'free';
Via Stripe CLI (live mode when customers exist):
stripe subscriptions list --status canceled --limit 20 --api-key $STRIPE_LIVE_SECRET_KEY
2. Voice Call Volume
SELECT
date_trunc('week', created_at) as week,
count(*) as total_calls,
count(DISTINCT church_id) as churches_with_calls,
round(avg(extract(epoch from (ended_at - started_at))/60)::numeric, 1) as avg_duration_min
FROM voice_call_logs
WHERE created_at > now() - interval '28 days'
GROUP BY week ORDER BY week DESC;
3. Engagement: Prayer Requests and Callbacks
SELECT
date_trunc('week', created_at) as week,
'prayer_request' as type,
count(*) as count
FROM voice_prayer_requests
WHERE created_at > now() - interval '28 days'
GROUP BY week
UNION ALL
SELECT
date_trunc('week', created_at),
'callback',
count(*)
FROM voice_callback_requests
WHERE created_at > now() - interval '28 days'
GROUP BY week
ORDER BY week DESC, type;
4. Visitor Contact Captures
SELECT date_trunc('week', created_at) as week, count(*) as visitor_captures
FROM voice_visitor_contacts
WHERE created_at > now() - interval '28 days'
GROUP BY week ORDER BY week DESC;
5. Content Growth (ITW Illustrations)
SELECT
date_trunc('week', created_at) as week,
count(*) as new_illustrations
FROM unified_rag_content
WHERE content_type = 'illustration'
AND created_at > now() - interval '28 days'
GROUP BY week ORDER BY week DESC;
6. Error Rate Trend
SELECT
date_trunc('week', created_at) as week,
count(*) FILTER (WHERE severity = 'P0') as p0_errors,
count(*) FILTER (WHERE severity = 'P1') as p1_errors,
count(*) FILTER (WHERE severity = 'P2') as p2_errors
FROM ops_error_reports
WHERE created_at > now() - interval '28 days'
GROUP BY week ORDER BY week DESC;
Flag any week where P0 errors increased vs. prior week.
7. PewSearch Directory Health
-- Visible church count (should be stable ~218K)
SELECT count(*) FROM churches WHERE directory_visible = true;
-- New premium pages this week
SELECT count(*) FROM premium_churches
WHERE plan = 'pro_website'
AND created_at > now() - interval '7 days';
8. Compile into a Weekly Status Update
Format for the record (add to a running notes doc or DECISION_LOG.md if significant):
Week of [date]:
- New subscriptions: X
- Cancellations: X
- MRR: $X (change: +/-$X)
- Voice calls: X total, X churches active
- Prayer requests: X | Callbacks: X | Visitor captures: X
- New illustrations: X
- P0 errors: X (vs X last week)
- Notable events: [anything unusual]
Verification
- All queries return results without errors
- Numbers are plausible (sanity check against prior week)
- Any anomalies (spike in errors, drop in calls, unexpected churn) are documented