1. Cache key missing the tenant
Symptom
Users occasionally see another organisation's data. Never reproducible locally.
The pattern
const key = `dashboard:summary`;
const cached = await redis.get(key);Why it bites
One key serves every tenant, so whichever request populates it first shares its data with everyone until expiry. Single-tenant development and staging never surface it — it needs concurrent multi-tenant traffic to appear.
The fix
// Every variable that changes the value belongs in the key.
const key = `dashboard:summary:v2:${orgId}:${period}`;