Last-engagement timestamp maintained
Why it matters
A last_engaged_at column that is never updated is worse than no column at all: it creates false confidence that engagement is being tracked while every contact's timestamp stays frozen at creation date. Stale-contact jobs keyed on last_engaged_at will then incorrectly classify all contacts as disengaged simultaneously, suppressing the entire list. The root cause is typically a webhook handler that logs events to an analytics table but does not write back to the contacts table — a common pattern in systems where the analytics pipeline was added after the contact model was built.
Severity rationale
High because a non-updating engagement timestamp produces incorrect staleness classifications across the entire list, making re-verification and engagement-scoring logic unreliable for all contacts.
Remediation
Wire ESP webhook open and click events directly to a contact last_engaged_at update — verify this write exists in the webhook handler, not just in an analytics sink:
// POST /api/webhooks/esp
export async function POST(req: Request) {
const events = await req.json()
for (const event of events) {
if (['open', 'click'].includes(event.event)) {
const email = event.email?.toLowerCase().trim()
if (email) {
await db.contact.updateMany({
where: { email },
data: {
last_engaged_at: new Date(event.timestamp * 1000),
engagement_tier: 'active'
}
})
}
}
}
return Response.json({ ok: true })
}
Validate HMAC signatures before processing events. After deploying, spot-check by triggering a test open through your ESP and confirming last_engaged_at updates on the corresponding contact row within minutes.
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 Data Quality & List Hygiene Audit. The pattern definition, severity rationale, and remediation remain openly licensed under CC-BY-4.0.
External references
- iso-25010:2011 · functional-correctness — Functional Correctness (functional suitability)
Taxons
History
- 2026-04-18·v1.0.0·Initial import from data-quality-list-hygiene·automated