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.
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 transcript → persist → 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.
- Receives
call.completedwebhooks (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 digestemails + Slacks the organizer a summary — wire it to cron for nightly sends.
- Default (no extra keys): a built-in keyword heuristic — clone-and-run, zero cost.
- With
ANTHROPIC_API_KEYset: 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, defaultclaude-opus-4-8;claude-haiku-4-5is cheaper for this task).
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)- Fund your API balance at https://kwickphone.com/app/billing (provisioning needs ≥ $5).
- Expose a public URL for webhooks (local dev:
ngrok http 3000). - Provision a number pointed at your webhook (any KwickPhone client; e.g. the
basic demo's
provision.js), and copy the printedwebhook_secretinto.envasKP_WEBHOOK_SECRET. npm start→ open http://localhost:3000. Call the number; RSVPs and questions appear live.npm run digest→ sends the organizer summary (configure SMTP and/orSLACK_WEBHOOK_URL).
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)
- Render free tier caveats (demo-fine, not prod): the filesystem is ephemeral, so the JSON
data.jsonstore resets on each deploy/restart (swaplib/store.jsfor a database to persist); and free web services sleep when idle, so the first webhook after a quiet spell hits a cold start. Thedigest.jssummary isn't a web process — run it on a schedule (Render Cron Job, or any scheduler) withnode digest.js. - Inbound-only by design. The KwickPhone
/v1API 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 —
.envanddata.jsonare gitignored. The API key stays server-side. - Docs: https://kwickphone.com/integrations/api/reference/
MIT licensed.