Inspiration
Small businesses lose customers every day without realizing it — until the revenue drop shows up weeks later. Most churn detection tools only look at numbers: usage drops, purchase frequency, subscription cancellations. But by the time the numbers move, the customer is usually already gone.
We noticed something nobody was really tracking: how customers talk. A customer who used to write warm, detailed emails but now sends short, delayed one-liners is telling you something — long before they officially churn. And that signal doesn't just live in private messages. It also shows up publicly, in Google Maps reviews and food delivery platform reviews, where customers often say things they'd never say directly to a business.
We wanted to build something that listens to both channels — what customers tell you, and what they tell everyone else.
What it does
Silent Churn is an early warning system that monitors customer sentiment across three data channels:
- Email/message tone — analyzing formality, length, and response delay over time
- Google Maps reviews — tracking rating and sentiment trends for the business
- Food delivery platform reviews — capturing another public signal of customer satisfaction
The app combines these signals into a single weighted churn risk score per customer (Email 40%, Google Maps 30%, Food Platform 30%), flags customers as Healthy / Warning / At Risk, and shows why — with a plain-language explanation generated by AI (e.g. "response time increased, sentences got shorter"). Business owners get a real-time dashboard with trend charts, so they can act before a customer disappears for good.
How we built it
- Backend: FastAPI + SQLite, with a modular "provider adapter" architecture that supports multiple AI backends
- Frontend: React + Vite + Tailwind CSS, with a dark-themed, glassmorphism dashboard and interactive charts (Recharts)
- AI Layer: Flexible by design — works with a fully local LLM via LM Studio (for privacy and zero cost) or cloud APIs (OpenAI, Anthropic, Groq), selectable right from the onboarding screen
- Data: Real Google Maps reviews via the Google Places API, combined with realistic synthetic customer data (emails, reviews) generated by the LLM itself for demo purposes
- Risk Engine: A weighted scoring service that pulls sentiment scores from all three sources, tracks trend direction over time, and surfaces at-risk customers automatically
Challenges we ran into
- Balancing multiple data sources fairly — getting the weighting right between email, Maps, and food platform signals so no single channel dominates the score
- No official API for food delivery platforms — we designed the system to plug into a real API in production, but used realistic synthetic data for the demo, keeping the architecture ready for real integration
- Supporting both local and cloud AI — building a provider-agnostic architecture so the same analysis pipeline works identically whether it's talking to a model running on your laptop or a cloud API
- Making local inference demo-friendly — generating and analyzing dozens of data points sequentially through a local model takes time, so we had to think carefully about the demo flow
What we learned
We learned that tone and public sentiment are underused signals in churn prediction — most tools stop at usage metrics. We also learned a lot about designing flexible AI backends that don't lock users into a single (and often costly) provider, which matters a lot for small businesses with tight budgets.
What's next for Silent Churn
- Real integration with food delivery platform APIs/partnerships
- Automated outreach suggestions (AI-drafted win-back messages) triggered directly from risk alerts
- Support for more channels (SMS, live chat, social media mentions)
- Multi-location support for small business chains
Built With
- ai
- anthropic-api
- fastapi
- google-places
- groq
- javascript
- llm
- lm-studio
- machine-learning
- openai-api
- pydantic
- python
- react
- recharts
- rest-api
- sqlalchemy
- sqlite
- tailwindcss
- uvicorn
- vite
Log in or sign up for Devpost to join the conversation.