A modern CRM system for managing leads and automated sequences, built with React, Supabase, and Node.js.
- Import leads from CSV/Excel files
- Automatic duplicate detection
- Rich lead profiles with company information
- Bulk lead operations (delete, add to sequence)
- Create multi-step sequences with:
- Email campaigns
- Phone call reminders
- LinkedIn connection requests
- Customizable wait times between steps
- Dynamic placeholders for personalization
- Version control for sequence updates
- SMTP email server integration
- HTML email templates
- Personalized email sending
- Email tracking and status monitoring
- Mark manual steps as complete
- Add notes for phone calls and LinkedIn interactions
- Track completion status and history
- Automatic sequence progression
- Step-by-step workflow visualization
- Pause/resume sequence execution
- Error handling and status tracking
-
Frontend:
- React with TypeScript
- Tailwind CSS for styling
- React Router for navigation
- Lucide React for icons
-
Backend:
- Node.js with Express
- Supabase for database and authentication
- Nodemailer for email handling
- Node.js 18 or higher
- Supabase account
- SMTP email server credentials
Create a .env
file in the root directory with the following variables:
VITE_SUPABASE_URL=your_supabase_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
# Email Configuration
VITE_EMAIL_HOST=your_smtp_host
VITE_EMAIL_PORT=smtp_port
VITE_EMAIL_SECURE=true_or_false
VITE_EMAIL_USER=your_email
VITE_EMAIL_PASSWORD=your_email_password
-
Clone the repository:
git clone <repository-url> cd crm-sequence-manager
-
Install dependencies:
npm install
-
Start the development server:
npm run dev
The application will start in development mode:
- Frontend: http://localhost:5173
- Backend: http://localhost:8000
id
: UUID (Primary Key)name
: Textdescription
: Textcreated_at
: Timestampuser_id
: UUID (Foreign Key)enabled
: Booleanversion
: Integer
id
: UUID (Primary Key)sequence_id
: UUID (Foreign Key)step_type
: Text ('email', 'call', 'linkedin_request')step_order
: Integerconfiguration
: JSONBcreated_at
: Timestampwait_time
: Integerwait_time_unit
: Text ('minutes', 'hours', 'days')
id
: UUID (Primary Key)- Various lead information fields
created_at
: Timestampuser_id
: UUID (Foreign Key)
id
: UUID (Primary Key)lead_id
: UUID (Foreign Key)sequence_id
: UUID (Foreign Key)current_step
: Integerstatus
: Textcreated_at
: Timestamppaused_at
: Timestampnext_execution
: Timestamp
id
: UUID (Primary Key)lead_sequence_id
: UUID (Foreign Key)step_id
: UUID (Foreign Key)completed_at
: Timestampnotes
: Textcompleted_by
: UUID (Foreign Key)
-
Import Leads:
- Click "Upload Leads" on the dashboard
- Select a CSV/Excel file with lead data
- System automatically detects and handles duplicates
-
Add Leads to Sequence:
- Select leads from the dashboard
- Click "Add to Sequence"
- Choose existing sequence or create new
-
Create New Sequence:
- Navigate to Sequences page
- Click "Create Sequence"
- Add sequence name and description
- Add steps (email, call, LinkedIn)
- Configure wait times between steps
-
Configure Steps:
-
Email Steps:
- Add subject and message
- Use placeholders for personalization
- Set wait time before next step
-
Manual Steps (Call/LinkedIn):
- Add notes/script
- Set completion requirements
- Configure follow-up timing
-
-
Dashboard:
- View all leads and their sequence status
- Monitor sequence progress
- Handle failed steps
-
Sequence Management:
- Enable/disable sequences
- Edit sequence steps
- Version control for changes
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature
) - Commit your changes (
git commit -m 'Add some AmazingFeature'
) - Push to the branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
To properly test the cold calling feature with Twilio, follow these steps:
-
Run your local API server:
npm run server
-
Run your local frontend:
npm run client
-
The local frontend will automatically proxy API requests to your local server.
If you want to test with the production frontend at https://fastcrm.netlify.app
, you need to:
-
Run your local API server:
npm run server
-
Install and set up ngrok:
a. Sign up for a free ngrok account at https://dashboard.ngrok.com/signup
b. After signing up, get your auth token from https://dashboard.ngrok.com/get-started/your-authtoken
c. Configure ngrok with your auth token:
npx ngrok authtoken YOUR_AUTH_TOKEN
d. Start ngrok to create a public URL for your local server:
npx ngrok http 8002
e. Copy the HTTPS URL provided by ngrok (e.g.,
https://abcd1234.ngrok.io
). -
Update your
.env
file with this URL:VITE_APP_URL=https://your-ngrok-url
-
Restart your server.
-
Now you can use the production frontend at
https://fastcrm.netlify.app
and it will connect to your local API server through ngrok.
- Twilio requires publicly accessible webhook URLs to handle call events.
- When testing locally, your server is only accessible from your machine.
- The ngrok tool creates a secure tunnel to your local server, making it accessible from the internet.
For a complete production setup, you would need to:
- Deploy your frontend to Netlify (already done at
https://fastcrm.netlify.app
). - Deploy your backend API server to a hosting service like Heroku, Render, or DigitalOcean.
- Configure your frontend to use the URL of your deployed backend.
Make sure your Twilio account has the following:
- A verified phone number to make outbound calls.
- Proper credentials (Account SID, Auth Token) in your
.env
file. - Sufficient funds in your Twilio account for making real calls.
- If calls are not connecting, check the server logs for Twilio error messages.
- Ensure your ngrok URL is properly set in the
.env
file. - Verify that the CORS settings allow connections from your frontend domain.
A modern CRM application with integrated cold calling capabilities, email sequences, and analytics.
This application can be run in two modes:
- Local development with direct connectivity
- Remote access through ngrok tunneling
-
Install dependencies:
npm install
-
Start the server and client:
npm run dev
This will start:
- The React client on http://localhost:5173
- The API server on http://localhost:8002
To make your local development server accessible from the internet (useful for testing webhooks, mobile device access, or sharing with team members), you can use ngrok.
-
Install ngrok: https://ngrok.com/download
-
Start ngrok to create a tunnel to your local server:
ngrok http 8002
-
Copy the generated ngrok URL (e.g., https://abcd1234.ngrok-free.app)
-
Run our setup script that will configure the application to use your ngrok URL:
npm run setup-ngrok
-
The script will prompt you to enter your ngrok URL and will update the
.env.local
file accordingly. -
Restart your development server:
npm run dev
-
Your application will now use the ngrok URL for API calls.
If you encounter connectivity issues:
-
Visit the Settings page in the application and use the "API Connectivity Test" section to diagnose connectivity problems.
-
Check common issues:
- Ensure ngrok is running and the URL is correctly configured
- Verify the server is running on port 8002
- Look for CORS errors in the browser console
- Make sure your ngrok URL matches the one configured in the app
-
The API server has two special endpoints for testing:
/api/health
- Returns basic server status/api/cors-test
- Tests CORS configuration
- Dashboard with lead overview and analytics
- Cold calling with call tracking and notes
- Email sequence management
- CRM functionality with lead management
- Settings for integration configuration
- Frontend: React, TypeScript, Tailwind CSS
- Backend: Node.js, Express
- Integrations: Twilio, Email Services, LinkedIn API
The application consists of two main parts:
- Client: Located in
src/
directory, React application built with Vite - Server: Located in
server/
directory, Express API server
Key environment variables:
VITE_NGROK_URL
: ngrok URL for remote API accessVITE_API_URL
: Full API URL (optional, derived from ngrok URL if not provided)PORT
: Server port (default: 8002)HOST
: Server host (default: 0.0.0.0)
These can be configured in .env.local
(recommended for development).