What it is
I am an air-conditioning installation technician in southern Chile. I am not a software engineer. I work for Furtz Clima, a small trades business: a few technicians, one sales executive, and a phone that never stops.
Its entire commercial funnel lived inside a single WhatsApp inbox, and that inbox was the bottleneck. Messages arrived at 11pm. Quotes took two days. Customers who did not get an answer within the hour called a competitor. I watched jobs I could have done evaporate because nobody answered in time.
So I built EcoClima OS: an AI agent that now runs the customer-facing operation of that business, on its real production WhatsApp line (+56 9 5848 9307), deployed with the owner's permission. It is not a prototype behind a login: it is the number printed on the van I drive to jobs.
What the AI actually decides
Gemini 2.5 Flash is not used here to generate friendly text. It executes the operational decisions a human coordinator used to make:
- It classifies the job. From free-form Chilean Spanish, the agent determines whether the request is an installation or a maintenance call. That single decision branches the entire downstream workflow — different questions, different pricing rules, different technician skills.
- It sizes the equipment. The agent collects room dimensions and applies the business's BTU sizing matrix to compute the correct unit capacity. In production it has already returned 9,000 BTU and 12,000 BTU specifications for real requests.
- It reads photographs. Customers send pictures of their units and electrical panels. Gemini's vision capability analyses the image and writes the technical note the technician reads before arriving on site.
- It resolves location. Customers drop a WhatsApp GPS pin; the agent reverse-geocodes it through Google Maps and stores a dispatchable street address. One live lead in our database reads "Av. Simpson 298, Valdivia, Los Ríos, Chile" — an address the customer never typed.
- It books the calendar. Instead of asking an open-ended "when suits you?", the agent reads the live Firestore calendar and offers only free windows inside business hours.
- It knows when to stop. When a customer becomes frustrated, asks for a person, or reaches the point where a price must be negotiated, the agent alerts the human sales executive with the full lead context and pauses itself for that conversation. It does not fake authority it does not have.
- It follows up without being asked. On job completion it runs a four-question satisfaction survey and requests consent to use the testimonial. One year later it sends a personalised preventive-maintenance offer, adapted to the original service type and unit count.
Every Gemini call is logged to Firestore with token count, latency and outcome, and shown in the dashboard's AI Control panel — an audit trail, not a claim.
What humans do vs. what the AI does
The division is deliberate. The AI owns everything up to commitment: qualification, sizing, diagnosis, scheduling, follow-up. Humans own everything involving money, judgement, or a ladder.
The sales executive receives only pre-qualified leads — service type, unit count, payment preference and address already captured — and closes the deal. We technicians receive a dispatch note with a real address and a photo-derived diagnosis, so we arrive with the right parts. The business rules (BTU matrix, service costs, brands) are edited from the dashboard rather than from code.
Deliberately, the agent never quotes a price. Pricing depends on access, height and existing wiring; a wrong number from a bot is a lost job or an unprofitable one. The agent gathers everything a human needs to price accurately in thirty seconds, then hands off.
How we built it
TypeScript and Express on Cloud Run (southamerica-west1), Cloud Firestore, Firebase Hosting for the React dashboard, Cloud Build for CI/CD, Cloud Logging, and Google Maps Geocoding. The agent is the Gemini API (gemini-2.5-flash, text and vision).
The notable part is who built it: the technician who installs the equipment. A stack that would have needed an engineering department five years ago was specified largely in plain English, by someone whose trade is climate control.
Challenges we ran into
This system has failed in production and been repaired in production. The agent went silent for weeks when prepaid Gemini credits ran out and the API returned HTTP 429 with no alert. Incoming messages were being routed to an abandoned deployment in a different Google Cloud project — a ghost server nobody remembered creating. The Firestore database did not exist while the code assumed it did, so every write silently fell back to a local mock.
Each is now instrumented: an uptime check on /health alerts by email within one minute of the agent going down. Running a business on AI is an operations problem, and I have the scar tissue to prove I treat it like one.
Jobs and economic opportunity
The immediate effect is capacity, not headcount reduction. A small crew that loses leads overnight and on Sundays is capped by response time, not skill. An always-on agent lets the same technicians convert work that previously evaporated — and that converted work is what pays us and funds the next hire. I built this partly because the jobs it saves are jobs I get to do.
Nothing here is specific to Furtz Clima. Chile has thousands of trades microbusinesses — electricians, gasfitters, refrigeration technicians — running the same overloaded WhatsApp funnel with no path to enterprise CRM software. The business rules live in an editable JSON configuration rather than in code, so the same agent can be re-pointed at another trade by changing a file. Small Business Services is not a category I picked for the submission; it is the shop I work in.
What's next
Harden the Meta-approved WhatsApp templates so the annual retention campaign can run at scale, and put the agent in front of enough traffic to prove the unit economics a single conversation already shows.
Built With
- cloud-run
- express.js
- firebase
- firestore
- gemini
- google-cloud
- google-maps
- node.js
- react
- typescript
Log in or sign up for Devpost to join the conversation.