Knowledge > Runbooks > Business Ops > Customer Churn Analysis
Customer Churn Analysis
Analyze cancelled subscriptions to understand why customers leave and improve retention before the pattern repeats.
Prerequisites
- Stripe CLI with live mode access (
STRIPE_LIVE_SECRET_KEY) - Access to Supabase SQL editor
- At least 3–5 churned customers to identify meaningful patterns (this runbook is most useful after the first few months of paying customers)
Note: As of 2026-04-10, there are 3 Stripe subscriptions (1 customer + 2 founder tests) and 0 churned customers. Run this analysis once you have your first churn event. The runbook is ready — just needs data.
Steps
1. Pull Churned Subscriptions from Stripe
# List cancelled subscriptions (most recent first)
stripe subscriptions list --status canceled --limit 50 --api-key $STRIPE_LIVE_SECRET_KEY
For each cancelled subscription, note:
- Customer ID
- Plan/product
- Cancellation date
- How long they were a customer (tenure)
- Cancellation reason (if provided in Stripe cancellation survey)
2. Identify Churned Records in the Database
-- premium_churches where stripe_subscription_id is NULL but was previously set
-- (This depends on whether we log the history — adjust to actual schema)
SELECT
pc.id,
pc.church_id,
pc.plan,
pc.tier,
pc.updated_at as churned_at,
c.name as church_name,
c.city,
c.state
FROM premium_churches pc
JOIN churches c ON pc.church_id = c.id
WHERE pc.stripe_subscription_id IS NULL
AND pc.plan = 'free' -- was downgraded to free
AND pc.updated_at > now() - interval '90 days'
ORDER BY pc.updated_at DESC;
If there's a separate churn_log table or event log: query that instead.
3. Analyze Pre-Churn Engagement
For each churned church, look at their engagement in the 30 days before churning:
-- Voice calls in last 30 days before churn
SELECT church_id, count(*) as calls_before_churn
FROM voice_call_logs
WHERE church_id = '[churned-church-id]'
AND created_at BETWEEN '[churn_date]'::timestamp - interval '30 days' AND '[churn_date]'::timestamp;
-- KB content count at time of churn
SELECT count(*) as kb_entries_at_churn
FROM unified_rag_content
WHERE church_id = '[churned-church-id]'
AND created_at < '[churn_date]';
4. Look for Common Churn Patterns
Cluster churned customers by attributes to find patterns:
| Dimension | Questions to Answer |
|---|---|
| Plan type | Did a particular plan churn more? (Starter vs. Pro vs. Suite?) |
| Tenure | Did most churn in month 1, 2, 3? (Early vs. late churn) |
| Feature usage | Did they ever set up the KB? Ever make a voice call? |
| Church size | Were they small (40 members), medium, large? |
| Admin logins | When did they last log in before churning? |
| Cancellation reason | What reason did they give in Stripe's cancellation flow? |
5. Calculate Churn Rate
Monthly Churn Rate = (Customers Lost This Month) / (Customers at Start of Month) × 100%
Target: < 5% monthly churn (best-in-class SaaS). > 10% is a significant problem requiring immediate action.
6. Update Customer Health Check Based on Findings
After analyzing churn, update customer-health-check.md with newly discovered early warning signals. Example discoveries:
- "Churches that never added KB content churned within 60 days" → add "0 KB entries after 14 days" as Red signal
- "Churches with no admin login in 30 days always churned within 15 days" → escalate Yellow to Red threshold
- "Pro plan churned less than Starter" → feature differentiation may be working
7. Take Action on Insights
For each confirmed pattern:
- If it's a product gap (e.g., "setup was too hard"): create a feature or onboarding improvement task
- If it's a pricing issue (e.g., "too expensive for small churches"): surface to founder with data
- If it's a missing feature (e.g., "needed X that we don't have"): add to FEATURE_REGISTRY.md as a consideration
8. Document Findings
Append to DECISION_LOG.md:
- 2026-03-25: Churn analysis — Q1 2026. X churned, X% monthly rate. Top pattern: [finding]. Actions: [list].
Verification
- Every churned customer in the analysis period has been reviewed
- At least 2–3 patterns identified (even if they're "no pattern yet" with small N)
- Customer health check updated with any new early warning signals
- Feature or onboarding improvements filed if product gaps identified