Automation for a 25-member business networking group — Reduced weekly coordination time from 60+ minutes to under 5.
Features • Architecture • Tech Stack
A long-running Tuesday lunch group in Longview, WA had a coordination problem. Every week, the secretary:
- Manually tracked host rotation on paper
- Hand-typed 20+ email addresses into a group announcement
- Printed the email and circled names to take attendance
- Fielded calls from members asking "when's my turn to host?"
- Chased down upcoming hosts to confirm restaurants
Total time: 60+ minutes per week, every week, for years.
I built a web app that automates the entire workflow. The secretary's job is now two things: make the reservation, and tap names on a screen to take attendance.
Weekly automation:
- Thursday: Email upcoming hosts asking for restaurant confirmation
- Friday: Alert secretary to make the reservation
- Monday: Send announcement to all members with location, map link, and host info
- Tuesday: After lunch, request ratings from attendees
Result: 90% reduction in coordination time.
- One-tap attendance: Check off members as they arrive
- Drag-and-drop host ordering: Adjust the queue when schedules conflict
- Cancellation handling: Cancel a week and all future assignments shift automatically
- 3-host status view: See confirmation status for this week, next week, and two weeks out
- Personal dashboard: See when you're hosting, who's up next, upcoming lunch details
- "Batting order" lineup: Full hosting queue with estimated dates
- One-click ratings: Rate restaurants directly from the post-lunch email
- Attendance history: Track your own participation
- Location database: Saved restaurants with Google Maps links, phone numbers, and group ratings
- Automated emails: Professional announcements without manual effort
- PWA support: Install on phone home screens for quick access
The group is mostly men over 60 who like sports. "Lineup" was a natural metaphor for hosting rotation, so I leaned into it: "At Bat" (hosting this week), "On Deck" (next week), "In the Hole" (two weeks out). It fits the culture.
┌─────────────────────────────────────────────────────────────────┐
│ Flask App │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ Routes │ │ Services │ │ Models │ │
│ │ • Admin │ │ • Email │ │ • Member │ │
│ │ • Secretary │ │ • Places │ │ • Location │ │
│ │ • Member │ │ • Scheduler │ │ • Lunch │ │
│ │ • API │ │ │ │ • Attendance / Rating │ │
│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ │ │
│ │ │
┌────▼────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Brevo │ │Google Places│ │ PostgreSQL │
│ (Email) │ │ API │ │ (Railway) │
└─────────┘ └─────────────┘ └─────────────┘
| Decision | Rationale |
|---|---|
| Computed host queue | Hosting order is calculated from last_hosted_date, not stored as a fixed list. No stale data, no manual reordering bugs. |
| Stack-based cancellations | When a lunch is cancelled, all future host/location assignments shift forward automatically. Uncancel reverses it. |
| Magic link auth | Target users are 60+ and not tech-savvy. No passwords to forget — just click the link in your email. |
| Role separation | Secretary, Admin, and Member portals have different views and permissions. Secretary can't accidentally delete members. |
| Layer | Technology |
|---|---|
| Backend | Python, Flask, SQLAlchemy |
| Database | PostgreSQL (Railway) |
| Frontend | Jinja2 templates, Tailwind CSS |
| Brevo (transactional API) | |
| Maps | Google Places API |
| Hosting | Railway (auto-deploy from GitHub) |
Member ◄──┬── hosts ──► Lunch ◄── at ──► Location
│
└── attends ──► Attendance ◄── for ──► Lunch
│
Rating ◄──┘
Lunch status values:
planned— Upcoming, not yet occurredcancelled— Skipped (excluded from all date calculations)completed— Occurred, attendance recorded
| Day | Time | |
|---|---|---|
| Thursday | 9am | Host reminders (3-tier: At Bat, On Deck, In the Hole) |
| Friday | 9am | Secretary notification to make reservation |
| Monday | 9am | Group announcement with location and map |
| Tuesday | 6pm | Rating requests to attendees |
This project demonstrates:
- Real-world problem solving: Built for actual users with actual pain points
- Workflow automation: Replaced a 60-minute manual process with scheduled jobs
- User-appropriate design: Magic links and baseball metaphors for a non-technical audience
- Third-party integrations: Brevo for email, Google Places for location data
- Role-based access control: Three distinct portals with appropriate permissions
MIT
Built for my dad's networking group. Built with Flask, Railway, Brevo, Google Places API, and Claude Code.