Luma Event Stats
Pull registration, waitlist, attendance, and engagement data for all events on the Postman Dev Events Luma calendar. Useful for measuring event program health, spotting trends, and reporting on community growth.
How the data is fetched
The Luma Public API v1 does not include guest counts directly on event objects. Stats are derived by paging through dedicated endpoints:
- Registered — guests with
approval_status == "approved"(fromevent/get-guests) - Waitlisted — guests with
approval_status == "waitlisted"or"pending"(fromevent/get-guests) - Attended — guests where
checked_in_atis not null (fromevent/get-guests) - Score —
(attended ÷ registered) × 5.0, shown asx.x/5.0Progress is printed to stderr as each event is processed.
Configuration
This skill requires a Luma API key with read access to the calendar.
Setup
Get your Luma API key:
- Log in to lu.ma as a calendar admin
- Go to Settings → Integrations → API
- Create a new API key with read permissions
Set the environment variable in
.claude/settings.json:{ "env": { "LUMA_API_KEY": "your-luma-api-key" } }
Process
Step 1: Verify API key
Check that LUMA_API_KEY is set. If it is not present, stop and tell the user to set the environment variable as described above.
echo $LUMA_API_KEY
Step 2: Write and run the data-fetch script
Read references/luma-stats.py, write it to /tmp/luma-stats.py, then execute it.
python3 /tmp/luma-stats.py [filter-arg] # e.g. "Apr-26", "2026", or omit for all time
Capture the JSON from stdout. Progress messages go to stderr and can be ignored.
Step 3: Render the report
From the JSON output, produce a clean markdown report and display it in the chat immediately.
## Luma Event Stats — Postman Developer Events
**Filter:** {filter} | **Events:** {N}
| Date | Event | Registered | Waitlisted | Attended | Score |
|------|-------|-----------|-----------|---------|-------|
| 15 Apr 2026 | NYC Meetup | 142 | 23 | 98 | 3.4/5.0 |
| 03 Apr 2026 | London Meetup | 87 | 0 | 71 | 4.1/5.0 |
| **TOTAL** | **{N} events** | **{sum}** | **{sum}** | **{sum}** | **{score}/5.0** |
**Score** = (checked-in ÷ registered) × 5.0. Future events show `—` until check-in data is recorded.
- Sort events newest-first
- Append
%to score values - Show
—for score when registered = 0 - Bold the TOTAL row
Step 4: Save to file
Save the same report to luma-output/ — create the directory if it doesn't exist.
Filename pattern:
- All time →
luma-output/luma-stats-all-time.md - Year →
luma-output/luma-stats-2026.md - Month →
luma-output/luma-stats-Apr-26.md
Append a Notes section at the bottom of the file:
---
*Generated: {today's date} | Calendar: https://luma.com/postman-dev-events*
*Score = checked-in ÷ registered × 100. Future events show 0 attended until check-in data is recorded.*
*Subscriber count not available via Luma Public API v1.*
Score Metric
Score = (checked-in ÷ registered) × 5.0, displayed as x.x/5.0.
| Score | Interpretation |
|---|---|
| 4.0–5.0 | Excellent turnout |
| 3.0–3.9 | Good — typical for in-person tech meetups |
| 2.0–2.9 | Below average — consider venue, timing, or topic |
| < 2.0 | Low — flag for review |
| — | No registrations, or future event with no check-in data yet |
Error Handling
| Error | Action |
|---|---|
LUMA_API_KEY not set |
Stop. Show setup instructions above. |
| HTTP 403 Cloudflare block | The User-Agent header is required — verify it is present in HEADERS. |
| HTTP 401 Unauthorized | API key is invalid or expired. Ask user to regenerate in Luma Settings → Integrations → API. |
| Zero events returned | Check that the filter format is correct (e.g. Apr-26 not April-26). Print the parsed filter value. |
| All counts are 0 | Future events have no check-ins yet — this is expected. Past events with 0 attended may not have used Luma check-in. |