10,000 customers, twelve attributes each, one question from the retention team: who is about to walk, and what would keep them? The dashboard below is live. Filter it by region or segment and every number recomputes from the row-level data in your browser.
This mirrors the Power BI report, page for page: same measures, same layout logic. Try Southeast plus Everyday banking, or Student on its own.
Customers with two or more complaints in the past year churn at roughly four times the base rate. A complaint is the last conversation before the exit, and the data shows the bank usually gets exactly one chance to fix it.
Churn among customers under a year of tenure runs far above the book average, then drops sharply after year two. Onboarding is not a courtesy email; it is the single best retention window the bank has.
Holding one product doubles churn risk versus holding three or more. Every additional product deepens the switching cost. Cross-sell is usually pitched as revenue; here it is retention insurance.
Stand up a 90-day onboarding journey for new customers, trigger a save-desk call within 48 hours of any second complaint, and target single-product customers over 24 months of tenure with one relevant cross-sell. Scored against this book, those three moves address the segments holding the majority of the balance at risk.
The dashboard above is the design spec; the Power BI report is the deliverable. Star schema with a customer fact table, a date dimension, and disconnected filter tables for the slicers. The measures below drive every visual.
-- headline rate Churn Rate = DIVIDE ( CALCULATE ( COUNTROWS ( Customers ), Customers[churned] = 1 ), COUNTROWS ( Customers ) ) -- money walking out the door Balance at Risk = CALCULATE ( SUM ( Customers[balance_usd] ), Customers[churned] = 1 ) -- lift vs the whole book Churn Rate Lift = [Churn Rate] - CALCULATE ( [Churn Rate], ALL ( Customers ) )
-- tenure-band churn, the chart that led the readout SELECT CASE WHEN tenure_months <= 12 THEN '0-12' WHEN tenure_months <= 24 THEN '13-24' WHEN tenure_months <= 60 THEN '25-60' WHEN tenure_months <= 120 THEN '61-120' ELSE '120+' END AS tenure_band, COUNT(*) AS customers, AVG(churned * 100.0) AS churn_rate_pct, SUM(balance_usd * churned) AS balance_at_risk FROM customers GROUP BY 1 ORDER BY MIN(tenure_months);