-
-
Sybil dashboard when no churn risk has been detected
-
Sybil detecting accounts at risk of churn, scored by revenue and failure type
-
Sybil notification to Customer Success Managers in Slack
-
Sybil account incident page where Customer Success Manager can immediately send proactive message
-
Customer Account Manager can close the loop when the incident is resolved
-
Click View Query to see the live SQL behind the Sybil table feed.
Inspiration
Customer Success teams have signals for churn risk (e.g., health scores, usage trends, support tickets) but they're mostly lagging or self-reported. A support ticket is the clearest example: by the time it's filed, the customer's already unhappy. And most never file one: ThinkJar's Esteban Kolsky found that only 1 in 26 unhappy customers ever complain — the other 25 just churn.
But a leading, real-time signal is sitting in their own product telemetry; it just isn't connected to revenue.
What Sybil does
Sybil connects a telemetry failure to the revenue behind it, and scores each account by renewal dollars at risk and the type of failure. It notifies a Customer Success Manager via Slack when a real service issue has been detected, and helps the CSM immediately send a proactive message to help mitigate churn risk and maintain customer trust. When the issue has been resolved, Sybil also lets the CSM close the loop with the customer.
How I built it
I chose Aurora PostgreSQL because the detection is a SQL query. It uses per-account z-score baselining plus exposure scoring blended into one revenue-weighted ranking, running on an engine that scales to zero between incidents to minimize costs.
I built the demo around an identity/SSO vendor, because there a single failure is both an outage and a renewal risk: a terminated employee's de-provisioning webhook silently fails, their admin session stays live, and nobody notices until the security review or the renewal call.
The domain choice seemed like a natural fit since identity and SSO telemetry is likely to be tenant scoped, so attributing a failure to a customer account is a join, not a guess.
Sybil is not just an alert on any telemetry error - different failures need to be scored differently. In this demo, we have:
- High-volume sync failures → a rate anomaly. I baseline each tenant against its own 7-day hourly history and flag a live burst that blows past
mu + 3σ. A z-score works here because there's a baseline to deviate from. - A single terminated-admin-still-logged-in event → a z-score is useless, because the baseline is zero. One occurrence is already a P1. So those get exposure scoring: blast radius × sensitivity × dwell time.
Both blend into one revenue-weighted risk score, so a whale account with a confirmed exposure near renewal outranks a bigger account that's merely showing some instability. And it's all SQL. This is what the CX research keeps landing on: two correlated signals predict churn far better than either one alone. The difference here is that Sybil's signals resolves in real-time to a dollar figure, proximity to renewal, and a named owner, and give CSMs the ability to reach out to a key at-risk account almost immediately.
Challenges I ran into
The RDS Data API can't bind native Postgres enums. I had a clean pgEnum schema; the Data API path rejected it. I moved the whole schema to text columns + CHECK constraints to keep the same safety without the binding.
My anomaly detector quietly stopped firing for some accounts, and it took me a while to see why. I cache the 7-day baseline in a materialized view so the live query stays fast — but if that rollup ever refreshed while an incident was live, the burst got baked into the baseline itself. The tenant's "normal" rate jumped, so a real spike no longer looked abnormal and the account never surfaced. The fix was to recompute the rollup on reset, so a cleared incident can't keep poisoning the baseline.
Accomplishments that I'm proud of
The detection is entirely SQL — no ML black box. That means a CSM can trust the flag is rooted in real, inspectable data: this account's sync failures are many times its own baseline, with a confirmed exposure — not an opaque score.
I got the real provider pipeline to drive the whole UI. A raw Sentry webhook hits the same ingest endpoint a production integration would; detection picks it up, the board goes red, an incident opens, and the owner gets pinged in Slack.
And it stays cheap and closed: the cluster scales to zero between incidents, and the app is designed to reach the database over the RDS Data API — no open port.
What I learned
Use the right detector for the signal. I started trying to z-score everything, but a rare event — one terminated admin still holding a live session — has a baseline of zero, so a z-score is meaningless. Different failures genuinely need different math.
The bigger realization came later: those detectors aren't identity-specific — they're statistical patterns. A sync-failure burst here is the same rate-anomaly detector as an API-error burst at a payments company; only the normalized event model underneath changes. That reframed what the product actually is. The hard part isn't writing custom SQL per customer — it's knowing which detector fits which signal. That part generalizes.
What's next for Sybil: Customer Observability for B2B SaaS
- Real ARR and Renewal Dates. The dollar weighting is seeded for the demo; in production it would upsert from the system of record (CRM) through that same ingest path, so every number traces back to billing.
- General telemetry attribution. The hardest part will be normalizing how to extract a customer identifier out of telemetry data from the providers - whether it's a tag, structured field data, or something else — and how to handle when no identifier exists.
- A standardized library of detectors. Because everything lands in one normalized model, the detectors are reusable primitives — rate anomaly, rare-event exposure, latency degradation, policy violations — not bespoke SQL per customer. The IP is the library and knowing which detector fits which signal.
- Onboarding as configuration, not a rebuild. New customers map their event types to detectors and tune the risk weights (how much ARR vs. exposure vs. renewal proximity matters to them); per-tenant baselines are learned automatically. A standard core with an escape hatch for the long tail — a product, not a consulting engagement.
- Close the loop on outcomes. Track whether proactive outreach actually reduced churn, so the risk weights can learn from what worked — the difference between measuring experience and steering it.
- Real auth and multi-CSM workflows, replacing the demo SSO gate.
Built With
- amazon-aurora-serverless-v2
- amazon-vpc
- amazon-web-services
- aws-iam
- aws-rds-data-api
- aws-secrets-manager
- drizzle-orm
- next.js
- node.js
- postgresql
- react
- sql
- tailwindcss
- terraform
- typescript
- vercel
- zod


Log in or sign up for Devpost to join the conversation.