Skip to main content
FirstCoast.ai
All case studies
Case study: Professional services

Text-to-Invoice and Automated Billing

A solo-operator digital agency was losing billable hours to the oldest leak in services work: time worked but never logged, and invoices assembled weeks later from memory. Now the owner sends one Telegram message when the work ends, and the books stay current.

How the text-to-invoice pipeline worksOne Telegram thread on the owner's phone is the entire human interface. The moment work ends they send one plain-English sentence, 'Spent 3 hours on the contact form', which takes the same effort as texting a friend. An AI parsing step turns that sentence into structured data: the client, the hours, and the description. The client is then resolved by deterministic matching rather than by the AI, so the record is matched and never guessed. The entry lands in a Postgres time log, the system of record for every hour, which carries a running unbilled total per client, and that total goes straight back to the same Telegram thread with an invoice-now button attached. Both ways of billing read that one store. One tap turns the unbilled hours into an invoice, each entry as its own line at that client's agreed rate. On the first of the month, every retainer client's invoice drafts itself: the retainer billed in advance plus last month's unbilled hours, on one invoice, and the cycle is idempotent, so re-running it cannot double-bill a client. Both land in QuickBooks Online, where every invoice arrives as a draft and is reviewed and sent by a person. The integration is two-way and runs against production books, so invoice status is read back out: a weekly overdue check climbs back to the same Telegram thread as a nudge. Nothing is ever sent to a client automatically.ONE SENTENCE, THE MOMENT WORK ENDSTELEGRAMThe whole interface is one chat threadSENT“Spent 3 hours on the contact form”the same effort as texting a friendREPLYRunning unbilled totalInvoice nowfor that client, straight backAI parsing stepone sentence in, structured data outClientHoursDescriptionDeterministic matchthe parse is AI, the match is codeNEVER A GUESSEVERY HOUR LANDS HERE FIRSTTime entry loggedthe system of record for every hour workedwith a running unbilled total per clientPostgresTHE RUNNING UNBILLED TOTAL COMES BACKBOTH BILLING PATHS READ THE SAME STOREONE TAPUnbilled hours become an invoiceeach entry as its own lineat that client’s agreed rate1ST OF THE MONTHCANNOT DOUBLE-BILLRetainer invoice drafts itselfRetainer, in advanceLast month’s unbilled hourson one invoice, every monthTHE BOOKSQUICKBOOKS ONLINEDRAFT UNTIL A HUMAN SENDSEvery invoice arrives as a draftreviewed and sent by a person, from the bookstwo-way, against production booksso invoice status can be read back outBACK IN THE SAME THREADTELEGRAMOverdue invoicessurfaced in the same threadas a weekly nudgeEVERY WEEKOverdue checkread back from the books

The challenge

  • Hours worked on client projects went unlogged unless the owner stopped to fill in a tracker, which rarely happened mid-day
  • Invoicing meant reconstructing the month from calendars and memory, then hand-building each invoice
  • Retainer invoices had to be remembered, created, and sent on the first of every month, by hand

What we built

A chat-based billing pipeline. The owner sends one plain-English Telegram message from their phone the moment work ends: "Spent 3 hours on the contact form." AI parses the client, hours, and description, matches the client record, logs the entry, and replies with that client's running unbilled total and an invoice-now button.

  • Time capture takes the same effort as texting a friend, so it actually happens
  • One tap turns unbilled hours into a draft invoice in QuickBooks Online, each entry as its own line at that client's rate
  • On the first of each month, every retainer client's invoice drafts itself: the retainer billed in advance, plus any unbilled hours from the month before, on one invoice
  • Overdue invoices surface automatically in Telegram as a weekly nudge
  • Nothing is ever sent automatically; every invoice is a draft until a human reviews and sends it from QuickBooks Online

How it's built

A Telegram bot feeding an automation layer, an AI parsing step with deterministic client matching, a Postgres system of record, and a two-way QuickBooks Online integration running against production books. Idempotent by design: re-running a billing cycle cannot double-bill a client.

Results

  • Time is logged at the moment it happens, from a phone, in one sentence
  • Monthly invoicing dropped from an assembly job to a review-and-send click
  • Retainer billing runs itself on the first of the month, with ad hoc hours included on the same invoice
  • Every invoice still passes through human review before a client sees it

How many billable hours did you lose last month?

If logging time takes more than one sentence, it doesn't happen. We build billing systems around how owners actually work.