CRM Setup Walkthrough

Use this page with Spencer to configure everything end-to-end, then remove it later if desired.

Back to CRM

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 VarRequiredWhere to get itUse
NEXT_PUBLIC_SUPABASE_URLYesSupabase project settingsProject URL
NEXT_PUBLIC_SUPABASE_ANON_KEYYesSupabase API keysAnon/public key
SUPABASE_SERVICE_ROLE_KEYYesSupabase API keysService role key (server only)
FATHOM_API_KEYYesFathom account/API settingsTranscript pull auth
TELEGRAM_BOT_TOKENYes@BotFatherBot token for approvals and alerts
TELEGRAM_CHAT_IDYesTelegram group/supergroupDestination chat id
TELEGRAM_TOPIC_IDYesTelegram forum topicApprovals topic thread id
TODOIST_API_TOKENYesTodoist integrationsCreate tasks for approved items
OPENAI_API_KEYYesOpenAI dashboardUrgency/classification model
GOOGLE_CLIENT_IDYesGoogle Cloud OAuth clientGmail/Calendar access
GOOGLE_CLIENT_SECRETYesGoogle Cloud OAuth clientGmail/Calendar access
OPENCLAW_BASE_URLOptionalOpenClaw local/server configOnly if using OpenClaw API calls
OPENCLAW_API_KEYOptionalOpenClaw account/API keyNeeded if OpenClaw requires token auth
OPENCLAW_EMAILOptionalOpenClaw loginIf your OpenClaw instance uses session login
OPENCLAW_PASSWORDOptionalOpenClaw loginIf 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