TerraQuotes
Una herramienta con patente en trámite que calcula el precio de los trabajos de jardinería a partir de registros públicos de propiedades, para que el propietario tenga una cifra antes de que nadie vaya a verlo.
Lanzado
Mi papel
Fundador, ingeniero de producto y de aprendizaje automático
- Empresa
- Good Citizens
- Sector
- Paisajismo
- Años
- 2025 a 2026
- Equipo
- Único desarrollador
- Construí TerraQuotes solo durante 17 meses, desde la pregunta de un propietario hasta un producto en funcionamiento que usa un operador piloto, Quiet Village Landscaping.
- Diseñé el estimador para que el propietario no tenga que medir nada: el tamaño del lote según el condado, menos los edificios, por la propia tarifa por pie cuadrado del contratista.
- Fijé las reglas del modelo de precios antes de que aprendiera nada: solo puede ajustar ligeramente el precio, dentro de límites escritos, y no puede aprender hasta que vuelvan 75 trabajos ganados y 225 perdidos.
- En vivo con un operador piloto, Quiet Village Landscaping, que calcula el precio de jardines de propietarios reales
- 1 dirección es todo lo que escribe un propietario para obtener cuatro planes mensuales con precio, sin llamada comercial
- 9 de 38 contactos agendaron una visita después de recibir un precio al instante, y 4 se convirtieron en trabajos
- 49 de 225 cotizaciones perdidas registrados hasta ahora, frente a la cantidad que necesita el modelo antes de poder aprender
Resumen
Un amigo le preguntó a un paisajista cuánto le costaría su nuevo césped. Recibió un plano, la fogata que había mencionado de pasada y una factura de setenta y cinco dólares la hora por el diseño. Él solo quería la cifra. TerraQuotes le da al propietario esa cifra a partir de una dirección, usando los tamaños de lote que el condado ya publica gratis.
Lo construí solo. Una regla sencilla fija el precio, y un modelo de aprendizaje automático solo puede ajustarlo ligeramente, dentro de límites que escribí de antemano. El modelo sigue esperando, a propósito: tiene que ver las cotizaciones que perdieron los contratistas, y solo han vuelto 49 de los 225 que necesita.
Quiénes participaron
- Propietarios Quieren saber cuánto cuesta el trabajo de jardinería antes de que nadie vaya a verlos.
- Contratistas de paisajismo Quiet Village Landscaping, el operador piloto, lo usa hoy, y sus precios salen de su propia lista de precios.
- Jeff Haring, Sundown Landscaping Vio una versión temprana y trazó la línea entre mantenimiento e instalación.
Contexto
Para dar un precio al propietario antes de que nadie fuera a verlo, tenía que saber cuánto mide su jardín sin visitarlo. La hipótesis más arriesgada era que existiera una fuente gratuita de tamaños de lote y que fuera lo bastante buena para calcular precios a partir de ella. Todo el producto dependía de eso, y ningún servicio nacional la ofrecía.
Lo difícil nunca fue mostrar a un comprador un rango de cifras. Fue resistir la tentación de construir una enorme herramienta de diseño de jardines para que cada uno lo hiciera por su cuenta y centrarme en una sola pregunta: ¿a qué precios dice que sí la gente? En el sector eso se llama conversión, la frecuencia con que una cotización se convierte en un trabajo pagado.
Investigación
Antes de construir nada, escribí cada suposición como una hipótesis que pudiera probar, con lo que demostraría que me equivocaba. Luego las ordené según cuánto duele equivocarme y cuánto gana un cliente si acierto, y construí en ese orden.
Fui primero a los registros de los condados: la ciudad de St. Louis, el condado de St. Louis y el condado de Maricopa, en Arizona. St. Louis publica gratis los pies cuadrados de terreno y de edificación de cada lote, y el mismo enfoque funcionó en los otros dos. Le mostré una versión temprana a Jeff Haring, de Sundown Landscaping, y cuando llegó Quiet Village probé la idea con su lista de precios real.
Hipótesis clave
Tres hipótesis tenían que sostenerse antes de que valiera la pena construir esto. Aquí está cada una y en qué punto se encuentra.
Probé estas tres hipótesis frente a una lista de precios real cuando llegó el primer contratista, Quiet Village. Sus precios entraron en el modelo, y sus registros de clientes me dieron las dos preguntas que de verdad me importan: si la estimación se acerca al precio al que realmente se vende cada trabajo y si una máquina puede aprender qué cotizaciones ganan.
Confianza en la calculadora
¿Puede una calculadora mantener un precio sensato mientras alguien cambia de opinión sobre lo que quiere? Sí. Los paquetes y los interruptores de extras se lanzaron, y quité el dato que la gente podía introducir mal sin darse cuenta.
Precio estimado
¿La cifra se acerca lo suficiente como para que un paisajista se tome en serio el contacto? Sigue abierta. Un operador piloto la usa en vivo, pero descarté la prueba de precisión antes de poder puntuarla, así que la cifra en sí sigue sin demostrarse.
Método por pie cuadrado
¿Puede un paisajista cobrar el trabajo por pie cuadrado? Sí, con un matiz. El primer piloto reescribió sus precios de mantenimiento como una tarifa fija por pie cuadrado. La instalación queda fuera, porque nadie sabe qué hay bajo el césped.
Umbral de entrenamiento
El modelo no puede empezar a aprender hasta que vuelvan suficientes trabajos terminados.
Estas cifras no son al azar. Hice una simulación: le di al modelo pares de trabajos, uno ganado y otro perdido, y le pedí que eligiera el ganador. Probé distintas cantidades de trabajos, ejecuté la simulación 30 veces con cada una y me quedé con la cantidad más pequeña de trabajos con la que elegía al ganador al menos el 80% de las veces. Resulta que son 75 trabajos ganados y 225 perdidos. Eso sí, los trabajos de práctica eran inventados, así que me dicen cuántos trabajos reales necesito, no si hay un patrón que encontrar.
Pérdidas registradas
49/225
Victorias registradas
6/75
Victorias con las que entrenar
0/75
Cada punto es una creencia, situada según cuánto importaba y cuánto sabíamos de verdad. La esquina superior derecha es donde equivocarse dolería más y donde menos sabíamos, así que la investigación empezó por ahí. Dos creencias quedaron ahí.
- Se sostuvo
- Se sostuvo en parte
- No se sostuvo
- Nunca se probó
| ID | Supuesto | Certeza | Importancia | Estado |
|---|---|---|---|---|
| A-001 | Vercel's hosting will scale to all tenant traffic without us running our own servers | High | High | ValidatedN/A: validated in production |
| A-002 | A free geocoder is accurate enough for residential address lookup, so we never have to pay for one | High | High | ValidatedSupplemented with county GIS parcel data as primary address source (CR-20251012) |
| A-003 | Routing geocoding through our own server removes the browser security and privacy problems | High | Medium | ValidatedN/A |
| A-004 | Public county parcel boundaries are authoritative enough to estimate service area from | High | Critical | ValidatedAddress standardization handles heterogeneous schemas; YAML configs externalize field mappings |
| A-005 | Serviceable area can be derived reliably from public parcel data | High | Critical | Validated with caveatsvaluation and tier adjustments compensate for data gaps; area model semantics documented in CR-20260116 |
| A-006 | Public property valuation is a meaningful proxy for landscaping price positioning | Medium | High | Active: monitoringPer-tenant pricing profiles can override; ML pipeline designed to learn from CRM outcomes |
| A-007 | Counting events on our own servers, in Firestore and BigQuery, gives enough insight without a tracking library in the browser | High | High | ValidatedBigQuery views provide analytical capability; Mixpanel receives PII-stripped UX events for real-time needs |
| A-008 | Labelling every event as either checking the build or testing the idea stays maintainable as the number of events grows | Medium | High | Active: enforcedCI enforcement via enforce-pr-contract.yml; event registry test validates purpose on all events |
| A-009 | Three storage tiers: Firestore for hot data, BigQuery for warm, blob storage for cold: is cost-effective at this scale | High | Medium | Validated at current scaleCost monitoring in place; PostgreSQL migration plan documented in docs/tech-debt/MIGRATION_PLAN_OSS.md |
| A-010 | The people using this are homeowners on phones and crews on tablets, so mobile-first is the right default | High | High | Assumed: reasonableDesktop progressive enhancement ensures both work; Chromatic tests both viewports |
| A-011 | Three service tiers (Curb Appeal, Full Lawn, Dream Lawn) match how residential landscaping is actually sold | High | High | Validated operationallyPer-tenant tier labels configurable; telemetry tracks tier selection for Va |
| A-012 | Automated pricing is accurate enough for lead generation, though not for invoicing | Medium | Critical | Active: high priorityML pipeline (CR-20260209) designed to close the loop; CRM outcome detection (CR-20260306) will provide ground truth |
| A-013 | A one-time code by text or email is enough to gate estimate detail and capture a lead without driving people away | Medium | High | Active: monitoringreCAPTCHA as secondary layer; rate limiting prevents abuse; verification events track completion rate |
| A-014 | One source of truth for design tokens, compiled per tenant, is enough to theme every tenant | High | High | ValidatedCompile-time is acceptable for current tenant count; revisit if dynamic tenant provisioning is needed |
| A-015 | Moving address search to the server removes the slowness caused by sending a 6MB search index to the phone | High | High | ValidatedCase study documented in docs/case-studies/ADDRESS_INDEX_ARCHITECTURE.md |
| A-016 | A public mirror of lead data gives the sales team enough visibility without exposing personal details | High | High | Validated with gapmirrorLeadToPublic Cloud Function trigger handles sync; gap indicates timing or error: needs investigation |
| A-017 | Naming the allowed host per tenant is enough to secure embedding without managing origins dynamically | High | High | Validateddata-base-url attribute provides escape hatch for edge cases; TENANT_ORIGINS mapping (CR-20260311) handles CDN proxying |
| A-018 | Working out the tenant from the web address is enough for white-label hosting, without provisioning each one | High | High | Validated at current scaleAcceptable for current 3-tenant model; dynamic provisioning deferred to future EPIC |
| A-019 | Giving each tenant its own data path prevents one tenant reading another's leads, without row-level security | High | Critical | ValidatedCross-tenant regression suite in place |
| A-020 | A baseline with a bounded override is more robust than putting the model first | High | Critical | Active: partially validatedHeuristic baseline always computed; ML is additive not required; CRM outcome data will enable validation |
| A-021 | Absorbing the typical bore cost, about $750, into irrigation base pricing produces cleaner estimates without underpricing | Medium | Medium | Active: monitoring$750 based on typical one-bore scenarios; actual bore work priced correctly during installation |
| A-022 | Carrying CRM updates on events we already send avoids duplication and keeps the CRM interchangeable | High | High | Active: partially validatedGeneric crm_* events designed for future providers; HubSpot namespace isolation prevents vendor lock-in |
| A-023 | Pulling modules out behind interfaces lets them be tested without touching the filesystem or the cloud | High | High | ValidatedRepeatable pattern documented for future module extraction |
| A-024 | Keeping each region's field mappings in validated configuration files is more maintainable than writing them in code | High | Medium | ValidatedJSON Schema export from Pydantic for IDE autocomplete is future improvement |
| A-025 | Feeding real outcomes back from the CRM will improve pricing accuracy by 15 to 25 percent within six months | Low | Critical | Unvalidated: infrastructure readyAll infrastructure in place; blocking dependency is CRM deal outcome detection (CR-20260306); measurement via BigQuery ml_hypothesis_metrics view |
| A-026 | Deals that were lost are as valuable as deals that were won for calibrating pricing | Medium | High | Active: manual capture shipped; native subscription pendingCR-20260306 epic closed 2026-03-23 (#348); manual capture path shipped July 2026; native loss-reason capture in build (#890) |
| A-027 | Partner sites will rewrite our embed script's address, so detecting where it loaded from is unreliable | High | High | Validated (learned from incident)Hardcoded TENANT_ORIGINS mapping is deterministic and CDN-immune; data-base-url attribute for edge cases |
| A-028 | Dividing Phoenix, 500 square miles, by ZIP code is explainable to buyers and maintainable for exclusivity sales | Medium | High | Active: pre-productionConfig update process needed for ZIP changes; unmapped parcels route to parent maricopa region |
| A-029 | Creating the deal automatically improves close rate by at least 10 percent against keying it in by hand | Low | High | Unvalidated: measurable via BigQueryBigQuery fact_lead_ml.deal_won rate by source enables measurement |
| A-030 | Feeding real outcomes back will close the gap between the estimate and what the job finally sold for, by 15 to 25 percent within six months | Low | Critical | Unvalidated: infrastructure readyMeasurement query defined in hypothesis registry; requires sufficient closed-deal volume first |
| A-031 | Aligning 2026 pricing to the official spreadsheet produces correct estimates for Quiet Village customers | Medium | Critical | Active: under validationyarn test:regression:quiet-village guards against drift; qvl2026PricingValidated telemetry tracks sign-off |
| A-032 | The stored area figure is already adjusted, so anything downstream must not adjust it again | High | High | Active: fix in progressSemantic model documented; regression tests will validate fix |
Diseño
El propietario no mide nada. Escribe su dirección y elige su casa de una lista. La app toma el lote, resta los edificios y muestra lo que queda como una etiqueta verde junto a la dirección. El precio es esa superficie por la propia tarifa por pie cuadrado del contratista.
Solo calcula precios de direcciones elegidas de la lista. Si la suya no está, lo dice y ofrece una lista de espera en lugar de adivinar. El código que convierte los registros del condado en esa lista tiene la patente en trámite, no concedida.

Más pantallas






Iteración
La primera versión estaba pensada para instalaciones. Se escribía una dirección y se elegía uno de tres paquetes de pago único, Curb Appeal, Full Lawn o Dream Lawn, y un dibujo isométrico de una casa volvía a dibujar su jardín para mostrar lo que se compraba. Full Lawn en una dirección salía a $106,564, o $16.30 el pie cuadrado.
Calculaba el precio del trabajo equivocado. Jeff Haring vio una versión temprana y dijo: “Esto es genial para mantenimiento; no está del todo listo para instalaciones. Eso se complica en cuanto empiezas a cavar”. Cinco meses después, mi primer piloto trazó la misma línea sin que nadie se lo pidiera. Así que los paquetes pasaron a ser de mantenimiento mensual: Quiet Village reescribió sus precios de mantenimiento como una tarifa fija por pie cuadrado, sus paquetes se convirtieron en los planes mensuales GEM, y las obras pasaron a una pestaña propia y opcional.
Algunas lecciones llegaron por las malas. Enviar a un teléfono la lista completa de direcciones, seis megabytes, hacía la página lenta y fallaba en iPhone, así que ahora el servidor responde a cada búsqueda. El sitio web de un socio reescribía la dirección de mi código y rompía el formulario de cotización, así que ahora la app reconoce a cada socio por su nombre en lugar de adivinarlo.



Un diseño que no funcionó
La calculadora de octubre de 2025 le pedía al propietario que indicara con un control deslizante qué parte del jardín necesitaba trabajo. La gente se equivocaba, y el precio parecía igual de creíble en cualquier caso. Una respuesta equivocada que parece correcta es peor que ninguna respuesta, porque nadie se da cuenta.
Así que, para la siega y el mantenimiento, dejé de preguntar y medí el lote yo mismo, a partir de los registros de propiedad del condado. El selector de superficie pasó a los extras, donde elegir una superficie sí es lo que conviene preguntar.
Resultados
TerraQuotes está en funcionamiento. Un propietario recibe un paquete de mantenimiento con precio en más o menos un minuto, sin llamada comercial, y los contactos van al operador piloto, Quiet Village Landscaping. En la vista de ventas de un contratista, los 38 contactos recibieron una cifra en el mismo minuto; nueve agendaron una visita y cuatro se convirtieron en trabajos.
Lo que todavía no puedo decir es cuánto se acerca el precio. Descarté mi prueba de precisión antes de puntuarla, porque 215 de 347 filas de ventas antiguas mezclaban un precio mensual con dos precios de pago único, sin nada que los distinguiera. El 14 de julio de 2026 fijé el listón que el modelo debe superar antes de que valga la pena construirlo, a partir de una simulación y no de una corazonada. Un modelo de prueba que entrené en julio eligió al ganador 47 veces de cada 100, frente a los 50 de lanzar una moneda y mi límite de 60, y ningún modelo ha calculado nunca el precio de una cotización real.
Un umbral de entrenamiento: 75 trabajos ganados y 225 perdidos antes de que el modelo pueda aprender. Hoy tiene 6 y 49.
63 requisitos con seguimiento, con la lista de los 19 que se lanzan con una carencia conocida.
Para empresas de paisajismo
Precios al instante, con sus propias tarifas
Los propietarios escriben una dirección y ven el precio de su jardín. Sin llamada comercial.




