Hadaa Blog

One customer call made us rebuild our core engine (and lose money on purpose for a month)

Hadaa October 26, 2026 4 min read
One customer call made us rebuild our core engine (and lose money on purpose for a month)

We build AI landscape design software. For about 10 months, our entire pro workflow rested on one assumption I never thought to question: the input is a sketch.


A landscaper uploads a rough drawing of the yard, our engine turns it into photorealistic renders. It worked. People paid for it. We spent the better part of a year making that sketch-to-render path as good as it could possibly be.


Then I got on a call with a pro to figure out why one of his renders didn't match what he'd pictured. We were looking at his sketch together, and he said — completely offhand — "yeah, the sketch is just the rough version, the real drawing is the CAD file."


He shared it. I opened the .dwg. And it was one of those quiet, slightly sickening moments where you realise you've been solving the wrong problem for a year.


The file had everything the sketch had thrown away. Every layer. The plant legend, with exact species. Spot levels. Retaining walls. The sheet notes. All the information we'd been asking our engine to guess — the customer already had it, in full, sitting in a file on his laptop. We'd built a beautiful pipeline for turning a lossy picture of the plan into a render, when the plan itself was right there the whole time.


So we stopped guessing and started reading the file.


Here's the part nobody tweets about. Reading a CAD drawing and turning it into a render that actually matches what was drawn is brutally hard, and the only way we found to get it right was to get on call after call with real pros and ask them to send us real, live, messy project files — not clean demos. Every single call broke something: a house on a slope whose walls floated in the air, a roof that overshot the walls, retaining walls that didn't step the ground, garden lights that didn't look like lights, plants that all came out looking identical.


We ended up building a test set of real drawings with hand-made answer keys, purely so we could measure — literally — how much of a drawing's meaning a render kept and how much it lost. "Meaning and loss" is now a number we track on every change. Along the way we also wrote up a CAD drawing standard for landscape plans ( https://hadaa.app/dwg-landscape-drawing-guide ) — the layer and legend conventions that make a drawing read cleanly — because half of "losing meaning" turned out to be drawings that never carried it in the first place.


And we ate the cost the whole way. A render the engine can't get right is free to the customer — so every miss is on us. For a stretch we were deliberately losing money: running free renders on strangers' real files, at our own expense, over and over, because that was the only honest way to make the thing correct.


The numbers from the last three weeks: 689 commits in 20 days — we've shipped to this engine every single day since launch. 832 commits in October, by far our biggest month ever (about 5x a normal one). And every rendered view is now checked back against the original drawing, up to 3 times, until it matches — and if it still can't, the customer pays nothing.


If you want to see where it ended up, this is the engine now: https://hadaa.app/dwg-to-render


The lesson I keep coming back to: none of this was on a roadmap. The single most important product decision we've made this year came from one offhand sentence, on one call, from one customer — and then from refusing to stop talking to the people actually using the thing. Our old engine wasn't bad. It was a good product built on an assumption we'd never had the humility to question. One customer questioned it for us, in passing. The best thing we did next was shut up, listen, and get on 50 more calls.


If you're building something: the customer call you keep putting off is probably the one that reframes your whole product.


— Francis, Hadaa

Hadaa
Hadaa: AI Landscape Design — 22 garden photos in 60 seconds