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.
Activity Tiers
Section titled “Activity Tiers”| Tier | Definition | What It Means |
|---|---|---|
| Active | Messaged within 14 days | Regularly participating members |
| Quiet | 14-30 days since last message | Recently active but slowing down |
| Inactive | 30-60 days since last message | Haven’t participated in a while |
| Dormant | 60-90 days since last message | Likely disengaged |
| Gone | 90+ days since last message | Effectively left the community |
| Lurker | No messages ever recorded | Joined but never posted (or joined before message tracking) |
All thresholds are configurable (see below).
How It Works
Section titled “How It Works”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.
Running the Script
Section titled “Running the Script”Prerequisites
Section titled “Prerequisites”The script requires database access. If running locally, set up an SSH tunnel first:
ssh -L 5433:signal-bot-postgres:5432 root@100.87.20.88Basic Usage
Section titled “Basic Usage”cd srcDB_HOST=localhost DB_PORT=5433 npx ts-node src/scripts/member-activity-report.tsEnvironment Variables
Section titled “Environment Variables”| Variable | Default | Description |
|---|---|---|
ACTIVE_DAYS | 14 | Days threshold for “active” tier |
QUIET_DAYS | 30 | Days threshold for “quiet” tier |
INACTIVE_DAYS | 60 | Days threshold for “inactive” tier |
DORMANT_DAYS | 90 | Days threshold for “dormant” tier |
GROUP_ID | (all groups) | Filter to a specific Signal group ID |
OUTPUT_FORMAT | summary | Output format: summary, csv, or detailed |
Output Formats
Section titled “Output Formats”summary (default) — Tier counts with percentages and top 10 most active members:
=== Member Activity Report ===Date: 2026-02-23Total 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:
OUTPUT_FORMAT=csv npx ts-node src/scripts/member-activity-report.ts > report.csvColumns: uuid, name, tier, last_message_at, message_count
detailed — Summary plus every member listed by tier:
OUTPUT_FORMAT=detailed npx ts-node src/scripts/member-activity-report.tsFiltering by Group
Section titled “Filtering by Group”To see activity for a specific group only:
GROUP_ID="abc123==" npx ts-node src/scripts/member-activity-report.tsFind group IDs from the signal_groups table or the admin dashboard.
API Endpoint
Section titled “API Endpoint”The same data is available via the admin API:
GET /api/admin/member-activityAuthentication
Section titled “Authentication”Requires the x-api-key header with the bot’s API key:
curl -H "x-api-key: $BOT_API_KEY" https://signal.irregulars.io/api/admin/member-activityQuery Parameters
Section titled “Query Parameters”| Parameter | Default | Description |
|---|---|---|
active_days | 14 | Active tier threshold |
quiet_days | 30 | Quiet tier threshold |
inactive_days | 60 | Inactive tier threshold |
dormant_days | 90 | Dormant tier threshold |
group_id | (all) | Filter to specific group |
Example Response
Section titled “Example Response”{ "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"}Community Health Tips
Section titled “Community Health Tips”- 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