Open-source RevOps intelligence for product-led growth
Detect product usage signals, score accounts, and route high-intent leads to your CRM — all from your existing analytics data.
Beton Inspector connects to your product analytics (PostHog) and turns raw usage data into actionable revenue signals. Instead of guessing which accounts are ready to buy, expand, or churn, Beton detects concrete behavioral patterns — trial conversion intent, power user emergence, feature adoption velocity — and scores each account automatically.
The signals and scores flow into your CRM (Attio), giving your sales team a prioritized list of accounts with context on why they should reach out and when.
Key value: Your product data already contains the buying signals. Beton Inspector surfaces them without requiring data engineering or custom dashboards.
- 20+ Signal Detectors — Trial intent, power users, feature adoption, engagement drops, and more
- Account Scoring — Health, expansion potential, and churn risk on a 0–100 scale (concrete grades: M100, M75, M50, M25, M10)
- PostHog Integration — Reads events, persons, and group data from your PostHog data warehouse
- CRM Sync — Routes scored accounts and signals to Attio with full context
- Multi-tenant — Workspace-based isolation with Supabase Row Level Security
- Metered Billing — Optional Stripe integration for SaaS billing (can be disabled for self-hosting)
- Agent System — AI-powered data exploration that learns your schema and business model
- Node.js 18+
- PostgreSQL — via Supabase (recommended) or any PostgreSQL instance
- PostHog account with API access
# Clone the repo
git clone https://github.com/getbeton/inspector.git
cd inspector
# Install dependencies
npm install
# Copy environment template
cp .env.example .env.local
# Edit .env.local with your Supabase and PostHog credentials
# At minimum, set:
# NEXT_PUBLIC_SUPABASE_URL
# NEXT_PUBLIC_SUPABASE_ANON_KEY
# SUPABASE_SERVICE_ROLE_KEY
# ENCRYPTION_KEY (generate with: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")
# Start the dev server
npm run dev
# → http://localhost:3000For production deployments, see the deployment guide (coming soon).
When self-hosting, set DEPLOYMENT_MODE=self-hosted (or leave it unset). This disables all billing features, giving you unlimited access with no Stripe dependency.
| Component | Technology | Details |
|---|---|---|
| Application | Next.js (TypeScript) | Full-stack — pages + API routes |
| Database | PostgreSQL (Supabase) | RLS-secured, multi-tenant |
| Auth | Supabase OAuth (PKCE) | Session cookies, workspace context |
| State | Zustand + React Query | Client state + server cache |
All code lives in src/. There is no separate backend — business logic runs as Next.js API routes.
src/
├── app/
│ ├── (auth)/ # Login, OAuth callback
│ ├── (dashboard)/ # Protected pages (signals, identities, memory, settings)
│ └── api/ # ~40 API route handlers
├── components/
│ ├── ui/ # Base UI primitives (base-ui + CVA)
│ ├── layout/ # Sidebar, header, navigation
│ ├── signals/ # Signal-specific components
│ └── billing/ # Billing UI (optional)
└── lib/
├── heuristics/ # Signal detection & scoring engine
│ └── signals/detectors/ # 20+ signal detectors
├── integrations/ # PostHog, Attio, Stripe clients
├── supabase/ # Client helpers + auto-generated types
└── email/ # Notification emails (Resend)
npm run dev # Start dev server
npm run build # Production build (must pass before committing)
npm run lint # ESLint
npm run typecheck # TypeScript checkWe welcome contributions! Please see CONTRIBUTORS.md for guidelines on how to get started.
To report bugs or request features, open an issue.
Beton Inspector is licensed under the GNU Affero General Public License v3.0.
This means you can freely use, modify, and distribute the software, but any modifications must also be made available under the same license, including when running a modified version as a network service.
- GitHub Issues — Bug reports and feature requests
- GitHub Discussions — Questions and community support