CRM Setup Walkthrough
Use this page with Spencer to configure everything end-to-end, then remove it later if desired.
Checklist Progress
0 / 8 completed
Integration Readiness
-
Checking...
Step-by-Step Setup
Setup Commands and Endpoints
1. Save meeting session when a Zoom call ends: POST /api/crm/meetings/sessions
2. Poll meetings ready for transcript checks: GET /api/crm/meetings/sessions?ready=1
3. Send transcript + extracted actions: POST /api/crm/ingest/fathom
4. Review queue in UI: /crm and approve/reject action items
5. Run completion check at 08:00, 12:00, 16:00: POST /api/crm/maintenance/daily-check
Software + Accounts to Collect First
1. Supabase owner access (project URL + anon key + service role key)
2. Fathom account with API access and Zoom integration enabled
3. Telegram bot token from BotFather + chat id + topic id(s)
4. Todoist account/API token for Spencer
5. Google Cloud OAuth client for Gmail/Calendar sync
6. OpenAI API key for classification/summary tasks
7. OpenClaw login details (if required by your OpenClaw runtime): base URL, API key or email/password
8. Mac Mini admin access (terminal + auto-start permissions)
Mac Mini Local Runtime (No Cloud)
Goal: run this CRM workflow 24/7 on Spencer's Mac Mini using local services and scheduled jobs.
Use this exactly as a runbook with Spencer during setup.
1. Install base software on Mac Mini
# Install Homebrew if needed /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # Install runtime + tooling brew install node pnpm git jq # Optional process manager utilities brew install watch
2. Clone repo and install dependencies
cd ~/Projects git clone <YOUR_REPO_URL> spencespacestation cd spencespacestation pnpm install
3. Create env file on Mac Mini
cp .env.example .env.local || touch .env.local open -a TextEdit .env.local
Add the keys below. Required keys: 11
| Env Var | Required | Where to get it | Use |
|---|---|---|---|
| NEXT_PUBLIC_SUPABASE_URL | Yes | Supabase project settings | Project URL |
| NEXT_PUBLIC_SUPABASE_ANON_KEY | Yes | Supabase API keys | Anon/public key |
| SUPABASE_SERVICE_ROLE_KEY | Yes | Supabase API keys | Service role key (server only) |
| FATHOM_API_KEY | Yes | Fathom account/API settings | Transcript pull auth |
| TELEGRAM_BOT_TOKEN | Yes | @BotFather | Bot token for approvals and alerts |
| TELEGRAM_CHAT_ID | Yes | Telegram group/supergroup | Destination chat id |
| TELEGRAM_TOPIC_ID | Yes | Telegram forum topic | Approvals topic thread id |
| TODOIST_API_TOKEN | Yes | Todoist integrations | Create tasks for approved items |
| OPENAI_API_KEY | Yes | OpenAI dashboard | Urgency/classification model |
| GOOGLE_CLIENT_ID | Yes | Google Cloud OAuth client | Gmail/Calendar access |
| GOOGLE_CLIENT_SECRET | Yes | Google Cloud OAuth client | Gmail/Calendar access |
| OPENCLAW_BASE_URL | Optional | OpenClaw local/server config | Only if using OpenClaw API calls |
| OPENCLAW_API_KEY | Optional | OpenClaw account/API key | Needed if OpenClaw requires token auth |
| OPENCLAW_EMAIL | Optional | OpenClaw login | If your OpenClaw instance uses session login |
| OPENCLAW_PASSWORD | Optional | OpenClaw login | If your OpenClaw instance uses session login |
4. Run app locally
pnpm dev # open http://localhost:3000/crm/setup
5. Keep worker alive on reboot (launchd)
Create two launch agents: one for Next app, one for CRM poll worker.
mkdir -p ~/Library/LaunchAgents # Save plist files there and load with: launchctl unload ~/Library/LaunchAgents/com.spence.crm.web.plist 2>/dev/null || true launchctl unload ~/Library/LaunchAgents/com.spence.crm.worker.plist 2>/dev/null || true launchctl load ~/Library/LaunchAgents/com.spence.crm.web.plist launchctl load ~/Library/LaunchAgents/com.spence.crm.worker.plist
6. Verify end-to-end pipeline
Finish a Zoom/Fathom meeting, register session, ingest transcript, approve item, confirm task created.
curl -X POST http://localhost:3000/api/crm/meetings/sessions \
-H "Content-Type: application/json" \
-d '{"meetingExternalId":"zoom-123","endedAt":"2026-04-23T19:20:00Z","title":"Carrier call"}'
curl "http://localhost:3000/api/crm/meetings/sessions?ready=1"Spencer Call Flow Recommendation
Since Spencer uses a single personal Zoom link, keep every call recorded with Fathom and include a unique external meeting id when posting to sessions. This avoids duplicate ingestion and keeps transcript polling reliable.
Open Fathom setup guide