An intelligent Request for Proposal (RFP) platform that connects buyers with vendors using AI-powered matching and automated workflows.
Live Link: https://rfp-connect.vercel.app/
- AI-Powered RFP Processing: Automated parsing and analysis of RFP requirements using OpenAI
- Smart Vendor Matching: Intelligent algorithm to match RFPs with suitable vendors
- Real-time Notifications: Email notifications for RFP updates and matches
- User Authentication: Secure JWT-based authentication for buyers and vendors
- Background Job Processing: Redis-powered queue system for async operations
- Responsive UI: Modern React frontend with Tailwind CSS and Framer Motion
๐ฑ React + TS
๐จ Tailwind CSS
โ๏ธ Redux Toolkit
๐ Express API
๐ JWT Auth
๐ง OpenAI GPT
๐๏ธ PostgreSQL
๐ฅ Redis Queue
๐ง SendGrid
- Framework: React 19 with TypeScript
- Styling: Tailwind CSS with custom animations
- State Management: Redux Toolkit
- Routing: React Router DOM
- UI Components: Custom components with Framer Motion animations
- Runtime: Node.js with ES modules
- Framework: Express.js
- Database: PostgreSQL with Sequelize ORM
- Queue System: BullMQ with Redis
- AI Integration: OpenAI API for RFP analysis
- Email Service: Nodemailer with SendGrid
| Table | Key Fields | Relationships |
|---|---|---|
| Buyers | id(UUID PK), email(unique), phone(unique), status | 1:N โ RFPs |
| Vendors | id(UUID PK), companyName, mainService, status | 1:N โ VendorProductsM:N โ RFPs |
| RFPs | id(UUID PK), buyerId(FK), title, aiParsed(JSON), status | N:1 โ BuyersM:N โ Vendors |
| RfpVendors | rfpId(PK), vendorId(PK), score(0-100), accepted | Junction table |
| VendorProducts | id(PK), vendorId(FK), name, price, category | N:1 โ Vendors |
-
Buyers (1:N with RFPs)
- One buyer can create multiple RFPs
- Each RFP belongs to exactly one buyer
-
Vendors (1:N with VendorProducts)
- One vendor can have multiple products/services
- Each product belongs to exactly one vendor
-
RFPs (M:N with Vendors through RfpVendors)
- One RFP can be matched with multiple vendors
- One vendor can be matched with multiple RFPs
-
RfpVendors (Many-to-Many Resolution)
- Composite Primary Key: (rfpId, vendorId)
- Stores matching score, notification status, proposal acceptance
- Links buyers, RFPs, and vendors for the matching process
-
EmailVerificationTokens (1:N with Users)
- Supports both buyer and vendor email verification
- Time-limited tokens with expiration tracking
- id (UUID, PK)
- firstName, lastName (STRING, NOT NULL)
- emailAddress (STRING, UNIQUE, NOT NULL)
- phone (STRING, UNIQUE, NOT NULL)
- address, city, state, country, postalCode (STRING)
- passwordHash (STRING, NOT NULL)
- isEmailVerified (BOOLEAN, DEFAULT false)
- emailVerifiedAt (DATE)
- status (ENUM: PENDING_VERIFICATION, ACTIVE, SUSPENDED)- id (UUID, PK)
- vendorCompanyName (STRING, NOT NULL)
- emailAddress (STRING, UNIQUE, NOT NULL)
- mainProductService (STRING)
- passwordHash (STRING, NOT NULL)
- phoneNumber, address, pincode, state (STRING)
- establishedDate (DATE)
- deliveryTimeframe (STRING)
- isEmailVerified (BOOLEAN, DEFAULT false)
- status (ENUM: PENDING_VERIFICATION, ACTIVE, SUSPENDED)
- onboardingCompleted (BOOLEAN, DEFAULT false)
- onboardingProgress (INTEGER, DEFAULT 0)- id (UUID, PK)
- buyerId (UUID, FK โ Buyers.id)
- rfpTitle (STRING, NOT NULL)
- buyerExpectations (TEXT, NOT NULL)
- expectedDelivery (STRING, NOT NULL)
- budgetRange (STRING)
- additionalContext (TEXT)
- aiParsedRequirements (JSON) -- AI analysis results
- shortlistedVendorsList (JSON) -- Array of vendor IDs
- rfpStatus (ENUM: Pending, Parsed, Shortlisted, Notified)
- notificationSent (BOOLEAN, DEFAULT false)
- submissionDate (DATE, DEFAULT NOW)- rfpId (UUID, PK, FK โ RFPs.id)
- vendorId (UUID, PK, FK โ Vendors.id)
- buyerId (UUID, FK โ Buyers.id)
- vendorScore (INTEGER, DEFAULT 0) -- Matching algorithm score
- notificationSent (BOOLEAN, DEFAULT false)
- proposalAccepted (BOOLEAN, NULL) -- Buyer's decision๐ค AI-Powered Workflow
-
RFP Submission Flow Buyer submits RFP โ Queue Job โ AI Analysis โ Vendor Matching โ Notifications
-
AI Processing Pipeline Natural Language Processing: OpenAI GPT-4 analyzes RFP requirements
Structured Extraction: Converts free text to structured data:
{
"summary": "Brief RFP description",
"businessDomain": "e.g., SaaS, e-commerce",
"primaryGoal": "Main objective",
"techStack": ["React", "Node.js", "PostgreSQL"],
"mustHaveFeatures": ["Authentication", "API"],
"niceToHaveFeatures": ["Analytics", "Mobile"],
"expectedDelivery": "Cleaned timeline"
}- Vendor Matching Algorithm
Scoring System (0-100 points):
- Tech Stack Match (0-15 pts): 3 pts per matching technology
- Feature Match (0-10 pts): 2 pts per required feature
- Location Proximity (0-5 pts): Same state/region preference
- Delivery Timeline (0-2 pts): Vendor delivery capability
- Product Portfolio (0-5 pts): 0.5 pts per relevant product
- Onboarding Status (0-3 pts): Completed vendor profiles
Minimum Score: 8 points for shortlisting
Maximum Results: Top 5 vendors per RFP
- Triggered on RFP submission
- AI parsing of requirements
- Vendor matching algorithm execution
- Email notification dispatch
RFP Submit โ Queue Job โ AI Parse โ Update RFP โ Match Vendors โ
Create RfpVendor Records โ Send Notifications โ Update Status
- Node.js (v18 or higher)
- Docker & Docker Compose
- PostgreSQL (if running locally)
- Redis (if running locally)
- Clone the Repository
git clone <repository-url>
cd rfp-ai-powered-app
2. Environment Configuration
Backend Environment (.env in /backend)
PORT=8080
FE_PORT=3000
PROTOCOL=http
DB_USER=postgres
DB_PASSWORD=Test1234
DB_HOST=localhost
DB_NAME=ai_powered_rfp_db
DB_PORT=5432
JWT_SECRET_KEY=your_secret_key_here
EMAIL_USER=your_email@gmail.com
SENDGRID_API_KEY=your_sendgrid_api_key
OPENAI_SECRET_KEY=your_openai_api_key
REDIS_HOST=localhost
REDIS_PORT=6379REACT_APP_API_URL=http://localhost:8080
- Using Docker (Recommended)
# Start all services
docker-compose up -d
# View logs
docker-compose logs -f
# Stop services
docker-compose down
4. Manual Setup
Backend Setup
cd backend
npm install
npm run devFrontend Setup
npm install
npm startDatabase Setup
# Start PostgreSQL and Redis
docker-compose up -d db redis
# Database will be automatically created by Sequelize๐ API Endpoints
Authentication
POST /api/auth/login - User login
POST /api/auth/register - User registration
Buyers
GET /api/buyer - Get buyer profile
POST /api/buyer - Create buyer profile
PUT /api/buyer - Update buyer profile
Vendors
GET /api/vendor - Get vendor profile
POST /api/vendor - Create vendor profile
PUT /api/vendor - Update vendor profile
RFPs
POST /api/rfp - Submit new RFP
GET /api/rfp - Get RFPs (filtered by user role)
Email Verification
POST /api/verify-email - Verify email address๐จ Frontend Structure
src/
โโโ components/
โ โโโ pages/ # Page components
โ โโโ ui/ # Reusable UI components
โโโ context/ # React contexts
โโโ entities/ # TypeScript type definitions
โโโ guards/ # Route protection
โโโ services/ # API service layer
โโโ store/ # Redux store configuration
โโโ staticData/ # Static content
๐ง Development Available Scripts Frontend npm start # Start development server npm run build # Build for production npm test # Run tests
Backend
npm start # Start production server
npm run dev # Start development server with nodemonESLint configuration for consistent code style
TypeScript for type safety
Modular architecture with separation of concerns๐ Deployment Production Build
npm run build
cd backend && npm start
Docker Production
docker-compose -f docker-compose.prod.yml up -dFork the repository
Create a feature branch (git checkout -b feature/amazing-feature)
Commit your changes (git commit -m 'Add amazing feature')
Push to the branch (git push origin feature/amazing-feature)
Open a Pull Request๐ License This project is licensed under the MIT License - see the LICENSE file for details.
For support and questions:
- Create an issue in the GitHub repository
- Contact the development team
Advanced AI matching algorithms
Real-time chat between buyers and vendors
Document management system
Advanced analytics dashboard
Mobile application
Multi-language support