Skip to content

Member Activity Report

The member activity report classifies community members into tiers based on when they last sent a message. This helps admins identify engaged members, quiet members who might need outreach, and dormant accounts.

TierDefinitionWhat It Means
ActiveMessaged within 14 daysRegularly participating members
Quiet14-30 days since last messageRecently active but slowing down
Inactive30-60 days since last messageHaven’t participated in a while
Dormant60-90 days since last messageLikely disengaged
Gone90+ days since last messageEffectively left the community
LurkerNo messages ever recordedJoined but never posted (or joined before message tracking)

All thresholds are configurable (see below).

The report joins signal_members with signal_messages using source_uuid to find each member’s most recent message timestamp. The signal_members.last_seen_at field is not used because it is never updated — real activity data comes from actual messages.

The script requires database access. If running locally, set up an SSH tunnel first:

Terminal window
ssh -L 5433:signal-bot-postgres:5432 root@100.87.20.88
Terminal window
cd src
DB_HOST=localhost DB_PORT=5433 npx ts-node src/scripts/member-activity-report.ts
VariableDefaultDescription
ACTIVE_DAYS14Days threshold for “active” tier
QUIET_DAYS30Days threshold for “quiet” tier
INACTIVE_DAYS60Days threshold for “inactive” tier
DORMANT_DAYS90Days threshold for “dormant” tier
GROUP_ID(all groups)Filter to a specific Signal group ID
OUTPUT_FORMATsummaryOutput format: summary, csv, or detailed

summary (default) — Tier counts with percentages and top 10 most active members:

=== Member Activity Report ===
Date: 2026-02-23
Total Members: 2,301
Active (14d) 560 (24.3%)
Quiet (14-30d) 338 (14.7%)
Inactive (30-60d) 749 (32.6%)
Dormant (60-90d) 31 (1.3%)
Gone (90d+) 0 (0.0%)
Lurker (never) 627 (27.2%)

csv — Full member list for import into spreadsheets:

Terminal window
OUTPUT_FORMAT=csv npx ts-node src/scripts/member-activity-report.ts > report.csv

Columns: uuid, name, tier, last_message_at, message_count

detailed — Summary plus every member listed by tier:

Terminal window
OUTPUT_FORMAT=detailed npx ts-node src/scripts/member-activity-report.ts

To see activity for a specific group only:

Terminal window
GROUP_ID="abc123==" npx ts-node src/scripts/member-activity-report.ts

Find group IDs from the signal_groups table or the admin dashboard.

The same data is available via the admin API:

GET /api/admin/member-activity

Requires the x-api-key header with the bot’s API key:

Terminal window
curl -H "x-api-key: $BOT_API_KEY" https://signal.irregulars.io/api/admin/member-activity
ParameterDefaultDescription
active_days14Active tier threshold
quiet_days30Quiet tier threshold
inactive_days60Inactive tier threshold
dormant_days90Dormant tier threshold
group_id(all)Filter to specific group
{
"success": true,
"total_members": 2301,
"thresholds": {
"active_days": 14,
"quiet_days": 30,
"inactive_days": 60,
"dormant_days": 90
},
"group_id": null,
"tiers": [
{ "tier": "active", "count": 560, "percentage": 24.3 },
{ "tier": "quiet", "count": 338, "percentage": 14.7 },
{ "tier": "inactive", "count": 749, "percentage": 32.6 },
{ "tier": "dormant", "count": 31, "percentage": 1.3 },
{ "tier": "gone", "count": 0, "percentage": 0.0 },
{ "tier": "lurker", "count": 627, "percentage": 27.2 }
],
"generated_at": "2026-02-23T12:00:00.000Z"
}
  • High lurker percentage (>25%): Consider welcome messages, icebreaker events, or prompts that lower the barrier to first message
  • Rising inactive count: May indicate declining interest — survey members or refresh content
  • Quiet members: A friendly check-in or topic they’re interested in can re-engage them
  • Active members: Recognize and empower them as community ambassadors
  • Track trends: Run the report weekly/monthly and compare tier distributions over time