From 53e38fed4882fa9b0558102a46a44beadfa03a7c Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sun, 28 Dec 2025 07:37:11 -0400 Subject: [PATCH 1/3] Add member engagement tracking with automated signals and interest levels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add user_logins table for tracking dashboard logins - Add interest_level fields to organizations (low/medium/high/very_high) - Record logins during OAuth callback for engagement metrics - Add OrganizationDatabase methods for engagement signal queries: - recordUserLogin, getEngagementSignals, setInterestLevel - Enhance admin org detail page with Engagement Signals card: - Interest level with attribution (who set it, when) - Member profile status, login count, WG count, email clicks - Add API endpoints: - PUT /api/admin/organizations/:orgId/interest-level - GET /api/admin/organizations/:orgId/engagement-signals - Update engagement level calculation to incorporate new signals 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- server/public/admin-org-detail.html | 229 ++++++++++++++++++ .../db/migrations/039_member_engagement.sql | 39 +++ server/src/db/organization-db.ts | 169 +++++++++++++ server/src/http.ts | 13 + server/src/routes/admin.ts | 120 ++++++++- 5 files changed, 564 insertions(+), 6 deletions(-) create mode 100644 server/src/db/migrations/039_member_engagement.sql diff --git a/server/public/admin-org-detail.html b/server/public/admin-org-detail.html index 2066eecca..ba9369509 100644 --- a/server/public/admin-org-detail.html +++ b/server/public/admin-org-detail.html @@ -71,6 +71,41 @@ margin-top: var(--space-1); } + /* Engagement signals */ + .signal-item { + display: flex; + justify-content: space-between; + padding: var(--space-2) 0; + border-bottom: var(--border-1) solid var(--color-gray-100); + font-size: var(--text-sm); + } + .signal-item:last-child { + border-bottom: none; + } + .signal-label { + color: var(--color-text-secondary); + } + .signal-value { + font-weight: var(--font-medium); + } + .signal-value.positive { + color: var(--color-success-600); + } + .signal-value.negative { + color: var(--color-text-muted); + } + .interest-badge { + display: inline-block; + padding: var(--space-1) var(--space-2); + border-radius: var(--radius-sm); + font-size: var(--text-xs); + font-weight: var(--font-semibold); + } + .interest-low { background: var(--color-gray-200); color: var(--color-text-secondary); } + .interest-medium { background: var(--color-warning-100); color: var(--color-warning-700); } + .interest-high { background: var(--color-success-100); color: var(--color-success-700); } + .interest-very_high { background: var(--color-success-200); color: var(--color-success-800); } + /* Grid layout */ .grid-2 { display: grid; @@ -498,6 +533,40 @@

+ +
+
+

Engagement Signals

+ +
+
+
+ Interest Level + - +
+
+ Member Profile + - +
+
+ Dashboard Logins (30d) + - +
+
+ Last Login + - +
+
+ Working Groups + - +
+
+ Email Clicks (30d) + - +
+
+
+

Pending Next Steps

@@ -720,6 +789,38 @@

Next Ste

+ + +