AI-powered answering and orchestration service for Chicago Furnished Condos. Sona, your virtual concierge, handles inbound/outbound calls and SMS with intelligent routing, business rule enforcement, and 24/7 availability.
ChittyReception provides:
- 🤖 Sona AI Concierge - Conversational AI with personality and business rules
- 📞 OpenPhone Integration - Call and SMS handling with secure webhooks
- ✅ Booking Validation - 32+ day minimum, month boundaries, advance notice
- 💰 Dynamic Pricing - Automatic discounts and quote generation
- 🔐 ChittyAuth Integration - Token-based authentication
- 💾 Database Persistence - Neon PostgreSQL for calls, messages, conversations
- 🚨 Emergency Routing - Immediate transfer for critical issues
- 🔧 MCP Server - Claude Code integration for development
- 📊 Analytics - Full audit trail and conversation tracking
npm installCopy .env.example to .env and configure:
cp .env.example .envRequired variables:
OPENPHONE_API_KEY- Your OpenPhone API keyOPENPHONE_WEBHOOK_SECRET- Webhook signing secretNEON_DATABASE_URL- Shared ChittyOS databaseJWT_SECRET- Token signing secret
Run the migration to create tables:
psql "$NEON_DATABASE_URL" < migration.sqlThis creates:
reception_calls- Call recordsreception_messages- SMS recordsidentity_phones- Phone to ChittyID mappingreception_sessions- AI conversation state
wrangler secret put OPENPHONE_API_KEY
wrangler secret put OPENPHONE_WEBHOOK_SECRET
wrangler secret put NEON_DATABASE_URL
wrangler secret put JWT_SECRET
wrangler secret put ENCRYPTION_KEY
wrangler secret put CHITTY_ID_SERVICE_TOKEN
wrangler secret put CHITTY_AUTH_SERVICE_TOKEN
wrangler secret put CHITTY_CONNECT_SERVICE_TOKENwrangler kv:namespace create RECEPTION_KV
wrangler kv:namespace create RECEPTION_KV --preview
# Update wrangler.toml with the namespace IDsnpm run devService will be available at http://localhost:8787
# Deploy to staging
npm run deploy:staging
# Deploy to production
npm run deploy:production- Log in to OpenPhone dashboard
- Go to Settings > API & Integrations
- Generate new API key
- Save securely - shown only once
Set webhook URL to your deployed service:
https://reception.chitty.cc/webhooks/openphone
Subscribe to events:
call.initiated- Incoming call startedcall.completed- Call endedmessage.created- SMS receivedvoicemail.created- Voicemail left
OpenPhone provides a webhook signing secret for verification. Add it to secrets.
GET /api/v1/healthPOST /api/v1/send-message
Content-Type: application/json
Authorization: Bearer {token}
{
"from": "+15551234567",
"to": ["+15559876543"],
"content": "Your message here"
}POST /api/v1/make-call
Content-Type: application/json
Authorization: Bearer {token}
{
"from": "+15551234567",
"to": "+15559876543"
}POST /webhooks/openphone
X-OpenPhone-Signature: {hmac_signature}
{
"id": "evt_xxx",
"type": "message.created",
"data": { ... }
}Incoming Call/SMS
↓
OpenPhone Webhook → ChittyReception
↓
Verify Signature
↓
Store in KV (24h TTL)
↓
AI Orchestration Engine
↓
Route to Handler / Auto-respond
↓
Update State in Durable Object
Uses Cloudflare Durable Objects for persistent call state:
- Active call tracking
- Context preservation across webhook events
- Session data for AI agents
- KV Namespace - Temporary storage (24h) for calls/messages
- Durable Objects - Active call state management
- Neon Database - Permanent records and case linkage
npm test # All tests
npm run test:unit # Unit tests only
npm run test:watch # Watch modenpm run typechecknpm run tail # Stream live logsTo migrate from OpenPhone to Twilio:
-
Set Twilio secrets
wrangler secret put TWILIO_ACCOUNT_SID wrangler secret put TWILIO_AUTH_TOKEN
-
Create Twilio client (similar to OpenPhone client)
-
Update webhook handlers for Twilio format
-
Configure TwiML for call flows
-
Update wrangler.toml environment variables
- ChittyID - Generate identities for callers
- ChittyAuth - Token validation for API calls
- ChittyConnect - Link calls to cases and contacts
- ChittyRegistry - Service discovery and registration
All API endpoints (except webhooks) require ChittyAuth tokens:
Authorization: Bearer {token}
Webhooks use signature verification instead.
ChittyReception includes an MCP server for Claude Code integration:
# Add to Claude Desktop config
{
"mcpServers": {
"chittyreception": {
"command": "node",
"args": ["path/to/chittyreception/mcp-server.js"]
}
}
}Available tools:
send_sms- Send SMS messagesmake_call- Make outbound callsget_call_history- Retrieve call recordsget_message_history- Retrieve message records
- Check OpenPhone webhook configuration
- Verify webhook URL is publicly accessible
- Check Cloudflare Worker logs:
npm run tail - Ensure
OPENPHONE_WEBHOOK_SECRETmatches OpenPhone dashboard
- Verify token is valid and not expired
- Check
JWT_SECRETmatches ChittyAuth - Ensure token has required scopes
- Check
Authorizationheader format
- Verify KV namespace is bound correctly in wrangler.toml
- Check KV namespace exists:
wrangler kv:namespace list - View KV contents:
wrangler kv:key list --namespace-id={id}
- Good for testing and low volume
- Higher per-message/minute costs at scale
- Lower per-unit costs
- Better bulk pricing
- More features (TwiML, Programmable Voice)
- Wider geographic coverage
Recommended migration threshold: 1000+ messages/month
Follow ChittyOS development guidelines in root CLAUDE.md.
Proprietary - ChittyOS Platform