Skip to content

kwickphone/chess-club-receptionist

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Chess Club Receptionist — built on KwickPhone

An AI phone receptionist for a local club organizer who can't catch every call about Friday Knights. The AI answers the line; this app turns each call into an RSVP roster, a questions queue, and lessons/membership leads — then sends the organizer a nightly digest over email and Slack. Built on the KwickPhone API.

Deploy to Render

One-click deploy the webhook receiver + dashboard. Render prompts for KP_API_KEY and KP_WEBHOOK_SECRET (and the optional ANTHROPIC_API_KEY / SMTP / Slack vars); then point your number's webhook_url at https://<your-service>.onrender.com/webhooks/kp.

An intermediate companion to the basic ai-front-desk-demo: that one displays calls; this one acts on them — verify webhook → extract structured data from the transcriptpersist → drive a real workflow + digest.

Next (advanced): ai-booking-line adds payments — a Stripe deposit pay-link per booking, reconciled by webhook.

Heads up — real money. Provisioning a number is $5/mo and live AI talk time is billed per minute. Use the free test numbers / starter credits while you build. See pricing.

What it does

  • Receives call.completed webhooks (signature-verified), fetches the transcript, and extracts {intent, name, headcount, question, note} — intents: rsvp / question / lesson / membership / other.
  • Persists to a roster, a questions queue, and a leads list (a tiny JSON store — swap for a DB in prod).
  • A dashboard (/) shows the roster, open questions (with a one-click "mark answered"), leads, and recent calls with recording links.
  • npm run digest emails + Slacks the organizer a summary — wire it to cron for nightly sends.

Pluggable extractor

  • Default (no extra keys): a built-in keyword heuristic — clone-and-run, zero cost.
  • With ANTHROPIC_API_KEY set: Claude extracts the fields with structured outputs (guaranteed-valid JSON via the official @anthropic-ai/sdk), far more accurate on messy transcripts. Falls back to the heuristic on any error. Model is configurable (CLAUDE_MODEL, default claude-opus-4-8; claude-haiku-4-5 is cheaper for this task).

Quickstart

git clone https://github.com/kwickphone/chess-club-receptionist
cd chess-club-receptionist && npm install
cp .env.example .env        # add KP_API_KEY (https://kwickphone.com/app/developer)
  1. Fund your API balance at https://kwickphone.com/app/billing (provisioning needs ≥ $5).
  2. Expose a public URL for webhooks (local dev: ngrok http 3000).
  3. Provision a number pointed at your webhook (any KwickPhone client; e.g. the basic demo's provision.js), and copy the printed webhook_secret into .env as KP_WEBHOOK_SECRET.
  4. npm start → open http://localhost:3000. Call the number; RSVPs and questions appear live.
  5. npm run digest → sends the organizer summary (configure SMTP and/or SLACK_WEBHOOK_URL).

Project layout

server.js       webhook → transcript → extract → store; dashboard; recording proxy
digest.js       nightly email + Slack summary (cron-friendly)
lib/verify.js   webhook HMAC verification (+ replay guard)
lib/kp.js       KwickPhone client (transcript, recording) + transcript flattening
lib/extract.js  pluggable extractor (heuristic default; Claude w/ structured outputs when keyed)
lib/store.js    JSON-file repository (swap for SQLite/Postgres in prod)

Notes

  • Render free tier caveats (demo-fine, not prod): the filesystem is ephemeral, so the JSON data.json store resets on each deploy/restart (swap lib/store.js for a database to persist); and free web services sleep when idle, so the first webhook after a quiet spell hits a cold start. The digest.js summary isn't a web process — run it on a schedule (Render Cron Job, or any scheduler) with node digest.js.
  • Inbound-only by design. The KwickPhone /v1 API gives you call data; this app reacts to it and uses your own channels (email/Slack) for outbound. The AI agent's on-call answers are configured on the KwickPhone side.
  • Never commit secrets.env and data.json are gitignored. The API key stays server-side.
  • Docs: https://kwickphone.com/integrations/api/reference/

MIT licensed.

About

Intermediate KwickPhone API example — an AI phone receptionist for a club: RSVP roster, questions queue, leads, and a nightly digest.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages