← All projects

Henk: AI-Powered Voice Fundraising Platform

Cover Image for Henk: AI-Powered Voice Fundraising Platform

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

LayerTechnologyWhy
FrontendNext.js 15App Router with server actions
DatabaseSupabasePostgreSQL with real time subscriptions
Voice AIElevenLabsMost natural sounding synthesis
TelephonyTwilioProgrammable Voice, reliable infrastructure
HostingVercelEdge 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:

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

Come argue with me about this.

I write up what I build, including the parts I got wrong. If something here is worth disagreeing with, I want to hear it.

© 2026 Cyrus David Pastelero. All rights reserved.

Built with Next.js, TypeScript & Tailwind CSS