One set of numbers for the whole funnel, from paid lead to cash collected, and a layer that watches the systems themselves. Because a scheduled job that reports "succeeded" can still be doing nothing.
The CRM, the marketing platform and a spreadsheet each held a version of the funnel. Lead-to-won was computed differently in each, cohorts mixed partial months with complete ones, and cost per lead stood in for cost per customer. Leadership decisions were being made on numbers nobody could reconcile.
Underneath, dozens of automations ran on schedules and nobody knew when one stopped. The scheduler said every run succeeded. It meant the request was accepted, not that the work was done.
-- inbound texts with no routing decision in the last 24h select c.thread_id, c.timestamp from conversations c where c.direction = 'Inbound' and c.timestamp > now() - interval '24 hours' and not exists ( select 1 from workflow_log w where w.phone = c.thread_id and w.timestamp >= c.timestamp );
Every detector exists because something broke first. That is the honest order most teams build in, and it cost real leads. The second thing I would change is ownership: a finding without a named owner and an escalation path is a log line. The advisory outage proved that an alarm is not the same as a response. Every detector now carries an owner, and I would make that a condition of shipping one.