<i>An anonymized case study: how we fine-tuned an estimate assistant on five years of past bids for a pool-screen and rescreen builder in Clermont, so the owner stopped quoting at 9pm — what we trained on, where it got things wrong, and how we kept a human in the loop.</i>
(Client details are anonymized and some specifics composited at the client’s request.)
I got a call from a pool screen and rescreen builder in Clermont last year. The owner, let’s call him Mike, was buried. Every night after dinner, he’d sit down with a stack of measurement sheets, old bids, and a calculator. He’d type up quotes in Word, email them out, and usually get to bed around 11pm. His wife was tired of it. He was tired of it. And he was losing jobs because competitors responded faster.
Mike ran a small operation — three crews, one office admin, and himself as the only estimator. He was quoting 15–20 jobs a week, mostly rescreens for pool enclosures in Clermont, Winter Garden, and Groveland. Each quote took 45 minutes to an hour if he had a similar past job to reference. New designs? Two hours. Measuring, calculating material costs, typing it up. He was losing an estimated 60 missed calls a month because he couldn’t pick up the phone while quoting. Something had to give.
We built an AI estimate assistant. It didn’t replace him — it made him faster. Here’s how we did it, what went wrong, and where we kept a human in the loop.
The Situation: What Was Breaking
Mike’s quoting process was manual, start to finish. A customer would call or submit a web form. Mike would drive out, measure the enclosure (length, width, height, screen type, frame condition), take photos, jot notes on a clipboard. Back at the office, he’d flip through a three-ring binder of past bids — maybe 500 jobs over five years — to find a similar size and style. Then he’d calculate material costs: screen mesh ($0.35–$0.90/sq ft depending on type), aluminum framing ($2.50–$4.00/linear ft), clips, screws, and labor (two-person crew, half day to full day). Add a markup, type the quote, send it out.
The bottleneck wasn’t measuring — that was unavoidable. It was the lookup and calculation. Twenty minutes searching for comparable past jobs, then another 30 minutes doing math and formatting. And he’d often miss jobs because he was too slow. “I had a customer in Winter Garden tell me, ‘Your quote was great but I got three others in the time it took you to send yours,’” Mike told me. “I lost a $4,500 job because I was 12 hours late.”
He’d tried spreadsheets — a master list with formulas. But it was fragile. Every new screen type or custom shape broke the formulas. He’d tried a quoting software package designed for general contractors, but it didn’t understand “12×20 three-wall with no roof” or “rescreen only, frame stays.” He gave up after two weeks.
What We Did: The AI Work
We proposed an AI assistant that could learn from his five years of past bids. Mike inputs the job specs (dimensions, screen type, frame condition, location), and the assistant outputs a draft quote with material list, labor estimate, and total price. Mike reviews, adjusts, and sends. Target: cut quote time from 45 minutes to 10 minutes.
Data preparation. Mike had 487 past bids in a mix of formats: Word docs, PDFs, and handwritten notes scanned as images. We extracted text using OCR (Tesseract for the scans, python-docx for Word, PyPDF2 for PDFs). Then we cleaned the data: standardized dimensions (e.g., “12×20” to “12×20”), normalized screen types (e.g., “standard fiberglass” to “fiberglass 18×14”), and tagged each job with a category (new enclosure, rescreen, repair, add-a-wall). We also extracted the final price and the date. This was the hardest part — it took two weeks of part-time work from a data contractor. Mike’s handwriting was, let’s say, unique.
Fine-tuning a model. We used a base large language model (LLaMA 3.1 8B) and fine-tuned it on a dataset of 400 structured examples. Each example had an input (job specs) and an output (quote details: materials list, labor hours, total price). We held out 87 jobs for testing. The fine-tuning used LoRA (Low-Rank Adaptation) on a single A100 GPU for about 4 hours. Cost was roughly $150 in compute. We also built a retrieval-augmented generation (RAG) pipeline using vector embeddings (OpenAI text-embedding-3-small) to pull the most similar past jobs from the full set of 487 bids. This helped the model reference real historical prices, not just patterns.
Integration. We built a simple web interface where Mike could enter job specs: drop-downs for screen type, frame condition, number of walls, roof type (flat, gable, none), and a text field for notes. He could also upload a photo. The system would first retrieve the top 5 similar past jobs, then generate a draft quote. Mike could edit any field, and the system would recalculate totals. We used n8n for the workflow automation: when Mike submits, it triggers the RAG search, then the LLM generation, then formats the output into a PDF email template. The whole pipeline runs in under 30 seconds.
Where It Got Things Wrong
We tested the assistant on 30 real new jobs over two weeks. Mike would create a quote manually first, then run the AI, and compare. The AI got the material list right 85% of the time. But it made three kinds of mistakes:
- Overestimating labor on complex shapes. For a custom octagonal enclosure with a cathedral roof, the AI suggested 2.5 days of labor. Mike knew it’d take 3.5 days because of the angles and roof pitch. The model didn’t have enough examples of non-rectangular shapes — only 12 in the training data. We fixed this by adding a “complexity” slider (1–5) that Mike sets manually, and the model multiplies labor by a factor (1.0, 1.2, 1.5, 2.0, 2.5).
- Mispricing specialty screen. The AI once quoted “no-see-um mesh” at $0.90/sq ft, but the actual cost had risen to $1.15 due to supply chain changes. The training data was a year old. We added a manual price override field and set up a monthly data refresh to update prices from Mike’s supplier invoices.
- Hallucinating a job that didn’t exist. In one test, the AI generated a quote for a “12×20 three-wall with roof” but included a line item for “screen door installation” that wasn’t requested. The RAG had pulled a past job that included a door. We added a step where the system lists the retrieved past jobs in the interface so Mike can see which ones influenced the quote. He can delete irrelevant items.
After two weeks of tweaks, the AI got it right 92% of the time on new jobs. Mike still reviews every quote, but he catches errors quickly. “I can spot a bad number in seconds now,” he said.
Where We Kept a Human in the Loop
We deliberately designed the system so that Mike (or his admin) must review and approve every quote before it goes out. No auto-send. Why? Three reasons:
- Pricing strategy. Mike sometimes offers discounts for repeat customers or bundles multiple jobs. The AI doesn’t know the relationship. Mike decides the final price.
- Site-specific issues. The AI can’t see that a customer’s pool deck is cracked and will need extra bracing. Mike notes that on-site and adjusts the quote.
- Liability. If the AI underprices a job, Mike eats the cost. He needs to own the final number.
We also kept the admin in the loop for data entry. Mike still measures and takes photos. The admin enters the specs into the system. That takes 5 minutes. Mike reviews the draft in 5 minutes. Total: 10 minutes per quote, down from 45. The admin also handles follow-up calls, which used to be Mike’s job. That freed up another 5 hours a week.
We also set up a feedback loop. After a job is completed, Mike’s crew reports actual labor hours and material usage. The admin enters that into the system. Every month, we fine-tune the model on the new data. This keeps the AI current with price changes and new screen types.
The Measured Results
After three months, here’s what we measured:
- Quote time dropped from 45 minutes to 10 minutes per job. That’s a 78% reduction. For 20 quotes a week, Mike saved about 12 hours per week.
- Missed calls dropped from 60 per month to 15. Mike now answers the phone during business hours because he’s not locked in a quoting session.
- Win rate improved from 35% to 48%. Faster quotes meant Mike was often the first to respond. Customers told him that mattered.
- Revenue increased by about 22% in the first quarter after implementation. Mike attributes this to more jobs won and the ability to take on more estimates without burning out.
One caveat: the first month was bumpy. Mike had to learn to trust the AI, and we had to fix several bugs (the price override field wasn’t saving correctly, the complexity slider reset to 1 every time). We also underestimated how much data cleaning would cost — about $2,000 in contractor time. But Mike says it paid for itself in two months.
What We’d Do Differently
If we did this again, I’d start with a smaller pilot — maybe 50 quotes instead of 400 — to validate the approach faster. We spent too much time cleaning data that wasn’t useful (old bids with missing dimensions). I’d also involve Mike’s admin earlier in the design. She had great ideas about how the interface should work, but we only showed it to her after development. That caused a few reworks.
Honestly, the RAG retrieval wasn’t always picking the best past jobs. We tuned the similarity threshold (cosine similarity >0.85) and added a filter for date (only jobs from the last 3 years). That improved relevance. We also considered fine-tuning a smaller model for just the material estimation, but the single model approach worked well enough.
Finally, I’d recommend any small business owner considering this start with an AI readiness assessment to see if their data is clean enough. In Mike’s case, the data was messy but usable. If it’d been all handwritten notes, we might’ve needed a different approach.
Honest Caveats
This isn’t magic. The AI still gets things wrong, especially on unusual jobs. Mike says he’ll never fully trust it for custom designs. And the system requires ongoing maintenance — monthly data refreshes, occasional model retraining, and tech support. We charge a flat monthly fee for that, which Mike finds reasonable because it saves him 12 hours a week.
Also, this solution is specific to pool screen estimating. It wouldn’t transfer directly to, say, a roofing contractor. But the approach — fine-tune on past data, use RAG for retrieval, keep a human reviewer — is general. If you run a service business with a history of quotes, you can probably do something similar.
For Mike, the biggest win isn’t the time savings. It’s that he now leaves the office at 5pm and has dinner with his family. “My wife says I’m a different person,” he told me. “I don’t bring work home anymore.” That’s the kind of result that makes this work worthwhile.
If you’re a Central Florida business owner drowning in manual quoting, reach out. We can talk about whether an AI estimate assistant makes sense for you. No hype, just a conversation about your data and your process.
"My wife says I’m a different person. I don’t bring work home anymore." — Mike, Clermont pool screen builder
Frequently asked questions
How long did it take to build the AI estimate assistant?
The initial build took about 6 weeks: 2 weeks for data cleaning, 2 weeks for model fine-tuning and RAG setup, and 2 weeks for integration and testing. Ongoing maintenance is a few hours per month.
What data did you need from the client?
We needed past bids (at least 100, ideally more) in digital or scanned format, plus supplier price lists. The more consistent the data, the better the results. Handwritten notes required OCR cleanup.
Can this work for other types of contractors?
Yes, the approach is general: fine-tune a language model on historical quotes and use RAG to retrieve similar past jobs. We've done similar work for HVAC and roofing companies. See our <a href="/fractional-ai-officer/">fractional AI officer</a> service for more.
How much did this cost the client?
The initial project was about $8,000, including data cleaning, development, and two weeks of support. The monthly maintenance is $500. The client saw ROI within two months from time savings and increased revenue.
Did the AI ever make a costly mistake?
Yes, early on it mispriced specialty screen mesh by $0.25/sq ft, which could have cost the client $200 on a large job. Mike caught it during review. We added a manual price override and monthly price updates to prevent recurrence.
What if I don't have digital records of past bids?
We can still help, but the data preparation takes longer. We'd need to scan and OCR paper records, or manually enter a sample set. An <a href="/ai-readiness-assessment/">AI readiness assessment</a> can determine if your data is usable.
Ready to talk it through?
Send a one-line description of what you are trying to do. I will reply within one business day with a plain-English next step. Email or use the form →