Score decay for inactive contacts
Why it matters
Without score decay, a contact who was highly engaged 18 months ago — opened five emails, clicked twice, visited the pricing page — retains a high score and continues surfacing as a hot lead. Sales receives contacts who have not interacted in over a year, the pipeline confidence drops, and the scoring model loses calibration. iso-25010:2011 functional-suitability.functional-correctness categorizes this as an accuracy defect: the score no longer reflects the contact's current engagement probability. Score decay is also an anti-sycophancy mechanism in the scoring model itself — it resists inflating lead quality based on historical activity that no longer predicts current intent.
Severity rationale
Low because missing decay accumulates stale high scores over months — a gradual calibration failure that degrades sales pipeline quality, not an immediate runtime error.
Remediation
Add a last_activity_at timestamp to contact records and run a periodic decay job (daily via Vercel cron or a scheduled BullMQ repeatable job).
// Runs daily via cron — e.g. src/jobs/score-decay.ts
async function applyScoreDecay() {
const DECAY_PERCENT = 10 // Reduce score by 10% per inactivity period
const INACTIVITY_DAYS = 30 // Apply after 30 days of no activity
const cutoff = new Date(Date.now() - INACTIVITY_DAYS * 24 * 60 * 60 * 1000)
await db.contact.updateMany({
where: {
lastActivityAt: { lt: cutoff },
leadScore: { gt: 0 }
},
data: {
leadScore: { multiply: (100 - DECAY_PERCENT) / 100 }
}
})
}
Both DECAY_PERCENT and INACTIVITY_DAYS should be named constants (not magic numbers) and referenced from your central scoring config. A last_activity_at field with no decay job referencing it does not satisfy this check.
DetectionPro
The detection method for this pattern is part of AuditBuffet Pro.
The full method (what to look for, pass and fail conditions, and how results get reported) ships inside the Campaign Orchestration & Sequencing Audit. The pattern definition, severity rationale, and remediation remain openly licensed under CC-BY-4.0.
External references
- iso-25010:2011 · functional-suitability.functional-correctness
Taxons
History
- 2026-04-18·v1.0.0·Initial import from campaign-orchestration-sequencing·automated