Every startup reaches the moment: your product is down, users are complaining, and you have no idea what’s wrong. Without monitoring, you’re flying blind.
Production systems aren’t “set and forget.” They’re living organisms that require ongoing care, attention, and feeding.
•
Regular check-ins (not just when alerts fire)
•
Dependency updates and security patches
•
Capacity adjustments as usage changes
•
Configuration tuning based on real behavior
•
Proactive maintenance before things break
Shipping to production isn’t the end—it’s the beginning. A feature launched without monitoring, without maintenance plans, without ownership clarity isn’t really shipped. It’s abandoned.
Signs of a neglected service:
•
Dependencies months or years out of date
•
No one knows how it works
•
Alerts disabled because they were “noisy”
•
Documentation describes a different system
•
“It works, don’t touch it” culture
What healthy ownership looks like:
•
Someone is responsible for this service’s health
•
Regular reviews of error rates and performance
•
Proactive upgrades, not just reactive fixes
•
Runbooks that reflect current reality
•
The service gets better over time, not worse
Treat your production systems like you’d treat anything else that’s alive: they need attention, care, and someone who notices when they’re not doing well.
But observability is a deep field, and startups don’t have time for enterprise-grade setups. Here’s the minimum viable monitoring that catches problems before they become disasters.
Observability traditionally has three pillars:
Logs: Records of what happened. “User 123 logged in at 10:30.”
Metrics: Aggregated measurements. “Average response time is 150ms.”
Traces: End-to-end request paths. “This request went from API → Database → Cache → Response.”
For early startups, focus on logs and metrics. Add tracing when you have complex distributed systems.
Is your product up? This is the most basic question.
•
HTTP endpoints returning 200
•
Database connections working
•
Third-party services responding
Alert: Immediately when any critical service goes down.
•
Error rates (errors per minute)
•
Error types (4xx vs 5xx, specific exceptions)
•
Error trends (increasing? Stable?)
Alert: When error rate exceeds normal baseline.
•
Response time (p50, p95, p99)
•
Page load time (frontend)
Alert: When latency degrades significantly.
Alert: When metrics deviate from normal patterns.
Alert: When approaching capacity limits.
Sentry is the standard. It captures errors, stack traces, and context automatically.
import * as Sentry from '@sentry/node';
Sentry.init({
dsn: 'YOUR_DSN',
environment: process.env.NODE_ENV,
});
Sentry will catch and report uncaught exceptions, and you can manually capture errors:
try {
riskyOperation();
} catch (error) {
Sentry.captureException(error);
// handle error
}
External checks that your site is reachable:
Logtail, Logflare, or Papertrail for log aggregation. Your platform (Vercel, Fly, AWS) likely has built-in logging too.
Structured logging helps:
// Bad
console.log('User logged in');
// Good
logger.info('user_login', {
userId: user.id,
email: user.email,
timestamp: Date.now(),
});
Structured logs can be searched and aggregated.
Application Performance Monitoring (APM)
Full observability platforms:
•
Datadog – Comprehensive but expensive
•
New Relic – Similar to Datadog
•
Grafana Cloud – Good if you like building dashboards
•
PostHog – Combines product analytics with some observability
For startups, Sentry + uptime monitoring + platform logs is often enough. Add full APM when complexity demands it.
•
Amplitude, Mixpanel – Full-featured analytics
•
PostHog – Open source, self-hostable
•
Plausible, Fathom – Simple, privacy-focused web analytics
Alert on symptoms, not causes. Alert when the API is slow, not when CPU is high. High CPU that doesn’t affect users isn’t urgent.
Alert on user impact. Would this affect users? If not, it might be informational but not urgent.
Avoid alert fatigue. Too many alerts means they get ignored. Only alert on things that require immediate action.
Define response procedures. When this alert fires, what do you do? Document it.
These alerts matter for every startup:
1.
Site down – Any critical endpoint unreachable
2.
Error spike – Error rate exceeds baseline
3.
Latency degradation – Response time significantly slower
4.
Database issues – Connection failures, slow queries
5.
Queue backup – Background jobs not processing
•
Slack/Email for warnings and low-priority
•
PagerDuty/Opsgenie for critical alerts that need immediate response
•
On-call rotation when you have multiple people
For small teams, a single founder on-call with phone alerts is fine.
A single dashboard showing system health:
•
Request rate (is traffic normal?)
•
Error rate (are things breaking?)
•
Top errors (what’s breaking?)
Keep it simple. One screen you can glance at to know if things are healthy.
Create an endpoint that verifies critical dependencies:
app.get('/health', async (req, res) => {
const checks = {
database: await checkDatabase(),
redis: await checkRedis(),
stripe: await checkStripe(),
};
const healthy = Object.values(checks).every(c => c.ok);
res.status(healthy ? 200 : 503).json(checks);
});
Point uptime monitors at this endpoint.
Request Logging Middleware
Log every request for debugging:
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
logger.info('request', {
method: req.method,
path: req.path,
status: res.statusCode,
duration: Date.now() - start,
userId: req.user?.id,
});
});
next();
});
Error Boundaries (Frontend)
Catch React errors before they crash the whole app:
class ErrorBoundary extends React.Component {
componentDidCatch(error, errorInfo) {
Sentry.captureException(error, { extra: errorInfo });
}
render() {
if (this.state.hasError) {
return <ErrorFallback />;
}
return this.props.children;
}
}
Debugging Production Issues
1.
Check alerts and dashboards. What’s the symptom?
2.
Check error tracking. What specific errors are occurring?
3.
Check logs. What was happening around that time?
4.
Check recent deploys. Did something change?
5.
Check dependencies. Are third-party services having issues?
6.
Reproduce if possible. Can you trigger the error?
Having good observability means you spend minutes, not hours, finding root causes.
No monitoring until it’s too late. Set up basics before you need them.
Monitoring everything. Noise obscures signal. Focus on what matters.
Not testing alerts. Alerts that don’t fire when they should are useless.
Sensitive data in logs. Don’t log passwords, tokens, or PII.
Alert fatigue. If you ignore alerts, they’re not working.
For a startup just getting started:
1.
Sentry for error tracking
2.
Better Uptime for availability monitoring
3.
Platform logs (Vercel, Railway, etc.) for debugging
4.
One dashboard showing key metrics
5.
Alerts for down and error spikes
This takes a few hours to set up and catches 90% of issues before users report them.
•
Monitor availability, errors, performance, and business metrics
•
Use Sentry for errors, uptime monitor for availability
•
Alert on symptoms and user impact, avoid alert fatigue
•
Build one dashboard for at-a-glance health checks
•
Create a healthcheck endpoint that tests dependencies
•
Log requests and errors with structured data
•
Set up basics before you need them—it’s too late during an incident