Projects
Dale
A WhatsApp contact that writes quotes for tradespeople. You send it a voice note, a photo or a message, and it sends back a branded PDF plus a link your client can accept.

Problem
Tradespeople write quotes by hand, in Excel or in a loose message. It takes time, looks unprofessional, and they never know whether the client saw it or when to follow up. In Argentina, inflation adds to it: a quote from two weeks ago is already out of date.
Before writing code I looked at the market. The closest competitor, a WhatsApp bot, lists prices from 66,000 to 147,000 pesos a month. I tried it as a customer: the format works, but there is no link for the client to accept, no follow-up and no expiry date on the quote.
Product decisions
- WhatsApp as the way in, the web as the dashboard. I first built a full web app; trying the competitor showed me tradespeople don't want another app to open. The web app was reused whole as the dashboard.
- AI never makes up prices. It picks items from the tradesperson's price list and the code does the maths. If they say a price out loud, that one is used; if one is missing, it shows as “to be completed”.
- A small, measured model: Claude Haiku 5.5 got 20 out of 20 test quotes right, at 0.00017 dollars each.
- The speech-to-text service was chosen with 20 real voice notes: one got 20 out of 20, the other 18 and 19 out of 20, at the same price. Audio is never stored.
- Payments go straight through Mercado Pago, monthly or yearly, with the first three quotes free and no card needed. One provider, one payment notification.
- Left out on purpose: invoicing (electronic and regulated in Argentina), deposits, a native app and phone permissions.
How it works
The message comes in through the WhatsApp API to a Supabase function that checks Meta's signature. Audio is transcribed, the AI builds or fixes the line items from the tradesperson's price list, and the PDF is generated on the server and sent back on WhatsApp with the client link.
The client opens the link with no account and accepts, asks for changes or declines. The dashboard shows which quotes were seen, which were accepted and who to follow up with.
Technical challenges
- The bot has to understand intent: a new quote, a fix (“drop the delivery fee”), “who hasn't replied?”. Anything that is not a quote gets no answer, to comply with WhatsApp's policy on AI assistants.
- A price corrected in the chat is saved to the price list, so next time it comes out right on its own.
- Payments: a Mercado Pago notification is never trusted as it arrives; the real payment status is checked. A refund removes access, and a daily sync fixes lost notifications.
- Each tradesperson only sees their own data, enforced with Row Level Security. The AI never receives the end client's details.
- Meta cut the bot off twice to confirm the account. An hourly health check now sends an email alert.
Validation and results
I tested it end to end on the real WhatsApp number and on my iPhone before publishing. It has 136 automated tests, and the database functions are tested in SQL with rollback.
I launched it on 22 October 2026. I don't have users or sales to show yet; when I do, they will go here with their date.
What I'd do differently
- Try the competitor before building, not after: it would have saved me building the web app as the way in first.
- Close the payment loop end to end before launch. The yearly plan couldn't be bought on launch day; I caught it while checking and switched provider.
- AI speeds up my development, but deciding what to build and what to leave out is still my job.

