- Type
- Web platform
- Client
- Professional association (anonymized)
- Status
- Production build
Next.jsTypeScriptPostgreSQLMembership
The problem
Members, student members and employer organizations were served by separate systems: a legacy member database, a learning site, spreadsheets for renewals and a plugin-heavy website. Staff retyped data between them and chased renewals by hand.
The solution
One account and one design across the public site, member area, organization administration and the staff console, with the association owning its data and cloud accounts.
What it does
- Members: join, renew, dashboard, directory, events, courses
- Organizations: seats, invitations, billing contact, directory listing
- Staff: renewals workbench, segmented email, reports and CSV export
- Role-based access and a documented read-only API
Architecture
- TypeScript monorepo with a Next.js App Router web application
- PostgreSQL with Drizzle ORM and transactional changes
- Modules that can be switched on or off per customer
- Scheduled jobs for renewals, reminders and reports
- Single sign-on and hosted payments through external providers
- Cloudflare at the edge for DNS, CDN and WAF
Screenshots
Inside the product
Anonymized. Names, organizations and figures in the screenshots are invented sample data.
Tech stack
- TypeScript
- Node.js
- React
- Next.js
- PostgreSQL
- Drizzle ORM
- Docker
- Vitest
- Playwright
- axe-core
- GitHub Actions
- Cloudflare
Our role
Scoping, information architecture and design system, the application and database, the test suite and the deployment.
- Unit, end-to-end and accessibility tests (WCAG 2.1 A and AA scans)
- Tested at phone width, in light and dark themes
- Association-owned data with CSV export and a documented API