A B2B notification API service supporting Email, SMS, In-App, and Webhook channels with retry engine, dead letter queue, and delivery analytics.
- Backend — Java 17, Spring Boot 3, MySQL 8, Flyway, Spring Security, JWT
- Admin Panel — React, Vite, Tailwind CSS
- Client Portal — React, Vite, Tailwind CSS
multichannel-notification-delivery-system/ ├── notification-backend/ → Spring Boot backend ├── notification-frontend/ → Admin panel (React) └── notification-client-ui/ → Client portal (React)
Make sure you have these installed before starting:
| Tool | Version | Download |
|---|---|---|
| Java | 17 | https://www.oracle.com/java/technologies/downloads/#java17 |
| Maven | 3.8+ | https://maven.apache.org/download.cgi |
| MySQL | 8.0 | https://dev.mysql.com/downloads/installer/ |
| Node.js | 18+ | https://nodejs.org |
| Git | Latest | https://git-scm.com |
Open terminal and run:
git clone https://github.com/VivekG-2004/MultiChannel-Notification-Delivery-System.gitThen open the cloned folder:
cd MultiChannel-Notification-Delivery-SystemOpen MySQL Workbench or any MySQL client and run:
CREATE DATABASE notification_platform;That is it. Do not create any tables manually. Flyway will automatically create all 7 tables when the backend starts for the first time.
- Open IntelliJ IDEA
- Click
File → Open - Select the
notification-backendfolder - Wait for Maven to download all dependencies (this may take a few minutes)
- Open Eclipse
- Click
File → Import - Select
Maven → Existing Maven Projects - Click
Browseand select thenotification-backendfolder - Click
Finish - Wait for Maven to download all dependencies
Go to: notification-backend/src/main/resources/
You will see application.properties.example file.
Copy it and rename the copy to application.properties
On Windows:
cd notification-backend/src/main/resources
copy application.properties.example application.propertiesOn Mac/Linux:
cd notification-backend/src/main/resources
cp application.properties.example application.propertiesNow open application.properties and fill in your values:
# ───────────────────────────────
# Database Configuration
# ───────────────────────────────
spring.datasource.url=jdbc:mysql://localhost:3306/notification_platform
spring.datasource.username=root
spring.datasource.password=YOUR_MYSQL_PASSWORD
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
# ───────────────────────────────
# Flyway
# ───────────────────────────────
spring.flyway.enabled=true
spring.flyway.locations=classpath:db/migration
# ───────────────────────────────
# JWT Configuration
# ───────────────────────────────
# Put any long random string here — minimum 32 characters
app.jwt.secret=put-any-long-random-string-here-minimum-32-characters
app.jwt.expiration=86400000
# ───────────────────────────────
# Admin Credentials
# ───────────────────────────────
# These are the credentials to login to the admin panel
app.admin.username=admin
app.admin.password=admin123
# ───────────────────────────────
# Gmail SMTP Configuration
# ───────────────────────────────
# You need a Gmail account with 2FA enabled
# Generate App Password at:
# Google Account → Security → 2-Step Verification → App Passwords
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=YOUR_GMAIL@gmail.com
spring.mail.password=YOUR_GMAIL_APP_PASSWORD
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
# ───────────────────────────────
# SMS Configuration (Optional)
# ───────────────────────────────
# Only needed if you want to test SMS channel
# Get API key from https://www.fast2sms.com
app.sms.api.key=YOUR_FAST2SMS_API_KEY
# ───────────────────────────────
# Plan Limit
# ───────────────────────────────
app.plan.free.limit=1000
# ───────────────────────────────
# Server Port
# ───────────────────────────────
server.port=8080- Open the project in IntelliJ
- Find
NotificationPlatformApplication.javain the project explorer - Right click on it
- Click
Run NotificationPlatformApplication
- Open the project in Eclipse
- Right click on the project
- Click
Run As → Spring Boot App
cd notification-backend
./mvnw spring-boot:runOn Windows if above does not work:
mvn spring-boot:runWait until you see this in the console: Started NotificationPlatformApplication in X.XXX seconds
Open a new terminal and run:
cd notification-frontend
npm install
npm run devWait until you see: VITE ready in XXX ms ➜ Local: http://localhost:5173/
Open browser and go to: http://localhost:5173
Login with: Username: admin Password: admin123
Open another new terminal and run:
cd notification-client-ui
npm install
npm run devWait until you see: VITE ready in XXX ms ➜ Local: http://localhost:5174/
Open browser and go to: http://localhost:5174
Go to http://localhost:5173 Login with admin credentials (admin / admin123) Go to Clients page Click Register Client button Fill company name and email Copy the API key shown — share it with the client Monitor all jobs, DLQ, and analytics from the dashboard
Go to http://localhost:5174 Click Register Fill your company name and email Copy your API key shown after registration Enter your API key to access the client dashboard Send notifications, manage templates, view history
You need 3 terminals running at the same time: Terminal 1 → Backend → http://localhost:8080 Terminal 2 → Admin UI → http://localhost:5173 Terminal 3 → Client UI → http://localhost:5174
Windows:
netstat -ano | findstr :8080
taskkill /PID <PID_NUMBER> /FMac/Linux:
lsof -i :8080
kill -9 <PID_NUMBER>- Make sure MySQL service is running
- Open MySQL Workbench and verify you can connect
- Check
spring.datasource.passwordinapplication.properties
- Make sure backend is running first
- Check that you are logged in with correct credentials
- Clear browser localStorage and login again
This happens when port 5173 is already in use. Vite automatically picks 5174.
Fix — open notification-backend/src/main/java/.../config/SecurityConfig.java and update:
configuration.setAllowedOrigins(List.of(
"http://localhost:5173",
"http://localhost:5174"
));Restart the backend.
- Make sure 2FA is enabled on your Gmail account
- Generate an App Password: Google Account → Security → 2-Step Verification → App Passwords → Select app: Mail → Select device: Windows Computer → Generate
- Use that 16 character password in
spring.mail.password - Do not use your regular Gmail password
rm -rf node_modules
npm install
npm run dev| Method | Endpoint | Auth | Description |
|---|---|---|---|
| POST | /api/auth/login | None | Admin login |
| POST | /api/clients/register | None | Register as client |
| GET | /api/admin/clients | JWT | Get all clients |
| PUT | /api/admin/clients/{id}/block | JWT | Block a client |
| POST | /api/notify | API Key | Send notification |
| POST | /api/notify/schedule | API Key | Schedule notification |
| GET | /api/notify/history | API Key | Notification history |
| GET | /api/admin/jobs | JWT | All jobs |
| GET | /api/admin/dlq | JWT | Dead letter queue |
| POST | /api/admin/dlq/{id}/replay | JWT | Replay failed job |
| DELETE | /api/admin/dlq/{id} | JWT | Discard failed job |
| GET | /api/analytics/summary | JWT | Analytics summary |
| GET | /api/inbox/{userRef} | None | In-app notifications |
7 tables created automatically by Flyway: clients → registered client companies templates → notification templates with placeholders notification_jobs → all notification jobs and their status dead_letter_jobs → jobs that exhausted all retries delivery_logs → individual delivery attempt logs in_app_notifications → in-app notification inbox client_usage → per client usage tracking