Observability Basics for Solo SaaS: Logs, Metrics, and Alerts That Fit One Person

A minimal observability setup for indie founders: what to log, which metrics matter, how to alert without noise, and how to debug production without a platform team.

Solo founders often discover production the hard way: a customer reports an error you cannot reproduce, a bill spikes overnight, or the app is slow for one region and fine for you. A full observability platform is unnecessary on day one. A small, deliberate setup is not.

Observability here means you can answer three questions without guessing: Is the product up? Is it fast enough? What failed for this user or request?

Start with golden signals, not every possible chart

For a typical request/response SaaS, track:

  1. Availability — success rate of critical endpoints (login, checkout, core API).
  2. Latency — p50 and p95 for those endpoints, not only the average.
  3. Errors — rate and absolute count of 5xx and unhandled exceptions.
  4. Saturation — CPU, memory, database connections, queue depth, or API quota usage for the resources you actually depend on.

If you run background jobs, add job success rate and age of the oldest pending job. If you call paid AI APIs, add token or request volume and cost per day.

Four to eight time series you look at weekly beat fifty dashboards you never open.

Logs: structured, sampled, and tied to a request id

Prefer structured logs (JSON fields) over free-text only. For each request, record at least:

  • Timestamp and severity.
  • Request or correlation id.
  • Route or job name.
  • User or tenant id when safe (avoid logging emails, tokens, or payloads with secrets).
  • Outcome (status code, error class).
  • Duration.

Do not log secrets. API keys, session cookies, raw password reset tokens, and full payment payloads do not belong in log storage. Redact by default.

On high-traffic endpoints, sample successful debug logs and keep errors at full fidelity. Storage cost and noise rise faster than most founders expect.

Metrics: name them so future-you understands them

Use stable names and labels:

  • http_request_duration_seconds with labels for route and status class.
  • job_failures_total with a job name label.
  • billing_webhook_failures_total.

Avoid unbounded label values (raw user ids as labels) that explode cardinality in systems like Prometheus. Tenant-level debug belongs in logs with a request id, not in a million time series.

Traces when the stack has more than one hop

If the app is a single process talking to one database, good logs and metrics may be enough. When you add queues, workers, and external APIs, distributed traces help you see which hop is slow. Many hosts offer light APM; use it on the critical path first, not on every background script.

Alerts that respect a solo founder’s sleep

Alert only on conditions that need a human soon:

  • Sustained error rate above a threshold on a critical route.
  • Payment webhook failures.
  • Disk or connection pool near exhaustion.
  • Certificate expiry within a safety window.
  • Job queue lag beyond a defined SLA.

Do not page yourself for every 404, every slow request, or a single failed cron in a non-critical job. Noise trains you to ignore alerts.

Each alert should answer: what is broken, who is affected, and what is the first place to look. Link a short runbook—even a paragraph in your repo README.

A minimal stack that is “good enough”

There is no single correct vendor. Combinations that work for small products include:

  • Host-native metrics and logs (Railway, Fly, Render, Vercel, AWS, GCP each have a path).
  • An error tracker (for example Sentry-class tools) for exceptions with stack traces.
  • Uptime checks from outside your network against /health and the marketing site.
  • A simple status communication path (even a pinned GitHub issue or a status page) when you have an extended outage.

The criterion is not brand prestige. It is whether you can diagnose a production issue in minutes instead of hours.

Health endpoints and deploy discipline

Expose a health route that checks dependencies you own (database ping, required env present). Keep it cheap. Use it for load balancer checks and external uptime monitors.

On deploy:

  • Prefer migrations that are backward compatible with the currently running app.
  • Watch error rate and latency for fifteen minutes after a release.
  • Keep an easy rollback path for the app version; treat data migrations with more care than code rollbacks.

Privacy and compliance touch observability too

Logs and error trackers are data processors. They may receive IP addresses, user ids, and occasionally user-generated content that landed in an exception message. Configure retention, restrict access, and mention major processors in your Privacy Policy. That is part of running a trustworthy product, not only a legal footnote.

A one-weekend implementation plan

  1. Add request ids and structured error logs on the server.
  2. Turn on exception tracking in production only, with scrubbing for sensitive fields.
  3. Define three alerts: high 5xx rate, webhook failures, uptime check down.
  4. Create a /health check and an external monitor.
  5. Write a one-page runbook: how to verify an incident, where logs live, how to roll back.

Observability is not a substitute for tests or careful deploys. It is how you learn from reality when users—and production—behave differently from your laptop.