The all-in-one platform for event hospitality teams who demand precision at scale.
Live Site Β· User Manual Β· CSV Import Guide Β· Install as App Β· Report Bug Β· Request Feature Β· Contact
Screenshot: Operations Dashboard showing live event KPIs, activity feed, and events table
- About the Project
- Who This Is For
- Key Features
- Bulk CSV Import
- Installable App (PWA)
- Module Breakdown
- Tech Stack
- Project Structure
- Getting Started
- Environment Variables
- API Overview
- Authentication
- Security & Hardening
- Testing
- Deployment
- Screenshots
- Time & Productivity Impact
- Example Scenarios
- Roadmap
- Contributing
- Developer
- License
EventCure is a full-stack hospitality management SaaS platform (currently in public beta) built to replace the chaos of spreadsheets, WhatsApp groups, and disconnected tools that most event teams rely on.
It gives operations teams a real-time command centre β one place where guests are registered, rooms are assigned, transport is tracked, service requests are managed, schedules are maintained, and analytics are generated automatically.
The problem it solves: Event operations teams waste hours every day switching between spreadsheets for guests, chat apps for service tickets, and manual logs for transport β all while trying to coordinate dozens of staff across a live event with zero room for error. EventCure replaces all of that with a single, live, purpose-built platform.
Built for real operations. Designed for speed. Live at eventcure.in.
EventCure is mobile-friendly and installable β open it on a phone, tablet or laptop and add it to the home screen / desktop as an app (see Installable App). Floor staff can run check-in, service requests and room assignments straight from their phones.
| Role | How EventCure Helps |
|---|---|
| Event Directors | Create events, oversee all metrics, generate reports, control access settings |
| Operations Managers | Monitor live KPIs, manage check-in flow, resolve service backlogs |
| Floor Staff | Process arrivals, raise service tickets, update transport status from mobile |
| Logistics Teams | Schedule and track every vehicle, driver, and guest movement |
| Hotel & Venue Teams | Manage room inventory, track occupancy, assign guests to rooms |
| Hospitality Agencies | Run multiple client events from a single organization dashboard |
- π’ Corporate Summits & Conferences β Multi-day, multi-session, VIP-heavy events
- π Luxury Weddings β High-touch guest handling, dietary needs, seating coordination
- ποΈ Sports & Entertainment β Large-scale check-in, suite management, F&B coordination
- π₯ Healthcare Conferences β Delegate accreditation, parallel track management
- π¨ Hotel & Resort Events β Deep room inventory integration, housekeeping workflows
- ποΈ Government & Diplomatic Events β Protocol-aware VIP management, restricted access
- Email + OTP signup flow with 10-minute expiry (OTP delivered through the Gmail API)
- JWT-based session management with httpOnly cookies
- Google OAuth 2.0 (Passport.js) for one-click sign-in
- Password reset via secure OTP email flow (3-step)
- Per-event data isolation β ownership is verified on every event-scoped request; the guest, room and bulk-import handlers fail closed (a request with no authenticated user is rejected with
401, never waved through) helmetsecurity headers, global rate limiting, and request-size limits (see Security & Hardening)
- Real-time KPI cards: Total Events, Active Events, Guests Today, Pending Check-ins, Open Services
- Live Events panel with per-event check-in progress bars
- Paginated activity feed with 30s auto-refresh
- Searchable + filterable events table (Live / Upcoming / Completed)
- Overall check-in rate and event breakdown summary charts
- 90-second auto-refresh of all metrics in the background
- Create events with name, venue, dates, description, privacy settings
- After creating an event you land directly inside its workspace (no detour through the events list)
- Guided setup checklist on the Overview tab: add rooms β add guests β add team, with a progress bar and one-click links. It disappears into the live-operations summary once the event is set up
- Status auto-calculation: Live / Upcoming / Completed based on current date
- Full event workspace with 10 dedicated tabs per event
- Export complete event workbook (all data, all modules) in one click
- Event archiving (hide without deleting) and permanent deletion with name-confirmation safety gate
- Paginated guest master list with server-side search, VIP filter, and status filter (debounced)
- Add/edit guests with 10+ fields: name, email, phone, age, group, VIP flag, arrival / departure date-time, special requests
- Arrival date-time is required β it powers the Check-in desk's "Arriving Today" and LATE logic
- Bulk CSV import for large guest lists (see Bulk CSV Import)
- Real-time guest count summaries: Total, Checked-in, Remaining
- Inline edit and delete with confirmation dialogs
- Guest linking to rooms and service requests for full visibility
- Card-based room grid with occupancy progress bars
- Status indicators: Available / Partial / Full
- Room categories: Standard Single, Double, Executive Suite, Meeting Room, ADA Accessible
- One-click guest assignment modal with list of unassigned guests
- Capacity is enforced on the server β assigning a guest to a full room returns
409 Room 101 is full (2/2 guests); a re-check after saving rolls back the assignment if two staff grab the last bed at the same moment - Room edits can't shrink capacity below the number of guests already assigned, and guest create/update can't set
roomdirectly (assignment only goes through the assign endpoint) - Event-wide stat cards (Total Rooms, Total Capacity, Current Occupancy, Available) computed on the server across all rooms β they don't change when you move between pages
- Server-side search and Available / Occupied filters that search every room in the event, not just the page on screen
- "Export" downloads every room matching the current filter, not just the visible page
- Pagination for large room inventories (20 per page)
- Bulk CSV import for rooms
- Edit and delete rooms with confirmation
- Kanban-style 3-column board: Arriving Today β Checked-in β Pending Arrivals
- One-click check-in and check-out processing
- LATE badge on overdue arrivals (arrival time has passed)
- VIP visual tagging on all guest cards
- Live status bar showing running totals (Total / Checked-in / Pending)
- Toast notifications for every check-in and check-out action
- Silent background polling for real-time updates
- Log every vehicle trip: guest, driver, vehicle, pickup, dropoff, scheduled time, notes
- Status pipeline: Scheduled β In Transit β Arrived β Cancelled
- Status updated with one click from the row action menu
- Metric cards: Total Trips, Scheduled, In Transit, Completed
- Filter tabs: All Trips / Scheduled / In Transit / Arrived
- Pagination (20 per page) for large transport logs
- Export transport log to CSV
- Raise tickets for: Housekeeping, Maintenance, Food & Beverage, Valet, Other
- Priority levels: Low, Medium, High, Emergency (with red alert badge for Emergency)
- Link tickets to rooms and guest profiles
- Permission-to-enter checkbox for room access without guest presence
- Status workflow: Open β In Progress β Resolved / Cancelled
- Status changes from inline row action menu (no form reopening needed)
- Search by guest name, room, or ticket ID
- Type and status dropdown filters with one-click clear
- Export service log to CSV
- 5-workstream timeline: Main Sessions, Transport, Catering, Staffing, Media/AV
- Full 24-hour horizontal timeline with 1-hour markers
- Multi-day navigation via date tabs (auto-generated from event dates + activity dates)
- Colored activity blocks sized to exact duration on the timeline
- Click-to-open activity detail side panel
- Activity statuses: Confirmed, Pending, Active, Cancelled
- Inline "Add Block to [Workstream]" on hover for fast entry
- Edit and delete from the detail panel
- Register event staff with name, email, role, and status
- 7 predefined roles: Event Director, Event Lead, Logistics, Floor Staff, Technical Support, Guest Relations, Admin
- One-click Active β Inactive status toggle from the row action menu
- Filter by role and status; search by name or email
- Pagination (20 per page) for large teams
- Summary cards: Total, Active Now, Off Duty
- Bulk CSV import for team members
Per-Event Analytics (8 tabs):
- Overview: KPI cards + check-in by hour bars + service type breakdown + transport status + room occupancy donut
- Guests: Check-in trend, arrival distribution by hour, age breakdown, transport mode analysis, VIP rate, top groups
- Rooms: Occupancy rate donut, type breakdown, per-room utilization detail table
- Services: Volume by type, urgency distribution, resolution rate, recently resolved items
- Transport: Trip timeline by hour, status breakdown, top drivers, most popular routes
- Team: Active rate donut, role distribution with progress bars
- Schedule: Workstream breakdown, status pipeline, upcoming activities list
- Activity: Daily trend (7 days), log types breakdown, priority distribution donuts
Organization Analytics Dashboard (cross-event, 5 tabs):
- Overview: Monthly check-in trend (line chart), registration trend (bar chart), VIP analytics, service breakdown, room occupancy donut
- Guests: Registration and check-in trend charts
- Services: Organization-wide service volume, status pipeline, urgency distribution
- Operations: Room types, transport fleet, team roles, activity log analysis
- Events: Sortable table of all events with per-event KPIs, CSV export
CSV Exports (per event): Guests, Services, Transport, Full Workbook
- Real-time audit trail for all operational events across all events
- 7 log types: check-in, check-out, registration, service, transport, room-assignment, schedule
- 3 priority levels with visual indicators: Critical (pulsing red), High (orange), Normal (gray)
- Combined filters: search text, event, type, priority, date range
- Active filter chips with one-click removal
- Pagination (20 per page) with total count display
- 30-second auto-refresh in the background
- Export filtered log to CSV
Add guests, rooms or team members in bulk instead of filling forms one by one. See the dedicated Bulk CSV Import section.
Install EventCure on Android, iOS or desktop and launch it like a native app β standalone window, home-screen icon, shortcuts, and an in-app prompt when a new version is ready. See Installable App (PWA).
- Organization settings: Profile, Organization info, Appearance/theme, Security (password change), Notifications
- Event settings: Core info + URL slug + timezone, Access permissions (public registration, approval, self check-in, waitlist, max capacity), Notification preferences per event, Danger zone (archive / delete)
- Dark mode: Light / Dark / System themes, synced to account
Available on the Guests, Rooms and Team tabs via the Import CSV button next to the regular Add button.
Flow: download the sample template β fill it in (Excel / Google Sheets, saved as .csv) β upload β preview the first rows β import. Every row is validated independently, so a few bad rows never block the rest; the result screen lists exactly which row failed and why.
| Module | Required columns | Optional columns |
|---|---|---|
| Guests | fullName, arrivalDatetime |
email, phoneNumber, age, groupName, vipStatus, departureDatetime, specialRequests |
| Rooms | number |
capacity, type (standard, double, suite, meeting, accessible), notes |
| Team | name, email |
role |
- Date format:
YYYY-MM-DD HH:mm(24-hour), e.g.2026-10-06 14:00; a bareYYYY-MM-DDis treated as midnight.departureDatetimemust be afterarrivalDatetime. - Limits: up to 1000 rows per import; team emails must be unique per event.
- Templates: ready-made files live in
frontend/public/templates/and are linked from the in-app CSV Import Guide page and the site footer. - API:
POST /api/guests/bulk-import,POST /api/rooms/bulk-import,POST /api/team/bulk-importβ body{ "event": "<eventId>", "rows": [ ... ] }, response{ success, createdCount, failedCount, failed: [{ row, reason }] }.
EventCure is a Progressive Web App: the same website, but installable and app-like on every platform β no app-store needed.
| Platform | How |
|---|---|
| Android (Chrome / Edge) | Open eventcure.in β tap the in-app Install banner (or browser menu β Install app) |
| Desktop (Chrome / Edge) | Click the Install banner or the install icon in the address bar |
| iPhone / iPad (Safari) | Share β Add to Home Screen (iOS has no install event, so the app shows a short hint instead) |
- Standalone window (no browser UI), home-screen / desktop icon, themed status bar (
#032f1e) - Opens straight into
/dashboard; long-press the icon for Dashboard and Events shortcuts - Install banner can be dismissed (it stays hidden for 7 days) and is never shown inside the installed app
- "New version available" prompt β updates are prompt-based (
registerType: 'prompt') so a live check-in session is never reloaded under staff's feet; the app also checks for updates every hour
- Cached: the app shell only β JS, CSS, HTML, icons β plus Google Fonts, so repeat visits load fast
- Never cached:
/api/*, Google OAuth and auth callbacks. All data always comes live from the server, so check-in lists, rooms and guest counts are never stale - Large marketing images (e.g.
landing-page.png) are deliberately excluded from the precache
| File | Purpose |
|---|---|
frontend/vite.config.js |
vite-plugin-pwa config: manifest, Workbox rules, cache exclusions |
frontend/src/components/PWAManager.jsx |
Install banner (Android/desktop), iOS hint, update prompt β mounted once in App.jsx |
frontend/public/pwa-192x192.png, pwa-512x512.png, pwa-maskable-512x512.png, apple-touch-icon.png |
App icons (incl. a maskable icon for Android) |
The service worker is disabled in npm run dev. To test install and offline behaviour, build and preview:
cd frontend
npm run build
npm run preview # serves the production build with the service workerThen open DevTools β Application (manifest, service worker) and run a Lighthouse audit. Installability requires HTTPS, which Vercel provides in production (localhost also counts as secure).
EventCure
βββ Auth
β βββ Email signup with OTP verification
β βββ Email/password login
β βββ Google OAuth 2.0 (Passport.js)
β βββ Password reset (OTP flow, 3 steps)
β
βββ Dashboard
β βββ KPI metric cards (auto-refresh 90s)
β βββ Live Events panel
β βββ Recent Activity feed (paginated)
β βββ Events table (filterable + searchable)
β
βββ Events Directory
β βββ Event listing with status badges
β βββ Search and status tabs
β βββ Create new event form
β
βββ Event Workspace (per event, 10 tabs)
β βββ Overview (setup checklist + quick stats + activity table)
β βββ Guests (master list + CRUD + CSV import)
β βββ Rooms (inventory + assignment + CSV import)
β βββ Check-in (Kanban operations desk)
β βββ Transport (log + status management)
β βββ Service (ticket system)
β βββ Schedule (Gantt timeline)
β βββ Reports (8-tab analytics + event summary)
β βββ Team (staff + roles + CSV import)
β βββ Settings (event admin config)
β
βββ Organization Analytics Dashboard
β βββ Cross-event metrics, charts, CSV export
β
βββ Activity Logs
β βββ Real-time audit trail, filters, CSV export
β
βββ Organization Settings
β βββ Profile
β βββ Organization info
β βββ Appearance (theme)
β βββ Security (password)
β βββ Notifications
β
βββ Pages
βββ Platform Landing Page (with product walkthrough video)
βββ CSV Import Guide + downloadable templates
βββ Terms & Conditions
βββ Privacy Policy
βββ User Manual
βββ 404 Not Found
| Technology | Version | Purpose |
|---|---|---|
| React | 19 | UI library with functional components and hooks |
| Vite | 7 | Build tool and dev server |
| Tailwind CSS | 4 | Utility-first styling with dark mode (via @tailwindcss/vite) |
| React Router DOM | 7 | Client-side routing with protected routes |
| Axios | 1.x | HTTP client for all API requests |
| vite-plugin-pwa + workbox-window | 2.x / 7.x | Manifest, service worker and update prompts (installable PWA) |
| Material Symbols | Latest | Google icon system (variable font, FILL/wght axes) |
| Context API | β | Global state: AuthContext, ThemeContext, EventContext |
| Vitest + Testing Library | β | Frontend unit tests |
| Technology | Version | Purpose |
|---|---|---|
| Node.js | 18+ | Runtime environment |
| Express.js | 5.x | REST API framework |
| MongoDB | Atlas | Primary database |
| Mongoose | 9.x | ODM for schema definition, queries and aggregations |
| JSON Web Tokens | β | Stateless authentication |
| Passport.js | 0.7 | Google OAuth 2.0 strategy |
| bcryptjs | β | Password hashing |
| googleapis (Gmail API) | 144 | OTP / transactional email delivery over OAuth2 |
| ExcelJS | 4.x | Event workbook export |
| helmet / express-rate-limit | β | Security headers and request throttling |
| compression / morgan / cors | β | Response compression, request logging, CORS |
| Jest + Supertest + mongodb-memory-server | β | Backend tests |
User β Organization accounts, hashed passwords, OAuth data
Event β Event metadata and core info
EventSetting β Per-event access permissions and preferences
OrgSettings β Organization-level profile, theme, notifications
Guest β Per-event attendee profiles (arrival / departure, room, check-in state)
Room β Per-event room inventory
Transport β Per-event transport log
ServiceRequest β Per-event service tickets
Schedule β Per-event timeline activities
TeamMember β Per-event staff roster
ActivityLog β Audit trail for all operational events
| Service | Purpose |
|---|---|
| MongoDB Atlas | Managed cloud database |
| Render | Backend API hosting (api.eventcure.in) |
| Vercel | Frontend hosting (eventcure.in) |
| Google Cloud Console | OAuth 2.0 credentials + Gmail API |
event-hospitality-platform/
βββ frontend/
β βββ public/
β β βββ templates/ # Downloadable CSV import templates
β β β βββ guests-template.csv
β β β βββ rooms-template.csv
β β β βββ team-template.csv
β β βββ pwa-192x192.png # PWA icons (+ pwa-512x512.png, pwa-maskable-512x512.png,
β β β # apple-touch-icon.png)
β β βββ robots.txt # Search engine crawl rules
β β βββ sitemap.xml # Public pages for Google Search Console
β β βββ (logos, landing-page.png, manual images)
β βββ src/
β β βββ api/ # Axios API service files (one per module)
β β βββ components/ # Shared UI: Footer, Navbar, DashboardNavbar,
β β β # CsvImportModal, PWAManager, GoogleSignInButton, error boundaries
β β βββ context/ # AuthContext, ThemeContext, EventContext, ProtectedRoute
β β βββ layouts/ # DashboardLayout
β β βββ pages/
β β β βββ admin/ # AdminDashboard
β β β βββ auth/ # GoogleAuthSuccess
β β β βββ dashboards/ # Landingpage, MainOprationDashboard, EventDirectory,
β β β β # EventWorkspaceShell, EventSummaryDashboards,
β β β β # EventAnalyticsReports, OrganizationAnalyticsDashboards,
β β β β # OprationalEventSchedule
β β β βββ forms/ # Signup, Login, ResetPassword, CreateNewEvent,
β β β β # GuestDataEntry, RoomconfigurationForm,
β β β β # TransportEntryForm, NewServiceRequest, TeamMemberEntryForm
β β β βββ inventory/ # GuestMasterList, RoomInventoryManagement, CheckInOprationDesk,
β β β β # TransportCoordinationLogs, ServiceRequestLogs,
β β β β # TeamMemberManagement, ActivityAndNotificationLogs
β β β βββ settings/ # OragnizationSetting, EventAdminstrativeSetting, ...
β β β βββ others/ # UserManual, ImportGuide, Termsandconditions,
β β β # PrivacyPolicy, PageNotFound, modals & empty states
β β βββ tests/ # Vitest suites + API mocks
β β βββ App.jsx
β β βββ main.jsx
β β βββ index.css
β βββ vercel.json # SPA rewrites
β βββ vite.config.js # Vite + Tailwind + PWA (manifest & Workbox)
β βββ package.json
β
βββ backend/
βββ config/
β βββ passport.js # Google OAuth strategy
β βββ googleMailer.js # Gmail API (OAuth2) mail client
βββ connections/
β βββ mongodbConnection.js # MongoDB Atlas connection
βββ controllers/ # Request handlers
βββ services/ # Business logic (incl. bulk-import + aggregations)
βββ models/ # Mongoose schemas
βββ routes/ # Express route definitions
βββ middlewares/ # authMiddleware, adminMiddleware, globalLimiter, rateLimiter
βββ helpers/
β βββ emailHelper.js # OTP generation + email sending
βββ __tests__/ # Jest suites (auth, events, middleware, password reset, export, room capacity)
βββ tests/helpers/ # Test app, in-memory DB and auth helpers
βββ getGmailRefreshToken.js # One-time script to mint the Gmail refresh token
βββ server.js
βββ package.json
- Node.js 18+
- npm
- MongoDB Atlas account (or local MongoDB)
- A Google Cloud project with an OAuth 2.0 client and the Gmail API enabled
- A Gmail address to send OTP emails from (e.g. a dedicated product mailbox)
git clone https://github.com/Kushdeveloper68/event-hospitality-platform.git
cd event-hospitality-platform# Backend
cd backend
npm install
# Frontend
cd ../frontend
npm installCopy backend/.env.example to backend/.env and frontend/.env.example to frontend/.env, then fill them in β see Environment Variables.
OTP emails are sent through the Gmail API, so the sender account must consent once:
cd backend
node getGmailRefreshToken.jsOpen the printed URL, sign in with the Gmail account you want to send from, approve, and paste the printed refresh token into GOOGLE_MAILER_REFRESH_TOKEN. If your Google app is still in Testing mode, add that account under Audience β Test users. The script's redirect URI (http://localhost:5000/oauth2callback) must be listed in the OAuth client's authorized redirect URIs.
# Terminal 1 β Backend (nodemon)
cd backend
npm start
# Starts on http://localhost:7000
# Terminal 2 β Frontend
cd frontend
npm run dev
# Starts on http://localhost:5173Navigate to http://localhost:5173, sign up, create an event, and follow the setup checklist. To try the importer with real-looking data, use the templates in frontend/public/templates/.
The service worker is off in dev. To test the installable app, run
npm run build && npm run previewinfrontend/β see Installable App (PWA).
# Server
PORT=7000
NODE_ENV=development
# MongoDB
MONGO_URI=mongodb+srv://<username>:<password>@cluster.mongodb.net/eventcure
# JWT (tokens are issued with a 7-day expiry)
JWT_SECRET=your_super_secret_jwt_key_here
# URLs β used for CORS and for building the Google OAuth callback
CLIENT_URL=http://localhost:5173
SERVER_URL=http://localhost:7000
# Google OAuth client β used for BOTH "Sign in with Google" AND the Gmail API mailer
GOOGLE_CLIENT_ID=your_google_client_id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=your_google_client_secret
# Gmail API mailer (OTP emails)
# Generate the refresh token once with: node getGmailRefreshToken.js
GOOGLE_MAILER_REDIRECT_URI=http://localhost:7000/oauth2callback
GOOGLE_MAILER_REFRESH_TOKEN=paste_generated_refresh_token_here
GOOGLE_SENDER_EMAIL=the_gmail_address_you_send_from@gmail.com
GOOGLE_SENDER_EMAILis only the label β the account that actually sends mail is the one that approved the consent screen when the refresh token was generated. If you change the sender account, regenerate the refresh token with that account.
# Must include the /api prefix
VITE_API_URL=http://localhost:7000/api| Variable | Production value |
|---|---|
CLIENT_URL |
https://eventcure.in (single canonical origin β CORS allows exactly one) |
SERVER_URL |
https://api.eventcure.in |
VITE_API_URL |
https://api.eventcure.in/api |
Add https://api.eventcure.in/api/users/auth/google/callback to the OAuth client's Authorized redirect URIs and https://eventcure.in to Authorized JavaScript origins. Redirect www.eventcure.in β eventcure.in at the hosting level so the browser origin always matches CLIENT_URL.
All API routes are prefixed with /api. Signup, login, Google OAuth and password-reset routes are public; everything else requires a valid JWT (Authorization: Bearer <token> or the httpOnly cookie). GET /health is a public health check.
| Method | Endpoint | Description |
|---|---|---|
| POST | /signup |
Start signup, send OTP to email |
| POST | /verify-otp |
Verify OTP, create account, return JWT |
| POST | /resend-otp |
Resend OTP |
| POST | /login |
Email + password login |
| POST | /logout |
Clear session |
| GET | /auth/google |
Start Google OAuth flow |
| GET | /auth/google/callback |
Google OAuth callback |
POST /request β POST /verify-otp β POST /reset
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/events/create |
Create event |
| GET | /api/events |
List the organization's events |
| GET / PUT / DELETE | /api/events/:eventId |
Read, update, delete |
| GET | /api/event-settings/:eventId |
Event settings |
| PUT | /api/event-settings/:eventId/core Β· /preferences Β· /archive |
Update core info, preferences, archive state |
| POST | /api/event-settings/:eventId/generate-slug |
Generate URL slug |
| DELETE | /api/event-settings/:eventId/delete |
Permanent delete |
| Resource | Base path | Notes |
|---|---|---|
| Guests | /api/guests |
POST /, GET / (filters: search, vip, status, page, limit), GET/PUT/DELETE /:guestId, POST /bulk-import |
| Rooms | /api/rooms |
POST /, GET / (filters: search, status, page, limit; returns event-wide stats), GET /export, GET/PUT/DELETE /:roomId, POST /:roomId/assign (409 if the room is full), POST /bulk-import |
| Team | /api/team |
POST /, GET /, GET /summary, GET/PUT/DELETE /:memberId, POST /bulk-import |
Room assignment is only possible through
POST /api/rooms/:roomId/assign.PUT/POST /api/guestsignore anyroom(and, on update,event) in the request body;PUT /api/rooms/:roomIdonly acceptsnumber,capacity,type,notes.
| Resource | Base path | Highlights |
|---|---|---|
| Check-in | /api/checkin |
GET /arriving-today, /checked-in, /pending, /summary; PUT /:guestId/check-in, /:guestId/check-out |
| Transport | /api/transport |
POST /create, GET /, GET /summary, PUT /:transportId/status, CRUD by :transportId |
| Services | /api/services |
POST /create, GET /, GET /summary, PUT /:requestId/status, CRUD by :requestId |
| Schedule | /api/schedules |
POST /, GET /event/:eventId, PUT/DELETE /:id |
| Activity logs | /api/activity-logs |
GET /, /summary, /types |
| Overview | /api/overview/:eventId |
Metrics for the event Overview tab |
GET /api/main-dashboard Main ops dashboard (also /metrics, /recent-activity, /upcoming-events, /active-events)
GET /api/org-analytics/full Organization analytics (also /kpis, /checkin-trend, /registration-trend, /vip, ...)
GET /api/event-analytics/:eventId/full Full event report (also /guests, /rooms, /services, /transport, /team, /schedule, /activity)
GET /api/event-analytics/:eventId/export/guests | services | transport | workbook
GET /api/event-summary/:eventId Event summary (also /kpis)
GET /api/org-settings Organization settings (PUT /profile, /organization, /password, /notifications, /theme)
EventCure uses a dual authentication system:
- User submits email, password, name, organization name
- Server sends a 6-digit OTP to the email (valid 10 minutes)
- User verifies OTP β account created β JWT issued
- JWT stored in httpOnly cookie +
localStoragefor AuthContext
- User clicks "Sign in with Google" β redirected to Google consent screen
- Google redirects to
/api/users/auth/google/callback(onapi.eventcure.inin production) - Passport.js creates or finds the user in MongoDB
- Server redirects to
/auth/google/success?token=<jwt>&user=<json> - Frontend
GoogleAuthSuccesspage extracts params, stores JWT, updates AuthContext, redirects to dashboard
- User enters email β OTP sent (6-digit, 10-minute TTL)
- User enters OTP β server issues a short-lived
resetToken - User enters new password β server validates
resetToken, updates hash
All dashboard routes are wrapped in <ProtectedRoute> which checks isAuthenticated from AuthContext. Unauthenticated users are redirected to /login.
Add your screenshots to
/docs/images/and update paths below.
| Screen | Preview |
|---|---|
| Landing Page | ![]() |
| Operations Dashboard | ![]() |
| Event Workspace | ![]() |
| Guest Master List | ![]() |
| Check-in Desk | ![]() |
| Transport Logs | ![]() |
| Event Schedule | ![]() |
| Event Analytics | ![]() |
| Organization Settings | ![]() |
| Activity Logs | ![]() |
Where EventCure is designed to save a typical event operations team time. These are estimates based on common manual workflows, not measured results β EventCure is in beta and real-world numbers will be published as events run on it.
| Old Process | With EventCure | Estimated Saving |
|---|---|---|
| Guest list in Google Sheets, manually updated | Real-time guest database with search & filters | 2β4 hrs/event |
| Typing guests, rooms and staff in one by one | CSV bulk import with per-row error reporting | Hours on large lists |
| Check-in via paper list or Excel | One-click digital check-in with live counters | Shorter arrival queues |
| WhatsApp groups for service requests | Structured ticketing with priority and status | 1β2 hrs/day |
| Separate fleet spreadsheet for transport | Unified transport log with live status | ~1 hr/day |
| Manual schedule in PowerPoint | Live Gantt timeline editable by the whole team | 3β5 hrs/event |
| Post-event report compiled manually | Auto-generated analytics with CSV export | 4β8 hrs/event |
Illustrative scenarios showing how teams can use EventCure.
Register 1,200 delegates, assign 200 rooms, coordinate 80 transport legs, manage 6 concurrent workstreams on the schedule β all tracked in one platform from a single operations screen.
Track 300 guests, log dietary requirements as special requests, assign rooms with VIP tagging for family, coordinate 12 transport pickups, and generate a full report for the venue.
Manage a 3-day corporate retreat: check-in guests as they arrive, raise housekeeping tickets from the floor, track shuttle buses to golf courses, and give the client a PDF analytics report at the end.
Handle delegate accreditation (VIP flag), track which sessions guests attend via check-in events, coordinate lunch catering (F&B service requests), and manage speaker transport.
Restricted guest lists (private events), VIP tagging with special request notes for protocol staff, transport coordination for diplomatic arrivals, and full audit trail in activity logs.
- Ownership checks β every event-scoped controller verifies the signed-in user owns the event. The guest, room, team and bulk-import handlers fail closed (a missing user is rejected with
401, never skipped); remaining older handlers are being moved to the same pattern - Capacity & mass-assignment guards β room capacity is enforced server-side, and fields that must not be client-controlled (
room,event) are stripped from guest/room updates - Security headers via
helmet - Rate limiting β global limiter (1000 requests / 15 min per IP) plus stricter limiters on sensitive routes
- Request size cap β JSON / URL-encoded bodies limited to 2 MB (enough for a full 1000-row import)
- Bulk import guardrails β authenticated, ownership-verified, capped at 1000 rows, per-row validation; free-text search input is regex-escaped
- PWA safety β the service worker never caches
/api/*or auth routes, so sensitive data is always fetched live - Single CORS origin β only
CLIENT_URLis allowed, with credentials - Passwords hashed with bcrypt; OTPs expire after 10 minutes
- Secrets live only in environment variables (see
.env.example); never commit real values
# Backend (Jest + Supertest + in-memory MongoDB)
cd backend
npm test
npm run test:coverage
# Frontend (Vitest + Testing Library)
cd frontend
npm test
npm run test:coverage| Piece | Where | Notes |
|---|---|---|
| Frontend | Vercel β eventcure.in |
SPA rewrites in vercel.json; set VITE_API_URL=https://api.eventcure.in/api |
| Backend | Render β api.eventcure.in |
Add a CNAME for api pointing at the Render service; set all backend env vars |
| Database | MongoDB Atlas | Allow the Render service's IPs |
| Auth / Mail | Google Cloud Console | Production redirect URI + origins added to the OAuth client; refresh token minted for the sender account |
| PWA | Vercel (HTTPS) | Manifest + service worker are generated by vite build; after a deploy, installed apps show a new version available prompt |
| SEO | Google Search Console | Verify via DNS TXT record, then submit https://eventcure.in/sitemap.xml |
- QR code generation for guest self check-in
- Push notifications (browser + mobile)
- Bulk WhatsApp / email notifications to guests (room details, arrival info)
- Per-page SEO metadata (React Helmet or pre-rendering) for public pages
- Multi-language support (i18n)
- Dedicated iOS & Android app
- Calendar integration (Google Calendar, Outlook)
- Payment integration for event ticketing
- Custom branding / white-label support
- API webhooks for third-party integrations
- Role-based access control (RBAC) within an organization
- Real-time GPS tracking integration for transport
- Full CRUD for all operational modules
- Google OAuth 2.0 integration
- Gmail API mailer (OAuth2) for OTP delivery
- Bulk CSV import for guests, rooms and team, with in-app Import Guide and downloadable templates
- Guided event setup checklist and direct redirect into the new event's workspace
- Rooms tab: server-side search/filter and event-wide stats; full-dataset export
- Installable PWA β install banner (Android/desktop), iOS add-to-home-screen hint, update prompt, app shortcuts; API calls never cached
- Mobile-first UI/UX refresh β the whole workspace is usable from a phone
- Server-side room capacity enforcement (409 on full rooms, race-safe) and guest/room mass-assignment guards
- Dark mode with system preference detection
- Event analytics with 8-tab drill-down
- Organization-level cross-event analytics
- CSV + Excel workbook export
- Real-time activity audit trail
- 3-step password reset OTP flow
- Event administrative settings with archive/delete
- Gantt-style multi-workstream schedule timeline
- Responsive mobile layout
- Error boundaries with graceful fallback UI
- Terms & Conditions, Privacy Policy, User Manual, CSV Import Guide pages
- SEO basics:
robots.txt,sitemap.xml, Open Graph / Twitter tags, structured data - Custom domain:
eventcure.in(app) andapi.eventcure.in(API)
Contributions are welcome. Please follow these steps:
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature-name - Commit your changes:
git commit -m 'feat: add your feature' - Push to the branch:
git push origin feature/your-feature-name - Open a Pull Request with a clear description of the change
- Use functional React components with hooks
- Follow the existing file and folder naming conventions
- Keep API logic in
/api/files, not inside components - Dark mode must work for all new UI β use Tailwind's
dark:variants consistently - Toast notifications should use the existing toast pattern in each module
Kush Pandit β Full-stack Developer & UI/UX Designer
-
π Portfolio: kushdeveloper.me
-
π Diploma in Computer Engineering, Government Polytechnic Bhuj
-
βοΈ Support: hello.eventcure@gmail.com
Built with β€οΈ from Gandhidham, Gujarat, India.
This project is proprietary software. All rights reserved.
Β© 2025β2026 EventCure β Kush Pandit. Unauthorized copying, distribution, or use of this codebase is prohibited without explicit written permission from the author.
EventCure Β· Built for teams that can't afford a single missed detail.










