The problem
Charities face a painful dilemma with phone fundraising. Personal phone calls convert donors well, but call centers are expensive and don't scale. When campaigns spike, organizations either miss opportunities or burn through their budgets on temporary staff.
The deeper problem isn't just cost. It's also consistency. Different callers deliver different experiences. Some are great, some aren't. Tracking what actually works across thousands of calls is nearly impossible.
What I built
Henk is an AI voice platform that enables charities to have natural phone conversations with donors at scale. The AI adapts to what donors say, handles objections gracefully, and logs everything for compliance and analysis.
The journey
I underestimated this project completely. I thought voice synthesis exists, telephony APIs exist, just connect them. What I didn't realize was how different voice interactions are from text.
Tech stack
| Layer | Technology | Why |
|---|---|---|
| Frontend | Next.js 15 | App Router with server actions |
| Database | Supabase | PostgreSQL with real time subscriptions |
| Voice AI | ElevenLabs | Most natural sounding synthesis |
| Telephony | Twilio | Programmable Voice, reliable infrastructure |
| Hosting | Vercel | Edge functions for low latency |
What building this taught me
1. Latency is everything in voice
In text chat, a 2 second delay is fine. On a phone call, 2 seconds of silence feels broken. I became obsessed with latency. Every millisecond mattered.
I learned to pre buffer, predict likely responses, and stream audio before full sentences complete. The realization: real time isn't a feature, it's a completely different engineering discipline.
Resources that helped me optimize:
- ElevenLabs Streaming Guide
- Twilio Media Streams
- Web Audio API for client side audio handling
2. Real conversations break your assumptions
I built the happy path first. User asks question, AI responds. Easy. Then real users happened.
They interrupt mid sentence. They mumble. They say "uh huh" while you're talking. They ask questions you never anticipated.
I learned that conversation design is closer to game design than software engineering. You're designing for unpredictable human behavior, not deterministic flows.
Resources on conversation design:
3. Compliance isn't a checkbox, it's architecture
Fundraising has strict regulations. Call timing rules. Mandatory opt out language. Disclosure requirements.
I originally planned to add compliance "at the end." That was naive. Compliance touches every part of the system: recording consent, timing restrictions, script requirements. Building it in from day one would have been easier than retrofitting.
4. Twilio's documentation tells half the story
The Twilio docs show the happy path beautifully. What they don't tell you is how WebSocket connections drop under load, how DTMF detection varies by carrier, or how international calls have completely different latency profiles.
I learned more from debugging production issues than from any documentation.
// What the docs show:
twiml.say('Hello!')
// What production taught me:
twiml.say(
{
voice: 'Polly.Matthew',
language: 'en-US',
},
'Hello!'
)
// Plus: error handling, fallbacks,
// carrier-specific quirks, timeout handling...
The bigger realization
Building Henk changed how I think about AI products. The AI isn't the product. The experience is.
Nobody cares that ElevenLabs generates the voice or that GPT-4 writes the responses. They care that the conversation feels natural and the campaign converts donors. I spent too much time on AI capabilities and not enough on conversation design.
What I would do differently
Build a conversation simulator from week one. I tested with real calls, which was slow and expensive. A simulator that could throw edge cases at the system would have caught issues faster and cheaper.
References
- ElevenLabs Documentation
- Twilio Programmable Voice
- Supabase Real-time
- Google Conversation Design
- TwiML Reference
Links
- Website: callhenk.com
