Note: the visuals in this demo recording have since been refreshed with sharper brand assets. The conversation flow is identical to what you'll get from a fresh clone.
What's inside
- View insurance plan details, deductible, and out-of-pocket max
- Track claim status across recent visits
- Find in-network doctors with rich location cards
- Book and manage appointments inside the conversation
- FAQ knowledge base for common coverage questions
A healthcare and insurance management chatbot that runs over RCS. Patients view their plan, track claims, find doctors, book appointments, and get answers about deductibles and out-of-pocket maxes — all from inside the messages app.
This guide walks you from a fresh clone to a working clinic demo in under 10 minutes.
What you'll build
- A Pinnacle RCS agent for patient self-service
- Insurance plan summary, claims tracker, and doctor finder
- Appointment booking with reminder confirmation flow
- Deductible and out-of-pocket max status with progress
- Doctor location and hours lookup
Prerequisites
- Node.js 18+
- A Pinnacle account — sign up. Add an RCS test agent for development
- An API key and a webhook signing secret
1. Clone and install
git clone https://github.com/pinnacle-samples/Summit-Health
cd Summit-Health
npm install2. Configure environment
cp .env.example .envPINNACLE_API_KEY=your_api_key_here
PINNACLE_AGENT_ID=your_agent_id_here
PINNACLE_SIGNING_SECRET=your_signing_secret_here
TEST_MODE=false
PORT=30003. Expose your webhook
ngrok http 30004. Connect the webhook
In the Webhooks dashboard:
- Add
https://<your-tunnel-domain>/webhook - Attach it to your RCS agent
- Copy the signing secret into
PINNACLE_SIGNING_SECRET
5. Run it
npm run devSend MENU or START to your agent. You'll see Summit Health's main menu with Insurance, Claims, Find a Doctor, Make Appointment, and Support buttons.
How the pieces fit together
Summit-Health/
├── server.ts # Express bootstrap
├── router.ts # /webhook POST — verifies + dispatches
├── lib/
│ ├── rcsClient.ts # PinnacleClient instance
│ ├── baseAgent.ts # Shared send + typing helpers
│ ├── typing.ts # Fire-and-forget typing indicator
│ ├── agent.ts # SummitHealthAgent — every action handler
│ ├── data.ts # Default patient, claims, FAQs, doctor locations
│ └── types.ts # Patient, Claim, Doctor types
Action handlers
| Action | What it does |
|---|---|
mainMenu / showMainMenu | Landing card with all entry points |
viewInsurance | Plan summary and coverage details |
viewClaims | Recent claims list |
claimDetails | Per-claim breakdown |
deductibleStatus | Deductible progress card |
oopMax | Out-of-pocket max progress card |
findDoctor / viewHours | Doctor lookup and location hours |
makeAppointment / bookTime | Appointment booking flow |
confirmReminder / declineReminder | Reminder opt-in step after booking |
showSupport | Support contact info |
Customize patient data
lib/data.ts exports a defaultPatient and seeded defaultClaims so the demo works out of the box. In production you'll want to look these up by from (the phone number) — the agent already passes from into every handler.
async getPatientByPhone(from: string): Promise<Patient> {
// call your EHR / database
return await db.patients.findUnique({ where: { phone: from } });
}Doctor + locations
doctorLocations in lib/data.ts is the in-network provider list rendered as rich location cards. Add your own clinics and the finder picks them up immediately.
Compliance note
Healthcare RCS deployments need extra care:
- Don't transmit PHI to third parties without a BAA
- Use a test agent and whitelist only your dev devices during testing
- Set
TEST_MODE=trueuntil your branded agent is approved
Going to production
- Wire
getPatientByPhoneto your EHR or member database - Replace the in-memory state with Postgres
- Submit the agent for carrier approval
Resources
- Repo: github.com/pinnacle-samples/Summit-Health
- Docs: docs.pinnacle.sh
- Dashboard: app.pinnacle.sh/dashboard
- Support: founders@trypinnacle.app

