A full-stack web application for managing campus/club events with role-based access, event registration, and automated email notifications.
Demo 1
Demo 2
Features:
- User authentication (Admin & Participant roles)
- Event creation, filtering, and search with debounce
- Event registration and participant management
- Paid and free event support with Razorpay payment verification
- Automated email notifications (welcome, registration confirmation, event reminders)
- Modern glassmorphic UI with particle animations
- Responsive design
- Printable participant lists and event reports
- Framework: Express.js
- Database: MongoDB + Mongoose
- Authentication: JWT (stored in HTTP-only cookies)
- Password Hash: bcrypt
- Queue System: BullMQ + ioredis
- Email: Nodemailer (Gmail SMTP)
- Payments: Razorpay (order creation + signature verification)
- CORS: Configured via
FRONTEND_URLenvironment variable
- HTML/CSS/JavaScript (vanilla, no build tool)
- Animations: Canvas-based particle system
- API Communication: Fetch API
- UI Framework: Custom CSS with glassmorphic design
Event Management and Reporting System/
├── backend/
│ ├── package.json
│ ├── src/
│ │ ├── index.js # Server entry point
│ │ ├── app.js # Express app setup
│ │ ├── config/
│ │ │ ├── database.js # MongoDB connection
│ │ │ ├── env.js # Environment configuration
│ │ │ ├── mail.js # Nodemailer transporter
│ │ │ └── redis.js # Redis connection
│ │ ├── controllers/
│ │ │ ├── login.controller.js # Auth logic
│ │ │ └── event.controller.js # Event CRUD logic
│ │ ├── middleware/
│ │ │ └── authMiddleware.js # JWT verification
│ │ ├── models/
│ │ │ ├── user.model.js # UserRegister schema
│ │ │ └── event.model.js # Event schema
│ │ ├── routes/
│ │ │ ├── login.route.js # Auth endpoints
│ │ │ └── event.route.js # Event endpoints
│ │ ├── services/
│ │ │ └── email.service.js # Email templates & queuing
│ │ ├── schedular/
│ │ │ └── remainderSchedular.js # Event reminder logic
│ │ └── util/
│ │ ├── email.queue.js # BullMQ queue setup
│ │ ├── email.worker.js # Queue worker
│ │ └── jwt.js # JWT sign/verify
│ └── .gitignore
├── frontend/
│ ├── index.html # Login/Register landing page
│ ├── assets/images/ # Static images
│ ├── css/
│ │ ├── index.css # Landing page styles
│ │ ├── admin.css # Admin dashboard styles
│ │ ├── user.css # User page + search styles
│ │ ├── participants.css # Participants page styles
│ │ └── download.css # Download report styles
│ ├── js/
│ │ ├── config.js # Backend URL configuration
│ │ ├── index.js # Auth logic (login/register)
│ │ ├── admin.js # Admin dashboard
│ │ ├── user.js # Event browsing + debounced search
│ │ ├── participants.js # Participant list
│ │ └── download.js # Report download
│ └── pages/
│ ├── admin.html # Admin dashboard page
│ ├── user.html # User events page
│ ├── participants.html # Participants management page
│ └── download.html # Report download page
└── README.md
- Node.js 16+
- MongoDB running
- Redis running on
127.0.0.1:6379
cd backend
npm installCreate .env at the repository root with:
MONGODB_URI=mongodb://localhost:27017/eventflow
SECRETE=your_jwt_secret_key
EMAIL_USER=your_gmail@gmail.com
EMAIL_PASS=your_gmail_app_password
razorpay_key_id=your_razorpay_key_id
razorpay_key_secret=your_razorpay_key_secret
FRONTEND_URL=http://localhost:5500
PORT=4000Notes:
SECRETEis the JWT signing secret (typo preserved from original code)EMAIL_PASSis a Gmail App Password (not your account password)razorpay_key_idandrazorpay_key_secretare required for paid event registrationFRONTEND_URLis used for CORS configurationPORTdefaults to 4000 if not specified- Redis must be running locally on port 6379
npm run dev # With auto-reload (nodemon)
# OR
npm start # Standard startServer runs on http://localhost:4000 (or PORT from .env)
The frontend is a static site served from the frontend/ folder.
- Install the "Live Server" extension in VS Code
- Right-click
frontend/index.html→ "Open with Live Server" - Opens at
http://localhost:5500(default port)
cd frontend
python -m http.server 5500npm install --global http-server
cd frontend
http-server -p 5500Base URL: http://localhost:4000 (or configured PORT)
Production Base URL: https://event-management-and-reporting-system.onrender.com
| Method | Endpoint | Protected | Description |
|---|---|---|---|
| POST | /api/auth/register |
No | Register new user |
| POST | /api/auth/login |
No | Login user |
| POST | /api/auth/logout |
Yes | Logout (clears token) |
Register/Login Body:
{
"registerRole": "admin|participant",
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"password": "password123"
}| Method | Endpoint | Protected | Description |
|---|---|---|---|
| POST | /api/events/create |
Yes | Create event (admin) |
| DELETE | /api/events/delete |
Yes | Delete event |
| GET | /api/events/fetch |
Yes | Get user's events |
| POST | /api/events/menu |
No | List events with filters or fetch event by ID |
| GET | /api/events/menu/details |
No | Get event stats (count/clubs/venues) |
| POST | /api/events/search |
No | Search event name suggestions |
| POST | /api/events/register |
Yes | Register for free event |
| POST | /api/events/payment/order |
Yes | Create Razorpay order for paid event |
| POST | /api/events/payment/verify |
Yes | Verify payment signature and complete registration |
Create Event Body:
{
"eventName": "Code Mania",
"clubName": "Tech Club",
"startDate": "2026-03-01T10:00:00Z",
"endDate": "2026-03-01T14:00:00Z",
"coordinator": [
{ "name": "Alice", "contactNumber": "9876543210" }
],
"venue": "Auditorium",
"price": 299
}Event Menu Filter Body:
{
"club": "All Clubs",
"venue": "All Venues",
"search": "code",
"sort": "Newest-first",
"pageNo": 1,
"limit": 6
}Event Search (Suggestions):
{
"search": "code"
}{
registerRole: String, // "admin" or "participant"
firstName: String, // Unique
lastName: String,
email: String, // Unique
password: String // Bcrypt hashed
}{
eventName: String,
clubName: String,
startDate: Date,
endDate: Date, // Must be >= startDate
coordinator: [{
name: String,
contactNumber: String
}],
adminUser: String, // firstName of creator
venue: String,
price: Number, // >= 0, default 0
participants: [{
name: String,
email: String,
payment: String // "unpaid" / "paid"
}]
}- Register with role selection (admin/participant)
- Login with email and password
- JWT stored in HTTP-only cookies
- Token expires after 24 hours
- Admin: Create, view, and delete events
- Participant: Browse, search, filter, and register for events
- Event supports both free and paid registration via event price
- Pagination with "Previous" and "Next" buttons
- Real-time event statistics (count, clubs, venues)
- Debounced search input (300ms delay)
- Dropdown suggestions below the search field
- Registration Email: Sent when user signs up
- Event Registration Email: Sent when user registers for an event
- Reminder Email: Hourly job checks for events starting within 24 hours
- Paid events use Razorpay order creation from backend
- Payment is verified using HMAC signature (
razorpay_signature) - User is added to participants only after successful verification
- Free events continue to use direct registration without payment
- BullMQ manages
email-queueandremainderqueues - Workers process jobs asynchronously
- Participants page displays payment status per registrant
- Event report includes event price and participant counts
- Reports and participant lists are printable via browser print
- Frontend role selection is UI-only; backend doesn't enforce role-specific routes
- Participant lists and reports use browser
window.print(), not PDF generation - CORS is configured via
FRONTEND_URLenvironment variable - All frontend API URLs are configured in
frontend/js/config.js
- Frontend: Deployed on Vercel
Live Server: http://event-management-and-reporting-syst.vercel.app/
Update .env with production URLs:
FRONTEND_URL=https://event-management-and-reporting-syst.vercel.app
MONGODB_URI=your_production_mongodb_uri
SECRETE=your_jwt_secret_key
EMAIL_USER=your_email@gmail.com
EMAIL_PASS=your_app_password
razorpay_key_id=your_razorpay_key_id
razorpay_key_secret=your_razorpay_key_secret
PORT=4000mongod # or your MongoDB serviceredis-servercd backend
npm run devVS Code Live Server or:
cd frontend
python -m http.server 5500Then open: http://localhost:5500
- Ensure backend runs on configured PORT (default 4000)
- Check
FRONTEND_URLin backend.envmatches frontend origin - Verify CORS
credentials: truein fetch requests - Check
BACKEND_URLinfrontend/js/config.jsmatches backend URL
- Check Gmail app password in
.env(use 16-char app password, not account password) - Enable "Less secure app access" if using regular Gmail password
- Verify Redis and BullMQ workers are running
- Check
#resultelement in browser DevTools - Verify debounce delay (300ms) in
frontend/js/user.js - Open Network tab to confirm
/api/events/searchrequest is sent
- Check MongoDB connection:
MONGODB_URIin.env - Verify
GET /api/events/menu/detailsreturns club/venue data - Check browser console for fetch errors
ISC – See repository for details.
Prashanth Sakapuram
GitHub: Prashanth-DevO/Event-Management-and-Reporting-System


