← All work

Zero to one, with real users

EmpowerME Lead Management System

A five-day hackathon build that cut first contact on childcare inquiries from about 23 hours to 4.2, now in daily use and still my responsibility.

Role
Team captain, product lead, and the person who built it
Timeline
Aug 2026 hackathon. Live since Aug 20, 2026.
Team
Six volunteers, five of them non-technical
Status
Live at two sites. I own the rollout through November.
Tools
Replit, React, Node, Postgres, AI transcription
4.2 hrs
Average first contact, last 10 leads. Was ~23 hrs.
6 of 6
Inquiry routes now land in one place
98%
Of the shipped build was mine, directing AI tooling

The short version

  • The brief was wrong. We were told leads were being lost. Discovery showed they weren’t lost, they were late. A lead could be four days old before anyone with the authority to act on it knew it existed. I rewrote the problem statement four times as staff corrected me.
  • The engineer never showed. I led five non-technical volunteers and produced roughly 98% of the shipped system myself, specifying and reviewing while AI wrote the code, on top of running discovery, scope and facilitation.
  • It’s still running. Average first contact went from about 23 hours to 4.2 over the last ten leads. Six inquiry routes feed one system. I’m the named rollout lead through November, and I still fix the bugs.

The setup, including my conflict of interest

Social Venture Partners Sacramento runs a five-day AI for Good hackathon: teams are paired with a nonprofit, expected to ship something live with real users, present to judges, and commit to a three-month rollout.

I signed up before I knew which nonprofits were involved. When Single Mom Strong turned out to be one of them, I asked to lead that team, because I sit on their board as Director of Product Strategy. That’s worth naming up front: my board seat is advisory, I had no operational knowledge of how their childcare program actually ran, and I was careful during discovery not to answer questions the staff should be answering. The team was present for the staff sessions, with one exception: discovery, which was me and the three executive staff.

Their childcare program, EmpowerME, runs two sites with a third opening in January. Roughly 51 seats sat open, and August and September are the peak window to fill them, because once school-age children move on to elementary school the demand thins out. A lead arriving in August is worth far more than one arriving in March.

The problem I got wrong, four times

The brief said educators were dropping classroom duties to field inquiries and type data into spreadsheets, causing delayed follow-ups.

Close, but wrong in the way that matters. Inquiries reached EmpowerME through several routes, and only one of them was fast: an administrative director happening to answer the phone. Every other route waited on an occupied person to notice something and pass it along.

A teacher would write a callback number on paper, photograph it, and text it later. That path could stall twice, once before she sent the photo and once before anyone read it. Website and marketplace inquiries landed in the executive director’s inbox, which takes about 100 emails a day.

What I had wrong, and who corrected me:

My assumption What was actually true
Leads were being lost They were arriving late. Latency, not loss. A different problem with a different solution.
A second website form existed Staff were describing an unmonitored chat widget. It answered questions but had never produced a lead.
We should route email around the executive director She told me directly that she wants to stay informed, and keeps copies because she doesn’t trust that follow-up is happening. The fix wasn’t removing her. It was giving her visibility.

The framing that finally stuck: a lead could be four days old before anyone with the authority to act on it knew it existed.

Volume made it worse, not better. EmpowerME received two to three inquiries a week. At that volume every single lead is material, which is why the delay mattered more than any efficiency gain.

The executive director defined success in her own words, and I built against that sentence all week:

All leads logged and an initial communication attempt made on the day the lead came in, plus no longer needing to review the lead list and wonder whether follow-up has been completed.

Monday: the session I ran badly, and the call I had to make

I ran a 90-minute working session and deliberately walked in with the problem and no solution, holding my own ideas back so the room would generate and own the answer.

The room converged on a QR code form, four fields a teacher could fill in on her phone during a call, plus a dashboard. But we never committed. Part of that was a real fear worth having: nobody wanted to build a CRM when a free nonprofit Salesforce tier already exists. Mostly, though, it was me. I let discussion run because interrupting felt rude, and I lost the room’s clock. The session ended at noon without a decision.

The administrative director pushed back in that same room, and she was right: a teacher supervising twelve children types one-handed, and typing one-handed is harder than writing one-handed. She’d either fill it in badly or defer it, which reproduces the exact delay we were trying to remove.

So by 4:30 that afternoon I got everyone back on Zoom with a written scope. Not my preferred process, but drift was the bigger risk with four days left. Every line in it traced back to something the team had raised, and everything set aside was listed with the reason, so nothing disappeared quietly.

What I scoped, and what I cut:

Set aside Why
Parent-facing text messaging Carrier registration takes one to three weeks. Not achievable in the window.
Parents booking their own tours The administrative director ruled it out for operational reasons I hadn’t considered.
An AI voice agent answering calls A mother calling about childcare for the first time is a trust moment. An AI answering it costs more than it saves.
Automatic call recording California requires all-party consent, and it introduces the same trust problem.
Photograph a paper note, read it with AI Adds a step instead of removing one, and a misread phone number fails silently.
Follow-up automation, auto-assignment CRM functions. Two directors share one list. There’s nobody to assign to.

The scope also carried a second path for teachers that I had no idea how to build: hold a button, say the details out loud, and let the system transcribe them. The team’s read that evening was that voice was a post-rollout feature, too hard for the time we had.

Monday night: the leap

I built version one that night anyway.

It worked well enough to show Tuesday morning, and the team made it the focus of the build. Typing stayed as an option, and one teacher still prefers it today, which is fine, because the point was never the input method.

What voice capture actually solves:

  • No new behavior. She taps record, talks to the parent the way she always has, and taps stop when the call ends. The fields fill in for her to check.
  • Her eyes stay on the classroom. Writing or typing means looking down at your hands. Speaking doesn’t. In a room with twelve children, that’s a supervision decision, not a convenience.
  • It’s legal. She records only her own side of the conversation, which California’s all-party consent rule doesn’t cover. Because staff naturally repeat details back on a call, the callback number and the child’s details come through in her own voice.
  • A garbled number doesn’t cost a family. The audio stays attached to the lead, so a director can play it back instead of losing the enrollment. Transcribed numbers get a confirmation step before anyone dials.

The call capture page: a large record button on the left, and on the right an optional typed form for parent name, callback number, child’s date of birth and desired schedule. The call capture page, as teachers see it. Record on the left, typing on the right, and a reminder that a partial lead beats a lost one.

Teacher access is submit-only. No dashboard, no login, no permissions layer. Classroom staff never see other families’ contact details, and there’s nothing to train.

The engineer who never came

The plan had an enterprise software architect joining the build Tuesday evening. He appeared once for about fifteen minutes late in the week, never touched the build, and didn’t come to the presentation.

When he missed Monday, I decided to take the build myself rather than wait, because I was the most experienced person there. The rest of the team was a graphic designer who codes as a hobby, an early childhood education veteran who runs her own school, a marketing operations lead, and a marketing strategist.

So I taught them Replit instead. The designer changed design elements and built some of it; two others fixed small bugs they found. Everyone contributed to the bet and the feature list, took notes in morning sprint meetings, talked to staff, and built the Friday presentation. About 98% of the shipped system came out of my build sessions. I specified, reviewed and decided, and the code was written with AI tooling in Replit.

I’d rather say that plainly than describe this as managing a team. Six volunteers for five days is leading without authority, which is the harder skill and the accurate description.

What shipped

Six routes into one system:

  • Website tour request form, automated
  • Marketplace listing emails from Winnie and CareLulu, parsed automatically
  • After-hours voicemail, transcribed into leads automatically
  • Voice capture for teachers
  • Voice capture for front-desk staff
  • Manual entry for calls the directors take themselves

The follow-up board: counts of new, needs follow-up, in progress and won leads across the top, with a never-contacted family at the top of the list showing lead age, child details, channel, and call and email buttons. The follow-up board, shown with a demo workspace and sample data. Never-contacted families sit at the top with their lead age visible, so nobody has to work out who comes next.

Plus instant alerts to all three decision-makers at once, a priority board ordered by contact status and lead age, one-tap outcome logging, snooze-with-reason (families awaiting childcare subsidy approval aren’t actionable for a week and would otherwise clutter the list), full tour lifecycle with confirmation and no-show tracking, duplicate detection, historical spreadsheet import with follow-up history preserved, and a metrics view built specifically so the executive director could stop checking her inbox to find out whether anything was happening.

The metrics view: median response time of 12 minutes this week and 1.3 hours last week, 60 percent of leads contacted the same day over the last 30 days, and a chart of lead sources led by phone capture. The metrics view, with real numbers from the last 30 days. Phone capture, the route teachers use, is the largest single source. Walk-ins reach the board through manual entry.

Built in Replit with AI-assisted development on Node, React and Postgres. Multi-tenant from the start.

I stopped building 24 hours before the deadline to test instead. The team had permission to expand scope and I declined it. The judges were scoring credible proof and adoption, not surface area, and features added the day before a live test are how demos break. Thursday morning the administrative director and a classroom teacher ran every flow themselves, in their own building, on their own devices. Friday we presented. The system went live with real inquiries on August 20.

The rollout was easy, and that was the point

Most of what makes adoption hard is asking people to change how they work. We designed that out. Teachers didn’t change a word of how they talk to a parent. They press a button first. That’s the entire behavior change.

Rollout was installing the web app to home screens, bookmarking it on the office computers, and showing staff the capture flow. The directors picked up the lead board in a couple of hours.

Today: two directors run lead follow-up, tour booking and enrollment in it. Five teachers and the program director use the capture page. The executive director gets a Monday email with last week’s metrics. All six routes are live. The teacher who prefers typing types, and she has stopped writing on paper and texting photos, which was the actual goal. Over the last 30 days, phone capture was the single largest source of leads, ahead of the website form, which is the clearest sign the teacher path took hold.

Since August I’ve added location filtering, so the team can focus on the site that needs attention, and fixed a run of email delivery bugs. Salesforce integration is on pause because they don’t currently need it. The open question is whether the platform should also carry Single Mom Strong’s member leads, not just EmpowerME childcare leads, and there’s a third site opening in January.

What the numbers say, and what they don’t

Because we imported their spreadsheet history, the before-and-after comparison was built in rather than reconstructed later.

Measure Value
Average first contact, before ~23 hours (worst case: 4 days)
Average first contact, since launch (Aug 20) ~7 hours across 30 leads
Average first contact, last two weeks 4.2 hours across 10 leads
Enrollments since Aug 20 6, plus 1 pending, against a typical rate of about 1 per week

The dashboard in the screenshot above reports the same story a different way. It shows medians by week, currently 12 minutes this week and 1.3 hours last week, on two and three contacted leads. It also shows 60% of leads contacted the same day they arrived over the last 30 days, 12 of 20. That last number is the one I watch, because same-day contact is how the executive director defined success, and 60% is not 100%.

The executive director describes enrollment during this stretch as slightly better than average.

What I won’t claim:

  • The samples are small. Ten leads is ten leads. The trend is real, the precision isn’t.
  • After-hours leads skew the average. A voicemail at 9pm can’t be answered until morning, which inflates every number above. A business-hours-only metric is the honest version and it’s in the backlog, not in the product.
  • Lead volume rose, but not purely because of the tool. The executive director increased marketing spend once she trusted her team could catch what came in. Better capture and more spend are tangled together. I’d rather name the confound than claim the lift.
  • Two of my own metrics are currently wrong. The dashboard reports 25 enrollments when 6 have actually enrolled, and it counts 30 tours booked without separating new tours from rebooked ones. I found both while writing this. They’re in the backlog, and I’ve left those figures out of this page.

The second-order outcome is the one I find most convincing: the executive director changed where she puts her budget because of what the system made her confident about.

What I’m carrying forward

Call time, even when it feels rude. My first facilitated session ran out of clock because I let discussion run when I should have cut it. Closing it that afternoon with a written scope kept the week on track, but it meant I made a call the room should have made together. I know the instinct, because it has cost me before. At my brokerage I kept someone on the team long after it was clear they weren’t a fit, for the same reason: protecting the comfort of the moment at the expense of the outcome. I’ve studied facilitation since, and the correction I’m working on is mechanical rather than emotional. Name the decision point up front, and hold the clock even when the conversation is a good one.

Define the metric before building the counter. I shipped an enrollment counter without defining what counts as an enrollment, and it has been overcounting in front of the executive director. For a tool whose whole purpose is an accurate picture, that’s the lesson that matters most to me. Both counting fixes are in the backlog, along with a business-hours response metric.

Rehearse every path, including the ones nobody watches. Everything that has broken in production has been email delivery, the one part we didn’t rehearse on Thursday.