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.
The Problem with Traditional Analytics Pipelines
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
The Session-Only Alternative
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.
The Tradeoffs (Being Honest)
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.
The Stack
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.
Key Metric Computations
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 < previous && 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.
Why This Matters for Indie Hackers
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.``
Top comments (0)