AI News Hub Logo

AI News Hub

I Built a SaaS Analytics Tool That Stores Zero Customer Data: Here's the Architecture

DEV Community
Jules

Article Most SaaS analytics tools work the same way: connect your payment provider, we ingest your data, store it in our database, and show you dashboards. Simple, proven, and... a privacy nightmare. When I built NoNoiseMetrics, I went a different route. Session-only architecture: your Stripe data is fetched, processed, and displayed in real time — then discarded. Nothing is persisted on our servers. Ever. Here's why, and how it works. Tools like ChartMogul and Baremetrics follow the same pattern: Stripe API → ETL → PostgreSQL → Dashboard Your raw financial data — every invoice, every customer, every charge — lives on someone else's server, indefinitely. For bootstrapped SaaS founders, that creates three issues: GDPR compliance becomes your problem AND theirs Data breach surface area doubles Trust is harder to build when you're asking for full Stripe access NoNoiseMetrics flips the pipeline: Stripe API (read-only key) → Real-time processing → Browser render → Session ends → Data gone Here's what happens under the hood: User connects a restricted Stripe API key (read-only — we can't modify anything) On each session, we call the Stripe API to pull the relevant objects: subscriptions, invoices, charges, customers Metrics are computed server-side in memory: MRR waterfall, churn cohorts, NRR, LTV Results are sent to the frontend and rendered When the session ends, nothing is retained No database stores your financial data. No background sync. No data warehouse. This architecture isn't free lunch: Traditional (ChartMogul/Baremetrics) Session-only (NNM) Historical data Pre-computed, instant Fetched each session Dashboard load time ~1s ~3-8s (depends on Stripe data volume) Offline access Yes No Data stored on 3rd party Yes, all of it None GDPR surface Shared responsibility Minimal — session data only Background alerts Yes Not yet For indie hackers tracking MRR under $100K, the tradeoff is worth it. You get your metrics without handing over your financial data to yet another SaaS. For anyone curious about the infrastructure: Frontend: React, deployed on Vercel Backend: Node.js on Railway Auth & minimal state: Supabase (user accounts only — no Stripe data) Payments: Stripe (yes, we use Stripe to analyze Stripe) Blog/SEO: Astro (separate from the React SPA) Monthly infrastructure cost: under $50. Here's a simplified version of how I compute MRR breakdown from raw Stripe data: function computeMRRWaterfall(subscriptions, period) { const waterfall = { newMRR: 0, expansionMRR: 0, contractionMRR: 0, churnedMRR: 0, }; for (const sub of subscriptions) { const current = getMRRForPeriod(sub, period); const previous = getMRRForPeriod(sub, previousPeriod(period)); if (previous === 0 && current > 0) { waterfall.newMRR += current; } else if (current > previous) { waterfall.expansionMRR += (current - previous); } else if (current 0) { waterfall.contractionMRR += (previous - current); } else if (current === 0 && previous > 0) { waterfall.churnedMRR += previous; } } return waterfall; } The real implementation handles edge cases (prorations, trials, multi-currency), but the core logic stays straightforward. If you're a bootstrapped founder, you probably care about three things: MRR growth — is the trend going up? Churn — who's leaving and why? NRR — are existing customers growing? You don't need a data warehouse for this. You need a clean dashboard that tells you the truth and doesn't store your financial data on servers you don't control. That's what I built with NoNoiseMetrics. It's free to start, and your data stays yours. If you want to dig deeper into Stripe analytics, I wrote a full guide on what Stripe's native dashboard misses and how to fill the gaps. What's your approach to SaaS analytics? Do you care about where your financial data lives, or is it a non-issue? Curious to hear.``