Build2026

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.

OpenAI Build Week registration and check-in front page built on the Event With Me serverless platform
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

Event With Me AWS architecture diagram with Amplify, API Gateway, Cognito, 15 Lambda functions, DynamoDB, SQS and SNS
End to end serverless architecture on AWS. Amplify SPA, API Gateway with Cognito authorization, 15 Lambda functions, DynamoDB, SQS ticket processing, and SNS notifications
Event With Me full serverless architecture design showing CloudFront, Amplify SSR, API Gateway, Lambda, DynamoDB, SQS, CloudWatch and SAM CI/CD
Full architecture design from the project docs, covering CloudFront CDN, the TanStack Start SSR app on Amplify, API Gateway, Lambda, DynamoDB, SQS, CloudWatch, and the SAM based CI/CD pipeline
Event With Me registration flow diagram with Amplify, the SQS registration queue and ticket processing
Registration flow with the SQS ticket processing queue

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. 1

    Attendee submits

    The portal validates the form with React Hook Form and Zod, then posts to the public register endpoint.

  2. 2

    Register Lambda runs

    It validates the payload, confirms the event is open, and queries the email index to reject duplicates.

  3. 3

    Record stored

    The registration is written to DynamoDB with a registration number, and a confirmation publishes to SNS.

  4. 4

    Async ticket processing

    The ticketProcessing function consumes the queue to finalize ticket numbers and guard against overbooking.

  5. 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

DynamoDB table screenshots for the Event With Me events and registrations tables
The events and registration tables in the AWS console

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

AWSLambdaAPI GatewayDynamoDBCognitoAmplifySQSSNSCloudWatchReactTanStack StartGitHub ActionsJestServerlessIAMCI/CD

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.