A small control panel of analog gauges and indicator lights connected by cables to a lit storefront, with one needle in the red.

Most observability advice is written for teams with a platform group and a monitoring budget to match. Run an ecommerce site with a handful of people and much of it becomes a liability: every dashboard you add is something you now have to read, and every metric you export is a line on a bill. Here is how we keep monitoring genuinely useful — and very close to free — on a live marketplace: a small set of business metrics with disciplined labels, alerts that fire only when a customer is affected, and one hard rule about cost.

What observability means when you are five people, not fifty

At small scale the goal is not total coverage. It is answering four questions fast: is checkout taking money, is search returning results, did the last deploy break anything, and are we about to run out of disk or budget. Everything else is noise until it isn't. The failure mode that quietly kills small teams is alert fatigue — a channel that pings forty times a day trains everyone to ignore it, and the one page that mattered scrolls past with the rest.

It helps to separate two words people use interchangeably. Monitoring watches known things and tells you when a number crosses a line. Observability is being able to ask a new question about production without shipping code first. A small team needs a little of the first and a cheap version of the second. You do not need distributed tracing across a dozen services to run a marketplace; you need to be able to reconstruct one order's journey through the logs when a customer emails.

Metrics, logs, traces — and which you can skip

The three classic signals have very different cost and value profiles, and treating them as equally important is how monitoring bills balloon. Decide deliberately which ones earn a place.

SignalBest atWhat drives its costSmall-team verdict
MetricsTrends and alerting on known numbersNumber of time series (cardinality)Keep — but few, and with bounded labels
LogsForensics: what happened to this orderVolume and retentionKeep — thread one request id through them
TracesLatency across many servicesPer-span ingest and storageUsually skip; a request id in logs covers most of it
Session replayThe bug where everything returns 200Storage plus consent handlingKeep for UX debugging, run it deliberately

Traces are the line item most small teams over-buy. If your services already write a shared request id into their logs, you can answer nearly every "where did this slow down" question by grepping, not by paying to ingest every span. Session replay earns its own budget because it catches a class of failure metrics and logs are blind to — we cover that in session replay for ecommerce.

Business metrics with enum-bounded labels

The metrics worth emitting on a store are business events, not machine internals: orders placed, search zero-result rate, cart-to-checkout ratio, ingest-job outcome, email-send success. Emit them as plain counters and gauges from the code path that already knows the truth.

The rule that keeps the bill flat is about labels. Every label attached to a metric must draw from a bounded, enumerated set of values. A label with unbounded values — a raw search string, a product id, a user id, a full URL — mints a brand-new time series for every distinct value it sees, and time-series databases both price and slow down on the number of series they hold. So coerce each label to a known enum: a fixed list of vendor identifiers, HTTP status classes, a handful of page-type buckets. Anything unexpected folds into an other bucket rather than spawning a series. A single unbounded label on one busy endpoint can turn a free-tier metric into a runaway cost overnight.

A free-tier-first stack

You can run real observability on free tiers if you stay disciplined. A pull-based metrics registry scraped into a hosted dashboard's free plan; logs shipped to a log store's free allowance with alert rules defined on patterns. Keep retention short — most incidents are diagnosed within hours, not weeks, so paying to store a month of debug logs is money spent on comfort. Prefer OR-ing many log patterns into one alert rule over creating many separate alarms, because on some platforms the alarm itself is billed. Our standing rule is simple: new monitoring goes to a free tier first, and any change that would move telemetry onto a paid surface needs a written cost estimate before it ships.

Alerts you'll actually read

An alert nobody acts on is a dashboard that interrupts you. Four rules keep the signal high:

  • Alert on symptoms, not causes. Page on "checkout error rate above threshold for five minutes", not "CPU at 90%". High CPU with a healthy checkout is not an incident; it is a graph.
  • Every alert is actionable and owned. If no one knows what to do when it fires, it is not an alert yet — write the runbook line first, or downgrade it to the digest.
  • Two tiers only. Page for customer-facing breakage — checkout down, search returning 5xx, site unreachable, disk near full. Everything else lands in a once-a-day digest that a human skims with coffee.
  • Route log patterns to rules. One rule can OR together the error signatures that matter, so a new failure shape becomes one small edit rather than a new paid alarm.

Deploy-aware alerting and the weekly review

A brief burst of 5xx that lines up exactly with a deploy restart is almost always the restart, not a regression. Annotate deploys on your graphs so whoever is triaging at 2am sees the correlation in a glance, and give restart-shaped blips a short grace window before they page. Around the automated alerts, keep a human cadence: a weekly read-only sweep of production — firing alerts, uptime, error rates, headroom, ingest health, order flow, recent deploys, cost anomalies — recorded in the same findings log every week, so nothing discovered ever silently disappears. That review is the junior-SRE job nobody staffs at a small company; because it is a checklist, an agent can run it reliably, which is a pattern we lean on across our AI-run operations.

From production

A single default-on telemetry toggle once began exporting hundreds of metric streams that nobody was reading — routine framework internals, per-repository timers, connection-pool gauges — at a three-figure monthly cost, and it was only caught days later in a cost review. The lesson stuck: observability is a product with a budget, not a virtue with a blank cheque. Every new metric gets enum-bounded labels, new monitoring starts on a free tier, and any change touching a paid telemetry surface needs a cost estimate in writing before it goes out.

The same discipline applies to the AI features on a modern store, where an unwatched token counter is the equivalent runaway — a topic we go deep on in LLM cost optimization. And the numbers your monitoring should surface first are the commercial ones, which is where an owned analytics stack and business dashboards meet observability.

Key takeaways

  • Monitor four things first — does checkout take money, does search return results, did the last deploy break anything, are you running out of disk or budget.
  • Give every metric label a bounded, enumerated set of values — unbounded labels explode cardinality and turn a free tier into a runaway bill.
  • Alert on customer-facing symptoms, not machine causes — and split alerts into "page now" versus a once-a-day digest.
  • Start every new signal on a free tier and require a written cost estimate before any telemetry moves to a paid surface.
  • Annotate deploys and grace restart-shaped blips so a deploy restart never gets mistaken for an outage at 2am.
  • Run a weekly read-only prod sweep into one standing findings log so drift is caught before it reaches a traffic graph.

Frequently asked questions

What should a small ecommerce team monitor first?
Start with the four things a customer feels: is checkout completing, is search returning results, is the site reachable, and are you about to run out of disk or budget. Alert on those as symptoms. Add machine metrics like CPU and memory only as context you look at after an alert fires, not as pages in their own right.
What is cardinality in metrics and why does it cost money?
Cardinality is the number of distinct time series a metric produces, which is the product of all its label values. A label carrying unbounded values — a raw query, a product id, a URL — creates a new series for every value, and time-series databases price and slow down on series count. Keep labels enum-bounded so cardinality stays predictable.
Do I need distributed tracing for an ecommerce site?
Usually not, at least not first. If your services write a shared request id into their logs, you can reconstruct most request journeys by searching logs, which is far cheaper than ingesting every span. Add tracing only when you have a genuine cross-service latency mystery that logs cannot answer.
How do I stop getting too many alerts?
Make every alert actionable and owned, and split them into two tiers: page only for customer-facing breakage, and send everything else to a once-a-day digest. If an alert fires and no one knows what to do, it is a dashboard, not an alert — downgrade it until it has a runbook line.

Inherit the ops layer, not just the storefront.

The marketplace we run for you comes with business metrics, free-tier-first monitoring and a weekly prod sweep already wired in.

Request early access See the live marketplace →