AI CFO for Google Sheets — by Crunchy Numbers
The financial analyst that lives in your spreadsheet. Understands workbook structure, thinks like a CFO, and applies professional formatting standards.
┌─────────────────────────────────────────────────────────┐
│ Google Sheets │
│ ┌───────────────────────┐ ┌────────────────────────┐ │
│ │ Sidebar (HTML/JS) │ │ Apps Script (.gs) │ │
│ │ - Chat interface │──│ - Menu triggers │ │
│ │ - Skill selector │ │ - WorkbookState │ │
│ │ - Action confirmations│ │ - OAuth tokens │ │
│ └───────────────────────┘ └─────────┬──────────────┘ │
└───────────────────────────────────────┼─────────────────┘
│ HTTPS + Bearer token
▼
┌───────────────────────────────────────────────────────────┐
│ Cloud Functions (GCP) │
│ ┌──────────┐ ┌──────────────┐ ┌─────────────────────┐ │
│ │ /analyze │ │ skill-router │ │ /auth │ │
│ │ │──│ → 10 skills │ │ Google token verify │ │
│ └────┬─────┘ └──────────────┘ └──────────┬──────────┘ │
│ │ │ │
│ ▼ ▼ │
│ Claude API (Anthropic) Supabase (Postgres) │
│ - Sonnet 4.5 (fast) - users │
│ - Opus 4.6 (deep) - sessions │
│ - usage │
└───────────────────────────────────────────────────────────┘
Core Approach: RLM (Runtime Language Model)
- Serialize the entire workbook as a state string (cells, formulas, formatting, named ranges)
- Send it once per interaction — no RAG, no chunking, no repeated lookups
- Claude reasons over the full structure in context
crunchy-sheets/
├── apps-script/ # Google Apps Script add-on
│ ├── Code.gs # Menu, sidebar, backend communication
│ ├── Sidebar.html # Chat UI with skill selector
│ ├── WorkbookState.gs # Workbook state serialization (RLM)
│ ├── OAuth.gs # OAuth flow handlers
│ ├── Skills.gs # 10 financial skills registry
│ └── appsscript.json # Manifest with OAuth scopes
├── cloud-functions/ # GCP Cloud Functions backend
│ ├── package.json
│ ├── tsconfig.json
│ └── src/
│ ├── index.ts # HTTP function entry points
│ ├── analyze.ts # Workbook analysis → Claude
│ ├── skill-router.ts # Routes prompts to financial skills
│ └── auth.ts # Google OAuth verification
├── supabase/
│ └── migrations/
│ └── 001_create_tables.sql
└── README.md
| # | Skill | Model | Description |
|---|---|---|---|
| 1 | Variance Analysis | Sonnet | Budget vs actual with variance explanations |
| 2 | Cash Flow Forecasting | Opus | 13-week / 12-month cash projections |
| 3 | Revenue Waterfall | Sonnet | MRR/ARR bridge (new → expansion → churn) |
| 4 | Expense Categorization | Sonnet | Auto-classify into COGS, OpEx, CapEx |
| 5 | Unit Economics | Opus | CAC, LTV, payback period calculations |
| 6 | Cohort Analysis | Opus | Monthly retention/revenue triangular matrix |
| 7 | Scenario Modeling | Opus | Base/Optimistic/Pessimistic with SWITCH() |
| 8 | KPI Dashboard | Sonnet | Summary dashboard with SPARKLINEs |
| 9 | Investor Metrics | Sonnet | Board-ready MRR, burn rate, Rule of 40 |
| 10 | Budget vs Actual | Sonnet | Side-by-side BvA with conditional formatting |
- Google Cloud SDK (
gcloud) - Node.js >= 20
- clasp for Apps Script deployment
- Access to GCP project
crunchy-sheets
cd cloud-functions
npm install
npm run build
# Deploy (requires gcloud auth)
npm run deployRun the migration against your Supabase project:
# Via Supabase Dashboard → SQL Editor, paste:
# supabase/migrations/001_create_tables.sql
# Or via CLI:
supabase db push --db-url "postgresql://postgres:[PASSWORD]@db.diselpdcsgjgetgmixhc.supabase.co:5432/postgres"# Install clasp globally
npm install -g @google/clasp
# Login to your Google account
clasp login
# Create a new Apps Script project bound to a Sheet (for testing)
clasp create --type sheets --title "Crunchy Sheets Dev"
# Push the code
cd apps-script
clasp push
# Open in browser to test
clasp open| Variable | Source |
|---|---|
ANTHROPIC_API_KEY |
~/.config/secrets/anthropic-crunchy-sheets-key |
SUPABASE_URL |
https://diselpdcsgjgetgmixhc.supabase.co |
SUPABASE_SERVICE_KEY |
~/.config/secrets/supabase-crunchy-sheets-service-key |
cd cloud-functions
npm run serve
# Functions framework runs on http://localhost:8080
# Test the analyze endpoint:
curl -X POST http://localhost:8080 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_GOOGLE_TOKEN" \
-d '{"workbookState": {}, "prompt": "What does this workbook do?"}'Financial analyst conventions (non-negotiable):
| Element | Font Color | Background | Example |
|---|---|---|---|
| Hard-coded inputs | Blue #082FFF |
— | Revenue growth rate: 15% |
| Key model drivers | Blue #082FFF |
Yellow #FFF2CC |
Discount rate, scenario toggle |
| Formulas (all) | Black #000000 |
— | =B2*(1+B3), =Assumptions!B5 |
| Tier | Price | Limits |
|---|---|---|
| Free | $0/mo | 3 analyses/month |
| Pro | $29/mo | Unlimited, all skills |
| Team | $79/mo | 5 workbooks, shared templates |
| Enterprise | Custom | Flowocity consulting bundle |
- Project ID:
crunchy-sheets - Project Number:
930082478249 - Region:
us-central1 - Supabase Ref:
diselpdcsgjgetgmixhc(us-west-2)
Proprietary — Crunchy Numbers / Flowocity