Inspiration

Chasing a late invoice is uniquely awkward for freelancers, email reminders get ignored, and calling yourself feels like turning into a debt collector. GetPaid was built to remove that discomfort entirely: place one warm, disclosed-as-AI check-in call on the freelancer's behalf, and come back with a plain, structured answer.

What it does

GetPaid places a single check-in call to a client about an overdue invoice. The call is explicitly instructed to identify itself as AI, stay non-accusatory, and gather information only, never negotiate the amount or make commitments. The result comes back as structured data (paid, promised date, disputed, voicemail, no answer, wrong number, declined) rather than a raw transcript, so the app can act on it directly.

If a client promises a payment date and that date passes, GetPaid automatically places one gentler follow-up call. Anything ambiguous or negative, a dispute, a decline, a wrong number, is routed straight to a human instead of retried. No invoice is ever auto-called more than twice before it's flagged for a person to step in.

How I built it

FastAPI backend, a CALL-E client wrapper supporting both a fixture (offline, zero- credential) mode and a real live-calling mode, a small paper-ledger-styled frontend, and a full pytest suite that runs entirely in fixture mode so it never touches real credits. The public demo (deployed on Render) runs live calling with a required consent checkbox, a per-IP rate limit, and a hard global cap on real calls placed, since free CALL-E credits are limited and shared across every visitor testing the public link.

Challenges I ran into

Testing live calling for real was harder than expected: the hackathon account's region tier rejected calls to my own (Canadian) number, and several free US-number services (Google Voice, Twilio's number configuration) had signup restrictions or paywalls I hadn't anticipated. I eventually got a real US number through TextNow and completed a genuine end-to-end call, CALL-E correctly disclosed itself as AI, held a natural conversation, and returned a correctly structured result with the right parsed date.

What I learned

Building the safety rails (consent, rate limiting, a strict allowlist of which outcomes get auto-retried) took roughly as much engineering effort as the core calling feature itself, and I think that's the right ratio for anything that can place a real phone call on someone's behalf.

What's next for GetPaid

Multi-language support for international clients, a lightweight email/SMS fallback when a call genuinely can't reach anyone, and a simple dashboard view for freelancers tracking several outstanding invoices at once.

Built With

Share this project:

Updates

Submission history