Event With Me: Serverless Event Registration and Ticketing
A serverless event platform for Azubi Africa that replaces manual forms with self registration, role based check in, badge printing, and audit logs across 15 Lambda functions and 3 Cognito roles at $0 monthly cost.

- Lambda functions
- 15
- Lambda functions
- Cognito roles
- 3
- Cognito roles
- Monthly cost
- $0
- Monthly cost
Overview
Event With Me is a fully serverless event registration and ticketing system I built during my Azubi Africa cloud internship. It replaces a manual Microsoft Forms and Excel workflow with a public registration portal and a role based coordinator console, and it powers real Azubi Africa events at events.azubisuccess.space.
The backend is built from 15 single purpose Node.js Lambda functions behind Amazon API Gateway, secured with Amazon Cognito JWT tokens, and backed by three on demand DynamoDB tables. The React frontend ships from AWS Amplify, async ticket processing runs through SQS, confirmation notifications publish to SNS, and a GitHub Actions pipeline runs Jest tests before deploying every function. The whole system operates on the AWS free tier at $0 monthly cost.
Key Features
Public Self Registration
Attendees register without an account while a global index on email blocks duplicate submissions
Role Based Console
Admin, RegistrationOfficer, and CheckinOfficer groups control exactly what each staff member can do
One Click Check In
Check in records the timestamp and the operator who scanned the attendee
QR Badge Printing
Prints 100mm by 60mm badges with a QR code, a print counter, and a full audit trail
Walk In Registration
Staff add on site attendees in real time without going through the public portal
Reports and Exports
Analytics dashboards with CSV and Excel export plus a complete audit log of every action
Architecture


AWS Amplify Hosting
Serves the React and TanStack Start SPA and auto deploys from the GitHub main branch with a bun build. Environment variables for the API URL and Cognito pool are injected at build time.
Amazon API Gateway
A REST API that maps every endpoint 1:1 to a single Lambda function. Public routes for browsing events and registering, with all other routes protected by the Cognito Authorizer.
Amazon Cognito
The identity layer for staff only. Sign-in returns id, access, and refresh tokens; the id token is sent as a Bearer header and the authorizer validates its signature before any Lambda runs.
AWS Lambda (Node 20)
15 single purpose ESM functions split across events and registrations, sharing small modules for DynamoDB access, HTTP responses, ID generation, and identity checks.
Amazon DynamoDB
Three tables using on demand billing with no capacity planning. Global secondary indexes on email and on event creation time power duplicate checks and newest first listings.
SQS and SNS
A queue feeds the async ticketProcessing function so registrations stay fast under load, while the SNS topic carries confirmation messages for email delivery.
Authentication and Roles
Attendees never need an account. Only coordinator staff sign in through the Cognito user pool, and their group membership decides what the console exposes.
Admin
Full access to events, staff, reports, settings, and the audit log
RegistrationOfficer
Walk in registration and participant management
CheckinOfficer
Check in and limited walk in duties
- •The frontend reads cognito:groups from the id token and shows or hides navigation by role
- •The API Gateway Cognito Authorizer rejects invalid or expired tokens before any Lambda executes
- •Inside each Lambda, the shared auth module checks the claims again for admin only operations
- •Real enforcement always lives server side even though the UI filters by role as a convenience
Data Flow
- 1
Attendee submits
The portal validates the form with React Hook Form and Zod, then posts to the public register endpoint.
- 2
Register Lambda runs
It validates the payload, confirms the event is open, and queries the email index to reject duplicates.
- 3
Record stored
The registration is written to DynamoDB with a registration number, and a confirmation publishes to SNS.
- 4
Async ticket processing
The ticketProcessing function consumes the queue to finalize ticket numbers and guard against overbooking.
- 5
Coordinator acts
Staff check attendees in, print QR badges, run walk in registration, and export reports, with every action written to the audit log.
Lambda Functions Detail
createEvent POST /events
Creates an event with branding fields such as colors, logo, QR toggle, and badge font size.
listEvents GET /events
Public endpoint returning all open events for the registration portal.
getEvent GET /events/{eventId}
Returns a single event for detail pages and the console.
updateEvent PUT /events/{eventId}
Edits event settings such as registration window and display options.
deleteEvent DELETE /events/{eventId}
Removes an event and its related data.
registerParticipant POST /events/{eventId}/register
Public self registration with duplicate email check via the email index.
listRegistrations GET /events/{eventId}/registrations
Lists registrations for an event newest first using the created-at index.
getRegistrations GET /registrations/{email}
Looks up registrations by attendee email for the public search flow.
updateRegistration PUT /registrations/{id}
Updates attendee details from the console.
deleteRegistration DELETE /registrations/{id}
Cancels a registration when a request is received.
checkIn POST /registrations/{id}/checkin
Marks an attendee checked in with timestamp and operator attribution.
walkInRegistration POST /events/{eventId}/walk-in
Adds an on site attendee without going through the public portal.
printBadge POST /registrations/{id}/print
Tracks badge print count and timestamp for audit.
getAuditLog GET /audit
Returns the audit trail of every write action with actor and metadata.
ticketProcessing SQS consumer
Consumes the queue to finalize ticket numbers and prevent duplicate reservations.
Database Design
tbl_events
PK eventId
name, date, venue, description, registrationOpen, colors, logoUrl, showQr, badgeFontSize
tbl_registration
PK registrationId
two GSIs on email and on event + createdAt, plus fields for number, type, check in, and badge state
tbl_auditLogs
PK id
action, entity, entityId, actorId, actorLabel, meta JSON, createdAt

CI/CD Pipeline
Frontend via Amplify
Every push to main triggers a build on Amplify, which runs the bun build and serves the static bundle with the environment variables injected.
Backend via GitHub Actions
A single workflow checks out the code, installs dependencies, and runs the Jest test suite in backend/__tests__.
Deploy only on green
If every test passes, the workflow zips each function with the shared modules and calls lambda update-function-code for all 15 functions.
Output summary
The deployment result is written to the GitHub Actions summary so the team sees the outcome at a glance.
Security and Operations
- •Cognito Authorizer blocks invalid and expired tokens at the API edge before any business logic runs
- •Each Lambda has a scoped IAM role: read only functions get a read policy, writers get a CRUD policy, and only registerParticipant can publish to SNS
- •CORS is configured at the API Gateway level to control which origins may call the API
- •CloudWatch collects logs and metrics from every function with alarms on error rate and throttling
- •An AWS Budget of $10/month raises an alert at 80% spend so the system never surprises the account owner
- •Every write action is recorded to the audit log with the actor, entity, and metadata for full traceability
Skills and Technologies
Key Takeaways
- •One function per endpoint keeps the backend modular, testable, and independently deployable
- •Cognito groups give a clean role based authorization model that works across both the frontend and the backend
- •On demand DynamoDB billing means a production system can cost nothing when idle
- •An async queue decouples ticket processing from the registration request so users get instant feedback
- •A pipeline that tests before deploying catches regressions before they reach a live event
- •Replacing a manual Forms and Excel process with serverless removed hours of repetitive staff work
Like what you're seeing?
I'm always up for tackling challenging infrastructure, automation, and AI/DevOps problems. Let's build something together.