666 lines
26 KiB
Markdown

# CloseBot SMS — Definitive Build Plan
> Unified app: Twilio native SMS + CloseBot AI bots. One dashboard to rule them all.
---
## 1. TECH STACK
| Layer | Technology | Why |
|---|---|---|
| **Frontend** | Next.js 14 (App Router) + Tailwind CSS + shadcn/ui | Dark-mode-first, server components, fast |
| **Backend** | Next.js API routes (Edge-compatible) | Same deployment, zero CORS |
| **Database** | SQLite via better-sqlite3 (dev) → Turso/LibSQL (prod) | State tracking, conversation history, routing config |
| **Real-time** | Server-Sent Events (SSE) | Live conversation updates on dashboard |
| **SMS** | Twilio Node SDK (`twilio`) | Send/receive SMS, delivery status |
| **AI Bots** | CloseBot API (direct HTTP) | Webhook Source for inbound, API for bots/leads/metrics |
| **Auth** | NextAuth.js with credentials provider | Simple login, protect all routes |
| **Deploy** | Railway / Fly.io / Vercel | Needs persistent process for webhooks |
---
## 2. SYSTEM ARCHITECTURE
```
┌─────────────┐ ┌──────────────────────────┐ ┌─────────────┐
│ Customer │────>│ Twilio (SMS) │────>│ CloseBot │
│ Phone │<────│ │<────│ SMS App │
└─────────────┘ └──────────────────────────┘ └──────┬──────┘
┌──────────────────────────┐ │
│ CloseBot API │<───────────┘
│ (Webhook Source) │────────────┐
└──────────────────────────┘ │
v
┌──────────────┐
│ SQLite DB │
│ (state/logs) │
└──────────────┘
```
**Message Flow — Inbound:**
1. Customer sends SMS to Twilio number
2. Twilio POSTs to `POST /api/webhooks/twilio/inbound`
3. App looks up routing: which Twilio number → which CloseBot bot/source
4. App sends inbound event to CloseBot via `POST /webhook/event/{sourceId}` with:
- `type: "message"`
- `contactId` (phone number as unique identifier)
- `message` (SMS body)
- `state` (JSON: `{ twilioNumber, phoneFrom, messageSid }`)
5. CloseBot processes through bot flow
6. CloseBot POSTs response to our webhook retrieval URL: `POST /api/webhooks/closebot/response`
7. App receives response, extracts `state` to get the Twilio number + customer phone
8. App sends SMS via Twilio API
9. App logs everything to SQLite + broadcasts via SSE for live dashboard
**Message Flow — Manual Override (from Conversations view):**
1. User types message in the conversation UI
2. App sends SMS directly via Twilio (bypassing CloseBot)
3. Logs to SQLite with `source: "manual"` flag
---
## 3. DATABASE SCHEMA
```sql
-- Routes: Twilio number → CloseBot bot mapping
CREATE TABLE routes (
id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(8)))),
twilio_number TEXT NOT NULL UNIQUE,
twilio_number_sid TEXT,
closebot_source_id TEXT NOT NULL,
closebot_bot_id TEXT,
bot_name TEXT,
greeting_message TEXT,
after_hours_reply TEXT,
business_hours_json TEXT, -- {"mon": {"start": "09:00", "end": "17:00"}, ...}
max_concurrent INTEGER DEFAULT 50,
active BOOLEAN DEFAULT TRUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Contacts: phone numbers we've interacted with
CREATE TABLE contacts (
id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(8)))),
phone TEXT NOT NULL UNIQUE,
name TEXT,
email TEXT,
status TEXT DEFAULT 'new', -- new, active, qualified, booked, closed, cold
closebot_lead_id TEXT,
assigned_bot_id TEXT,
assigned_route_id TEXT REFERENCES routes(id),
tags TEXT, -- JSON array
fields_json TEXT, -- collected fields from CloseBot
first_contact DATETIME DEFAULT CURRENT_TIMESTAMP,
last_contact DATETIME DEFAULT CURRENT_TIMESTAMP,
message_count INTEGER DEFAULT 0
);
-- Messages: every SMS in/out
CREATE TABLE messages (
id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(8)))),
contact_id TEXT REFERENCES contacts(id),
route_id TEXT REFERENCES routes(id),
direction TEXT NOT NULL, -- 'inbound' | 'outbound'
source TEXT NOT NULL, -- 'customer' | 'bot' | 'manual'
body TEXT NOT NULL,
twilio_sid TEXT,
twilio_status TEXT, -- queued, sent, delivered, failed, undelivered
closebot_message_id TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Settings: app-wide config
CREATE TABLE settings (
key TEXT PRIMARY KEY,
value TEXT NOT NULL,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Events: activity log for dashboard feed
CREATE TABLE events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT NOT NULL, -- 'message_in', 'message_out', 'booking', 'new_lead', 'status_change'
contact_id TEXT REFERENCES contacts(id),
route_id TEXT REFERENCES routes(id),
data_json TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
```
---
## 4. API ROUTES
### Webhook Endpoints (public, Twilio/CloseBot call these)
| Route | Method | Purpose |
|---|---|---|
| `/api/webhooks/twilio/inbound` | POST | Receive inbound SMS from Twilio |
| `/api/webhooks/twilio/status` | POST | Receive delivery status updates |
| `/api/webhooks/closebot/response` | POST | Receive CloseBot bot responses |
### Internal API (authenticated, frontend calls these)
| Route | Method | Purpose |
|---|---|---|
| `/api/dashboard/stats` | GET | Active convos, messages today, bookings, response rate |
| `/api/dashboard/activity` | GET | Recent activity feed (SSE endpoint) |
| `/api/conversations` | GET | List conversations with pagination/filters |
| `/api/conversations/[contactId]` | GET | Get single conversation with messages |
| `/api/conversations/[contactId]/send` | POST | Send manual SMS message |
| `/api/bots` | GET | List CloseBot bots (proxied from CloseBot API) |
| `/api/bots/[id]` | GET | Get bot details + metrics |
| `/api/contacts` | GET | List/search contacts with filters |
| `/api/contacts/[id]` | GET/PUT/DELETE | Contact CRUD |
| `/api/contacts/export` | GET | Export CSV |
| `/api/analytics/overview` | GET | Summary metrics with date range |
| `/api/analytics/messages` | GET | Message volume time series |
| `/api/analytics/bots` | GET | Per-bot conversation counts |
| `/api/analytics/outcomes` | GET | Outcome distribution |
| `/api/analytics/leaderboard` | GET | Top performing bots |
| `/api/routes` | GET/POST | List routes, create new route |
| `/api/routes/[id]` | GET/PUT/DELETE | Route CRUD |
| `/api/settings` | GET/PUT | App settings (Twilio creds, CloseBot key) |
| `/api/settings/test-connection` | POST | Test Twilio + CloseBot connections |
---
## 5. PAGE-BY-PAGE UI SPEC
### 5A. DASHBOARD (`/`)
**Matches mockup: closebot-sms-dashboard.png**
**Layout:**
- Left sidebar (240px): Logo "CloseBot SMS" + 6 nav items with icons
- Top bar: Global search input
- Main content area
**Components:**
1. **Stat Cards Row** — 4 cards in a grid
- Active Conversations (chat bubble icon, count from DB)
- Messages Today (envelope icon, count from DB where date = today)
- Bookings Made (calendar icon, from CloseBot metrics API)
- Response Rate (trending icon, calculated: bot_responses / inbound_messages * 100)
- Each card: dark glass-morphism background (`bg-slate-800/50 backdrop-blur`), cyan border glow, icon top-left, label + big number
2. **Real-time Activity Table**
- Columns: SMS (phone number), Bot Name, Badges (status pill), Timestamp
- Status pills: `active` (green), `pending` (yellow), `closed` (gray)
- Auto-updates via SSE — new rows slide in at top
- Click row → navigate to conversation
**Data sources:**
- Stats: `GET /api/dashboard/stats` → queries SQLite counts
- Activity: `GET /api/dashboard/activity` → SSE stream from events table
---
### 5B. CONVERSATIONS (`/conversations`)
**Matches mockup: closebot-sms-conversations.png**
**Layout:** Two-panel split (left 380px list, right flexible chat)
**Left Panel — Conversation List:**
- Search bar with filter icon + settings icon
- "All Filters" dropdown (by status, bot, date range)
- Conversation rows: avatar (generated from initials), name, phone, last message preview (truncated), timestamp, unread badge (cyan circle with count)
- Selected conversation highlighted with left cyan border
- Sorted by most recent message
**Right Panel — Chat Thread:**
- Header: avatar, name, phone number, "CloseBot SMS AI" badge, status dot + "Active" label
- Message bubbles:
- Inbound (customer): dark gray background (`bg-slate-700`), left-aligned with avatar
- Outbound (bot): cyan/blue gradient background, right-aligned
- Each bubble shows text, no timestamps on individual messages (clean look)
- Bottom: text input "Type a message..." with cyan send button
- Sending from here = manual override, bypasses CloseBot
**Data sources:**
- List: `GET /api/conversations?search=&status=&bot=&page=`
- Messages: `GET /api/conversations/[contactId]`
- Send: `POST /api/conversations/[contactId]/send`
- Live updates: SSE for new messages appended to thread
---
### 5C. BOTS (`/bots`)
**Matches mockup: closebot-sms-bots.png**
**Layout:** Grid of bot cards (3 columns on desktop)
**Top Bar:**
- "Bot Management" heading
- Search bots input + filter icon + sort icon
- "+ Create New Bot" button (cyan, calls CloseBot create_bot_with_ai)
**Bot Cards:**
- Card header: bot name in bold, gradient top border (different colors per bot)
- Fields: Status toggle (Active/Inactive), Twilio # (from route mapping), Messages count, Conversion % (from CloseBot metrics), Last Active
- Inactive bots appear dimmed/grayed
- Click expand chevron → expanded card shows:
- Connected Sources list
- Recent Performance sparkline (mini chart, last 7 days)
- "Edit Flow" button (opens CloseBot dashboard in new tab)
**Data sources:**
- Bots list: `GET /api/bots` → proxies CloseBot `GET /bot` + merges route data from SQLite
- Metrics: CloseBot `GET /botMetric/agencySummary`
- Toggle active: `PUT /api/routes/[id]` to enable/disable route
---
### 5D. CONTACTS (`/contacts`)
**Matches mockup: closebot-sms-contacts.png**
**Layout:** Full-width data table with optional slide-out detail panel
**Top Bar:**
- Search input
- Filter dropdowns: "Filter by Status" (hot/warm/cold/new), "Filter by Bot", date range picker
- "Import Contacts" button (cyan outline) + "Export CSV" button (cyan outline)
**Table Columns:**
- Name (bold)
- Phone Number
- Assigned Bot
- Status (colored dot: red=Hot Lead, orange=Warm, gray=Cold + text label)
- Messages Exchanged (number)
- Last Contact (relative time: "2 hours ago", "Yesterday")
- Tags (colored pills)
**Slide-out Detail Panel (on row click):**
- Contact name (large, bold)
- Phone, Email, Company fields
- "Conversation Summary" section — AI-generated from CloseBot
- Bullet points: "Product Interest", "Budget Discussion", etc.
- "Field Values Collected" — mini table of CloseBot-collected fields (Company Size, Industry, Priority)
- Action buttons: "View Full History" + "Send Message" (cyan)
**Data sources:**
- Table: `GET /api/contacts?search=&status=&bot=&dateFrom=&dateTo=&page=&limit=`
- Detail: `GET /api/contacts/[id]`
- Export: `GET /api/contacts/export` → CSV download
- Import: `POST /api/contacts/import` (CSV upload, creates contacts + optionally sends first message)
---
### 5E. ANALYTICS (`/analytics`)
**Matches mockup: closebot-sms-analytics.png**
**Layout:** Scrollable dashboard with multiple chart sections
**Top Bar:**
- "Analytics" heading
- Tab navigation: Dashboard, Conversations, Bots, Contacts, Settings
- Date range picker dropdown (top right): "Last 30 Days (Oct 1 - Oct 30, 2024)"
**Section 1 — Stat Cards (4 across):**
- Total Conversations (large number + sparkline + % change vs last period)
- Booking Rate (percentage + sparkline + change)
- Avg Response Time (duration format "1m 45s" + sparkline + change)
- Customer Satisfaction (rating "4.8/5" + sparkline + change)
- Each card has colored gradient background (red→pink, green, blue, purple)
**Section 2 — Messages Over Time (full width):**
- Line chart with dual lines: Inbound (blue) vs Outbound (green)
- X-axis: dates over selected range
- Y-axis: message count
- Tooltip on hover showing exact values
- Chart library: Recharts (React-native, works with Next.js)
**Section 3 — Two charts side by side:**
- Left: "Conversations by Bot" — horizontal bar chart with colored bars per bot
- Right: "Outcome Distribution" — donut chart with segments (Booked 40%, Qualified 30%, Dropped 18%, Pending 12%), total in center
**Section 4 — Top Performing Bots:**
- Mini leaderboard table: Rank, Bot Name (with icon), Conversations, Booking Rate, CSAT Score
- Sorted by booking rate descending
**Data sources:**
- Stats: `GET /api/analytics/overview?start=&end=`
- Messages chart: `GET /api/analytics/messages?start=&end=&resolution=daily`
- By bot: `GET /api/analytics/bots?start=&end=`
- Outcomes: `GET /api/analytics/outcomes?start=&end=`
- Leaderboard: `GET /api/analytics/leaderboard?start=&end=`
- All backed by SQLite queries (message counts, conversation outcomes) + CloseBot metrics API for bookings/CSAT
---
### 5F. ROUTING (`/routing`)
**Matches mockup: closebot-sms-routing.png**
**Layout:** Three-column visual routing display
**Top Bar:**
- Breadcrumb: "Routing / Phone Number Routing"
- Top nav tabs: Dashboard, Routing, Bots, Analytics, Settings
- "+ Add New Route" button (top right)
- Search bar + filter icon
**Three Columns:**
- **Left: Twilio Phone Numbers** — list of phone number cards with phone icon
- **Center: Routing** — animated connection lines (CSS/SVG) linking numbers to bots
- **Right: CloseBot Bots & Sources** — bot cards with: name, source badge (WEB_LEAD, EMAIL_INQUIRY, etc.), Active/Paused toggle, message count badge, "Configure" button
**Expanded Route Configuration (on Configure click):**
- Modal/drawer overlaying the route:
- Greeting Message Override (textarea, optional)
- After-Hours Auto-Reply Text (textarea)
- Business Hours Schedule — day-of-week toggle grid (Mon-Sun), time range "Mon-Fri: 9:00 AM - 5:00 PM", "Add Exception" link
- Max Concurrent Conversations — slider (1-100) with current value displayed
- Save + Close Configuration buttons
**Data sources:**
- Routes: `GET /api/routes` → SQLite routes table
- Twilio numbers: fetched from Twilio API on settings save, cached
- Bots: `GET /api/bots` → CloseBot API
- Update: `PUT /api/routes/[id]` with config JSON
---
### 5G. SETTINGS (`/settings`)
**Matches mockup: closebot-sms-settings.png**
**Layout:** Two-column card layout
**Cards:**
1. **Twilio Connection** — Account SID input (masked), Auth Token input (masked), "Connection Status" indicator (green dot + "Connected")
2. **CloseBot Connection** — API Key input (masked), Webhook Source ID (display), "Connection Status" indicator
3. **Phone Numbers** — list of Twilio numbers with assigned bot + toggle switch
4. **Notifications** — toggles: Email Alerts, SMS Delivery Failures, New Lead Alerts
5. **Webhook URLs** — read-only display of:
- Inbound URL (the URL you give to Twilio)
- Response URL (the URL you give to CloseBot Webhook Source)
- Copy buttons next to each
**Data sources:**
- Settings: `GET/PUT /api/settings`
- Test: `POST /api/settings/test-connection` → pings both APIs
---
## 6. FILE STRUCTURE
```
closebot-sms/
├── package.json
├── next.config.js
├── tailwind.config.ts
├── tsconfig.json
├── .env.local.example
├── BUILD_PLAN.md
├── README.md
├── prisma/ (or drizzle/)
│ └── schema.sql
├── src/
│ ├── app/
│ │ ├── layout.tsx # Root layout with sidebar
│ │ ├── page.tsx # Dashboard
│ │ ├── conversations/
│ │ │ └── page.tsx # Conversations split view
│ │ ├── bots/
│ │ │ └── page.tsx # Bot grid
│ │ ├── contacts/
│ │ │ └── page.tsx # Contacts table
│ │ ├── analytics/
│ │ │ └── page.tsx # Analytics dashboard
│ │ ├── routing/
│ │ │ └── page.tsx # Phone number routing
│ │ ├── settings/
│ │ │ └── page.tsx # Settings/config
│ │ └── api/
│ │ ├── webhooks/
│ │ │ ├── twilio/
│ │ │ │ ├── inbound/route.ts
│ │ │ │ └── status/route.ts
│ │ │ └── closebot/
│ │ │ └── response/route.ts
│ │ ├── dashboard/
│ │ │ ├── stats/route.ts
│ │ │ └── activity/route.ts # SSE
│ │ ├── conversations/
│ │ │ ├── route.ts
│ │ │ └── [contactId]/
│ │ │ ├── route.ts
│ │ │ └── send/route.ts
│ │ ├── bots/
│ │ │ ├── route.ts
│ │ │ └── [id]/route.ts
│ │ ├── contacts/
│ │ │ ├── route.ts
│ │ │ ├── export/route.ts
│ │ │ └── [id]/route.ts
│ │ ├── analytics/
│ │ │ ├── overview/route.ts
│ │ │ ├── messages/route.ts
│ │ │ ├── bots/route.ts
│ │ │ ├── outcomes/route.ts
│ │ │ └── leaderboard/route.ts
│ │ ├── routes/
│ │ │ ├── route.ts
│ │ │ └── [id]/route.ts
│ │ └── settings/
│ │ ├── route.ts
│ │ └── test-connection/route.ts
│ ├── components/
│ │ ├── layout/
│ │ │ ├── sidebar.tsx
│ │ │ ├── topbar.tsx
│ │ │ └── nav-item.tsx
│ │ ├── dashboard/
│ │ │ ├── stat-card.tsx
│ │ │ └── activity-feed.tsx
│ │ ├── conversations/
│ │ │ ├── conversation-list.tsx
│ │ │ ├── conversation-item.tsx
│ │ │ ├── chat-thread.tsx
│ │ │ ├── message-bubble.tsx
│ │ │ └── chat-input.tsx
│ │ ├── bots/
│ │ │ ├── bot-grid.tsx
│ │ │ └── bot-card.tsx
│ │ ├── contacts/
│ │ │ ├── contacts-table.tsx
│ │ │ ├── contact-detail-panel.tsx
│ │ │ └── contact-filters.tsx
│ │ ├── analytics/
│ │ │ ├── stat-card-sparkline.tsx
│ │ │ ├── messages-chart.tsx
│ │ │ ├── bots-bar-chart.tsx
│ │ │ ├── outcome-donut.tsx
│ │ │ └── bot-leaderboard.tsx
│ │ ├── routing/
│ │ │ ├── routing-view.tsx
│ │ │ ├── phone-number-card.tsx
│ │ │ ├── bot-route-card.tsx
│ │ │ ├── connection-lines.tsx # SVG animated lines
│ │ │ └── route-config-modal.tsx
│ │ └── settings/
│ │ ├── twilio-card.tsx
│ │ ├── closebot-card.tsx
│ │ ├── phone-numbers-card.tsx
│ │ ├── notifications-card.tsx
│ │ └── webhook-urls-card.tsx
│ ├── lib/
│ │ ├── db.ts # SQLite connection + queries
│ │ ├── twilio.ts # Twilio client wrapper
│ │ ├── closebot.ts # CloseBot API client (reuse from MCP server)
│ │ ├── sse.ts # SSE broadcast utility
│ │ └── utils.ts # Formatters, helpers
│ └── styles/
│ └── globals.css # Tailwind base + custom dark theme
```
---
## 7. DESIGN SYSTEM
**Colors (from mockups):**
```css
--bg-primary: #0f1729; /* deepest navy */
--bg-secondary: #1a2332; /* card backgrounds */
--bg-tertiary: #1e293b; /* elevated surfaces */
--bg-hover: #2d3748; /* table row hover */
--text-primary: #e2e8f0; /* main text */
--text-secondary: #94a3b8; /* muted text */
--text-muted: #64748b; /* timestamps, labels */
--accent-cyan: #22d3ee; /* primary accent */
--accent-blue: #3b82f6; /* secondary accent */
--accent-green: #22c55e; /* success, active */
--accent-yellow: #eab308; /* warning, pending */
--accent-red: #ef4444; /* error, hot lead */
--accent-orange: #f97316; /* warm */
--accent-purple: #a855f7; /* bot cards */
--border: #334155; /* subtle borders */
--border-glow: rgba(34, 211, 238, 0.2); /* cyan card glow */
```
**Typography:**
- Font: `Inter` (system-ui fallback)
- Headings: 600-700 weight
- Body: 400 weight
- Monospace numbers: `font-variant-numeric: tabular-nums`
**Card Style:**
```css
.card {
background: rgba(30, 41, 59, 0.5);
backdrop-filter: blur(12px);
border: 1px solid rgba(51, 65, 85, 0.5);
border-radius: 12px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3);
}
```
**Status Badges:**
- Active: `bg-green-500/20 text-green-400 border-green-500/30`
- Pending: `bg-yellow-500/20 text-yellow-400 border-yellow-500/30`
- Closed: `bg-gray-500/20 text-gray-400 border-gray-500/30`
---
## 8. BUILD PHASES
### Phase 1 — Foundation (Day 1)
- [ ] Next.js project scaffold with Tailwind + shadcn/ui
- [ ] SQLite schema + db.ts with all queries
- [ ] Global layout with sidebar navigation (matches dashboard mockup)
- [ ] Dark theme CSS variables
- [ ] Environment config (.env.local)
- [ ] Twilio client wrapper
- [ ] CloseBot API client (port from closebot-mcp)
### Phase 2 — Core Webhook Bridge (Day 1-2)
- [ ] `POST /api/webhooks/twilio/inbound` — receive SMS, forward to CloseBot
- [ ] `POST /api/webhooks/closebot/response` — receive bot reply, send via Twilio
- [ ] `POST /api/webhooks/twilio/status` — delivery status updates
- [ ] Contact auto-creation on first inbound
- [ ] Message logging to SQLite
- [ ] Route lookup logic (Twilio number → CloseBot source)
- [ ] Business hours check + after-hours auto-reply
- [ ] State passthrough (phone + route info in CloseBot state field)
### Phase 3 — Dashboard + Real-time (Day 2)
- [ ] Dashboard page with 4 stat cards
- [ ] Real-time activity feed (SSE)
- [ ] Activity table with status badges
- [ ] Auto-refresh stats
### Phase 4 — Conversations (Day 2-3)
- [ ] Conversation list with search/filter
- [ ] Chat thread with message bubbles
- [ ] Manual message send
- [ ] Unread badges
- [ ] Live message updates via SSE
### Phase 5 — Bots + Contacts (Day 3)
- [ ] Bot grid with cards from CloseBot API
- [ ] Bot status toggle (enable/disable route)
- [ ] Contacts table with all filters
- [ ] Slide-out detail panel
- [ ] CSV export
### Phase 6 — Analytics (Day 3-4)
- [ ] Stat cards with sparklines
- [ ] Messages over time chart (Recharts)
- [ ] Conversations by bot bar chart
- [ ] Outcome distribution donut chart
- [ ] Bot leaderboard table
- [ ] Date range picker
### Phase 7 — Routing + Settings (Day 4)
- [ ] Phone number routing view with visual connections
- [ ] Route config modal (business hours, greeting, max concurrent)
- [ ] Settings page with credential cards
- [ ] Connection testing
- [ ] Webhook URL display with copy
### Phase 8 — Polish (Day 4-5)
- [ ] Loading states + skeletons
- [ ] Error handling + toast notifications
- [ ] Mobile responsive adjustments
- [ ] Auth gate (simple login)
- [ ] README with deploy instructions
---
## 9. EXTERNAL DEPENDENCIES
### npm packages:
```json
{
"dependencies": {
"next": "^14.2",
"react": "^18.3",
"twilio": "^5.0",
"better-sqlite3": "^11.0",
"recharts": "^2.12",
"lucide-react": "^0.400",
"@radix-ui/react-dialog": "^1.0",
"@radix-ui/react-dropdown-menu": "^2.0",
"@radix-ui/react-toggle": "^1.0",
"@radix-ui/react-slider": "^1.0",
"class-variance-authority": "^0.7",
"clsx": "^2.1",
"tailwind-merge": "^2.3",
"next-auth": "^4.24"
}
}
```
### Environment Variables:
```env
# Twilio
TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_AUTH_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# CloseBot
CLOSEBOT_API_KEY=cb_xxxxxxxxxxxxxxxx
# App
NEXTAUTH_SECRET=random-secret-here
NEXTAUTH_URL=https://your-domain.com
APP_URL=https://your-domain.com # Used to construct webhook URLs
# Database
DATABASE_PATH=./data/closebot-sms.db
```
---
## 10. WHAT MAKES THIS DIFFERENT
1. **No GHL required** — CloseBot's Webhook Source is the channel, Twilio is the pipe
2. **Multi-tenant ready** — one app, many Twilio numbers, many bots
3. **Human takeover** — click into any convo and type a manual reply
4. **Business hours built-in** — auto-reply after hours, resume bot in morning
5. **Full audit trail** — every message logged with direction, source, status
6. **Real-time everything** — SSE for live dashboard, no polling
7. **CloseBot metrics integrated** — booking rates, leaderboards, CSAT from their API
8. **$0.0079/SMS** — Twilio pricing, no GHL middleman markup
---
*Plan version: 1.0 | Last updated: 2026-02-06*