A Slack bot that manages solution team requests and creates ClickUp tasks, deployed on AWS Lambda using the Serverless Framework.
- Listens for messages in a specific Slack channel
- Interactive buttons to classify requests (Question, Design, RFP)
- Collects additional details through threaded conversations
- Creates ClickUp tasks with collected information
- Serverless architecture using AWS Lambda and DynamoDB
- Node.js 18.x or later
- AWS CLI configured with appropriate credentials
- Serverless Framework (
npm install -g serverless) - Slack App configured with Events API (not Socket Mode)
- ClickUp API token
Your Slack app must be configured with Events API (not Socket Mode):
- Go to your Slack App settings at https://api.slack.com/apps
- Navigate to Event Subscriptions
- Enable Events and set Request URL to:
https://YOUR-API-GATEWAY-URL/slack/events- You'll get this URL after deploying (see deployment steps below)
- Subscribe to bot events:
message.channels- Listen for messages in channels
- Navigate to OAuth & Permissions
- Add Bot Token Scopes:
chat:write- Send messageschannels:history- View messages in channelsusers:read- View user information
- Install/Reinstall the app to your workspace
The following environment variables are required:
SLACK_BOT_TOKEN- Your Slack bot token (xoxb-...)SLACK_SIGNING_SECRET- Your Slack signing secretSOLUTION_CHANNEL_ID- The Slack channel ID to monitorCLICKUP_API_TOKEN- Your ClickUp API tokenCLICKUP_LIST_ID- The ClickUp list ID where tasks will be created
-
Install dependencies:
npm install
-
Set up your environment variables in
.envfile (for reference) -
Deploy to AWS:
npm run deploy
-
After deployment, you'll see output like:
endpoints: POST - https://abc123.execute-api.us-east-1.amazonaws.com/prod/slack/events -
Copy the endpoint URL and configure it in your Slack App's Event Subscriptions Request URL
-
Test by sending a message in your configured Slack channel
The deployment creates:
- Lambda Function: Processes Slack events
- API Gateway: HTTP endpoint for Slack to send events
- DynamoDB Table: Stores conversation state (with 24-hour TTL)
- IAM Role: Permissions for Lambda to access DynamoDB
npm run deploy- Deploy to AWSnpm run remove- Remove all AWS resourcesnpm run logs- View Lambda function logs
This project includes automated deployment workflows:
- Production: Auto-deploys when pushing to
mainormasterbranch - Staging: Auto-deploys when pushing to
developorstagingbranch
Setup Instructions: See GITHUB_ACTIONS_SETUP.md
Quick setup:
- Add GitHub Secrets (AWS credentials, Slack tokens, etc.)
- Push to
mainbranch - GitHub Actions automatically deploys to AWS Lambda
No manual deployment needed! 🚀
Slack Event → API Gateway → Lambda → DynamoDB
↓
ClickUp API
Conversation state is stored in DynamoDB with:
- Primary Key:
threadTs(Slack thread timestamp) - TTL: 24 hours (automatic cleanup)
- Attributes: userId, messageTs, originalMessage, step, requestType, additionalDetails
This solution uses AWS free tier eligible services:
- Lambda: 1M free requests/month
- DynamoDB: 25GB storage + 25 RCU/WCU free
- API Gateway: 1M API calls free for 12 months
Expected monthly cost after free tier: < $1 for typical usage
- Verify API Gateway endpoint is configured in Slack Event Subscriptions
- Check Lambda logs:
npm run logs - Ensure Slack signing secret is correct
- Verify
SOLUTION_CHANNEL_IDmatches your channel - Check bot is invited to the channel
- Ensure bot has proper OAuth scopes
- Verify
CLICKUP_API_TOKENis valid - Verify
CLICKUP_LIST_IDexists and bot has access - Check Lambda logs for error details
- Never commit
.envfile to version control - Use AWS Secrets Manager or Parameter Store for production secrets
- Rotate Slack tokens and ClickUp API keys regularly
- Review IAM permissions to ensure least privilege
To share with your team:
- Share this folder (excluding
node_modulesand.env) - Team members need:
- AWS credentials with appropriate permissions
- Environment variables (share securely, not via git)
- Each team member can deploy to their own AWS account/stage
- For production, use CI/CD pipeline (GitHub Actions, GitLab CI, etc.)