<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Brian's Notes]]></title><description><![CDATA[Construyo cosas. Luego escribo sobre lo que funcionó.

Soy Brian Mena. Ingeniero informático, solopreneur y padre. Trabajo con código, datos y agentes de IA para construir productos digitales rentables desde cero.

No tengo equipo. No tengo inversores.]]></description><link>https://newsletter.brianmenagomez.com</link><image><url>https://substackcdn.com/image/fetch/$s_!7nbD!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9dcf7f-ea19-48c6-9eb8-91e45dd4b8eb_1280x1280.png</url><title>Brian&apos;s Notes</title><link>https://newsletter.brianmenagomez.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 04 Sep 2026 09:34:53 GMT</lastBuildDate><atom:link href="https://newsletter.brianmenagomez.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Brian Mena Gómez]]></copyright><language><![CDATA[es]]></language><webMaster><![CDATA[contacto@brianmenagomez.com]]></webMaster><itunes:owner><itunes:email><![CDATA[contacto@brianmenagomez.com]]></itunes:email><itunes:name><![CDATA[Brian Mena Gómez]]></itunes:name></itunes:owner><itunes:author><![CDATA[Brian Mena Gómez]]></itunes:author><googleplay:owner><![CDATA[contacto@brianmenagomez.com]]></googleplay:owner><googleplay:email><![CDATA[contacto@brianmenagomez.com]]></googleplay:email><googleplay:author><![CDATA[Brian Mena Gómez]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Apify Web Scraping Tutorial 2026: Deja de Escribir Scrapers. Forkea, Despliega y Cobra por Operar]]></title><description><![CDATA[Tutorial completo de Apify 2026: por qu&#233; el scraping es orquestaci&#243;n, no selectores. Del Apify Store al Actor serverless con Crawlee, en 5 pasos.]]></description><link>https://newsletter.brianmenagomez.com/p/apify-web-scraping-tutorial-2026-bfb</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/apify-web-scraping-tutorial-2026-bfb</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Fri, 04 Sep 2026 07:00:15 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0f82833f-eee1-496f-a141-74988dba6f95_1080x639.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>Deja de Escribir Scrapers. Nadie ha Fallado Nunca por sus Selectores CSS</strong></h2><p>Que te bloqueen en la ejecuci&#243;n 47 a las 3 de la ma&#241;ana es lo que mata tu pipeline. No un selector roto. No una p&#225;gina que cambi&#243; de markup.</p><p>Nadie fracasa en web scraping porque su `document.querySelector` estuviera mal escrito. Fracasan porque el sitio objetivo detecta tu fingerprint TLS en el request 43, te sirve un 403 y tu script en bucle reintenta hasta que el VPS se queda sin memoria.</p><p><strong>*Apify no es una empresa de scraping. Es una empresa de anti-fragilidad.</strong>* Esa distinci&#243;n es toda la lecci&#243;n.</p><p>Y aqu&#237; est&#225; la parte que ning&#250;n tutorial te cuenta: el c&#243;digo de scraping &#8212; lo que todo el mundo comenta &#8212; te lo regalan gratis. Es open source. Lo que pagas es la fontaner&#237;a: rotaci&#243;n de proxies, reintentos, escalado serverless, almacenamiento y el hecho de que tu scraper siga vivo ma&#241;ana.</p><p>Vamos a construir algo real. Pero primero, derribemos la suposici&#243;n equivocada.</p><p>---</p><h2><strong>El Problema: Crees que el Scraping es un Problema de C&#243;digo</strong></h2><p>Hay dos mentiras circulando por ah&#237; sobre web scraping en 2026.</p><p>La primera dice que scraping est&#225; muriendo porque la IA "ya lo sabe todo". Falso. La adopci&#243;n de LLMs ha <strong>*aumentado</strong>* la demanda de datos frescos y estructurados para RAG pipelines y conjuntos de evaluaci&#243;n. Un modelo fundacional no puede saber el precio actual de un producto ni el estado de una oferta. Eso solo lo da un scraper que corre hoy.</p><p>La segunda mentira dice que scraping es trivial: un bucle `for` sobre URLs con una librer&#237;a de selectores.</p><p>Eso funciona exactamente hasta la primera p&#225;gina que te bloquea.</p><p><strong>El cuello de botella se desplaz&#243;.</strong> Ya no es "conseguir el HTML". Es mantener el pipeline vivo a escala contra defensas anti-bot que fingerprintean tu TLS, throttlean tu concurrencia y te sirven honeypots que parecen datos reales.</p><p>El c&#243;digo nunca fue el problema. <strong>*La resiliencia es el problema.</strong>* Y esa es exactamente el &#225;rea que Apify construy&#243; alrededor de un core open source llamado Crawlee.</p><p>---</p><h2><strong>La Evidencia: el Scraper que Gana Nunca se Ejecuta en tu Port&#225;til</strong></h2><p>Miremos el boilerplate. Un scraper ingenuo con `axios` + `cheerio`:</p><p>```javascript</p><p>// scraper_naive.js &#8212; muere en el primer 403</p><p>const axios = require('axios');</p><p>const cheerio = require('cheerio');</p><p>const urls = ['https://ejemplo.com/a', 'https://ejemplo.com/b'];</p><p>for (const url of urls) {</p><p>const { data } = await axios.get(url); // &#8594; 403 en producci&#243;n, sin reintento</p><p>const $ = cheerio.load(data);</p><p>const titulo = $('h1').text();</p><p>console.log(titulo);</p><p>}</p><p>```</p><p>Cinco l&#237;neas. Funciona en local. Y se rompe en producci&#243;n cuando el sitio detecta que no hay sesi&#243;n, que no hay headers reales de navegador, que el ritmo de requests es de bot.</p><p>Ahora el mismo objetivo con <strong>Crawlee</strong> en Node:</p><p>```javascript</p><p>// crawlee_scraper.js &#8212; sobrevive a producci&#243;n</p><p>import { CheerioCrawler } from 'crawlee';</p><p>const crawler = new CheerioCrawler({</p><p>maxRequestsPerCrawl: 100,</p><p>maxConcurrency: 10,</p><p>// Session pool: rotaci&#243;n de identidad + reintentos autom&#225;ticos</p><p>useSessionPool: true,</p><p>sessionPoolOptions: {</p><p>maxPoolSize: 50,</p><p>blockedStatusCodes: [403, 429], // detecta bloqueo &#8594; gira sesi&#243;n</p><p>},</p><p>requestHandler: async ({ request, $ }) =&gt; {</p><p>await crawler.pushData({</p><p>url: request.url,</p><p>titulo: $('h1').text().trim(),</p><p>fecha: $('time').attr('datetime'),</p><p>});</p><p>},</p><p>});</p><p>await crawler.run(['https://ejemplo.com/listado']);</p><p>```</p><p>La diferencia no son los selectores. Son ~15 l&#237;neas de configuraci&#243;n que gestionan reintentos, detecci&#243;n de bloqueo y salida estructurada a dataset.</p><p><strong>*Eso es el valor de Crawlee: no es lo que raspa. Es lo que ya no tienes que escribir t&#250;.</strong>*</p><p>El mismo patr&#243;n existe en Python. Para objetivos con mucho JavaScript, usas el `PlaywrightCrawler`, que levanta un navegador headless con un session pool consolidado. Intentar eso a mano &#8212; con Playwright crudo y l&#243;gica manual de waits &#8212; es semanas de debugging que nadie te agradece.</p><p>Y aqu&#237; est&#225; la decisi&#243;n estrat&#233;gica que casi nadie analiza: <strong>Apify renombr&#243; su SDK a Crawlee en 2022 y lo liber&#243; como open source con un nombre neutral.</strong> No es caridad. Es que el foso no est&#225; en el c&#243;digo &#8212; que cualquiera puede forkear &#8212; sino en la capa de operaci&#243;n: inventario de proxies, uptime, scheduling, almacenamiento y tooling de compliance.</p><p>Regalaron el cebo. Venden la fontaner&#237;a.</p><p>---</p><h2><strong>El An&#225;lisis: el Modelo de Actors es Serverless con Entrada y Salida Tipadas</strong></h2><p>Aqu&#237; es donde el tutorial se separa del chiste. Porque un "Actor" en Apify no es "c&#243;digo subido a la nube". Es un cambio de mentalidad:</p><p><strong>*Un scraper deja de ser un script y se convierte en un microservicio serverless con contrato de entrada, contrato de salida y ciclo de vida.</strong>*</p><p>Envolver tu crawler con el patr&#243;n Actor:</p><p>```javascript</p><p>// main.js &#8212; el mismo c&#243;digo corre en local y en la nube</p><p>import { Actor } from 'apify';</p><p>import { CheerioCrawler } from 'crawlee';</p><p>await Actor.main(async () =&gt; {</p><p>const input = await Actor.getInput(); // viene del INPUT_SCHEMA</p><p>const { urls, maxItems } = input;</p><p>const crawler = new CheerioCrawler({</p><p>maxRequestsPerCrawl: maxItems,</p><p>requestHandler: async ({ request, $ }) =&gt; {</p><p>await Actor.pushData({</p><p>url: request.url,</p><p>titulo: $('h1').text().trim(),</p><p>});</p><p>},</p><p>});</p><p>await crawler.run(urls);</p><p>console.log('Actor completado.');</p><p>});</p><p>```</p><p>Con un `INPUT_SCHEMA.json` que declara qu&#233; acepta tu Actor:</p><p>```json</p><p>{</p><p>"title": "Raspador de ejemplo",</p><p>"type": "object",</p><p>"properties": {</p><p>"urls": { "type": "array", "items": { "type": "string" } },</p><p>"maxItems": { "type": "integer", "minimum": 1, "maximum": 1000 }</p><p>},</p><p>"required": ["urls"]</p><p>}</p><p>```</p><p>Ejecutas eso con `apify run` en local. Cuando funciona, haces `apify push` y el mismo c&#243;digo corre en un runtime serverless de Apify &#8212; escalando, con retries y con los resultados escritos en un dataset acoplado.</p><p>Ya no es un script. <strong>*Es una pieza componible en un sistema m&#225;s grande.</strong>*</p><p>---</p><h2><strong>El An&#225;lisis (II): la Ola LLM le Dio la Vuelta a la Narrativa</strong></h2><p>Apify pas&#243; de "raspamos webs" a "alimentamos modelos y agentes de IA". Ese giro no es cosm&#233;tico. Es real, y cambia c&#243;mo deber&#237;as arquitecturar tus outputs.</p><p>Tres razones concretas:</p><p>1. <strong>Los sistemas RAG necesitan datos actuales</strong> que ning&#250;n periodo de entrenamiento de un modelo fundacional puede tener.</p><p>2. <strong>Los conjuntos de evaluaci&#243;n necesitan ground truth capturado hoy</strong> &#8212; no datos de hace seis meses.</p><p>3. <strong>Los frameworks de agentes permiten que un LLM invoque un scraper como tool a mitad de tarea.</strong></p><p>La consecuencia pr&#225;ctica: en 2026, raspas para que un agente o un pipeline de datos consuma tu output. Eso significa <strong>JSON limpio y con esquema definido gana a HTML bonito</strong>, siempre.</p><p>Los tutoriales cl&#225;sicos de scraping te ense&#241;an a guardar el HTML crudo. El futuro es un Actor que devuelve schema-shaped JSON que un LLM puede parsear sin instrucciones adicionales.</p><p>---</p><h2><strong>El Framework de los 5 Movimientos del Actor</strong></h2><p>Vale, vamos a cortar el rollo te&#243;rico. Este es el <strong>Framework de los 5 Movimientos del Actor</strong> &#8212; el m&#233;todo &#250;nico de operador que uso para cualquier recolector nuevo.</p><h3><strong>Paso 1: Forkea antes de escribir c&#243;digo</strong></h3><p>Busca en el Apify Store un Actor que se aproxime a tu objetivo. No reedites la rueda.</p><p>Los source code de los Actors del Store son open source. Cl&#243;nalos en un proyecto local de Crawlee, inspecciona su `INPUT_SCHEMA` y entiende qu&#233; hacen antes de escribir una sola l&#237;nea.</p><p>La ruta t&#237;pica de 2026 es: <strong>reusar &#8594; forkear &#8594; customizar &#8594; desplegar.</strong> No empezar de cero.</p><h3><strong>Paso 2: Construye y estresa en local con Crawlee</strong></h3><p>Elige tu tipo de crawler deliberadamente:</p><ul><li><p><strong>CheerioCrawler</strong> para p&#225;ginas est&#225;ticas r&#225;pidas</p></li><li><p><strong>Playwright/PuppeteerCrawler</strong> solo donde el renderizado sea imprescindible</p></li></ul><p>Activa siempre el session pool y configura la l&#243;gica de reintentos. <strong>Asume que el objetivo te va a bloquear.</strong> No lo asumas cuando ocurra.</p><h3><strong>Paso 3: Convierte el script en Actor</strong></h3><p>Envu&#233;lvelo en `Actor.main()`, declara el `INPUT_SCHEMA` (URLs, selectores, l&#237;mites) y el output (dataset + key-value store). Prueba end-to-end con `apify run` en local.</p><p>Configura la compliance desde el d&#237;a uno &#8212; respeta `robots.txt` y limita con `maxRequestsPerCrawl`:</p><p>```javascript</p><p>// Defiende tu reputaci&#243;n de IP desde la primera ejecuci&#243;n</p><p>const crawler = new CheerioCrawler({</p><p>maxRequestsPerCrawl: 500,</p><p>maxConcurrency: 5,</p><p>// Pol&#237;tica cort&#233;s: no impactes al objetivo</p><p>});</p><p>```</p><h3><strong>Paso 4: Despliega y operacionaliza</strong></h3><p>`apify push` a la nube. Conecta el scheduling y monitoriza la tasa de requests bloqueados. Si ese n&#250;mero sube, quieres saberlo t&#250; &#8212; antes de que lo note tu consumidor downstream.</p><h3><strong>Paso 5: Dise&#241;a para el pipeline de IA</strong></h3><p>Exponer el Actor terminado como API o tool invocable &#8212; mediante la API de Apify, una integraci&#243;n con LangChain o una definici&#243;n de tool para un agente.</p><p>```javascript</p><p>// Un agente LLM llama a otro Actor como tool</p><p>// Esto convierte el scraping en una tool-call dentro del loop del agente</p><p>const resultado = await Actor.call('tu-usuario/raspador-ejemplo', {</p><p>urls: ['https://ejemplo.com/productos'],</p><p>maxItems: 20,</p><p>});</p><p>// resultado.dataset &#8594; JSON esquematizado, listo para el LLM</p><p>```</p><p><strong>Trata el scraper como un microservicio de datos, no como un script de un solo uso.</strong> Esa es la mentalidad m&#225;s a prueba de futuro que puedes adoptar.</p><p>---</p><h2><strong>Las Objeciones que te Est&#225;s Planteando Ahora</strong></h2><p><strong>"&#191;Y por qu&#233; no ejecuto Scrapy en mi propio VPS?"</strong></p><p>Para trabajos peque&#241;os de un solo uso, self-hosting est&#225; genial. Dicho sin rodeos. Pero hay un impuesto operativo oculto: rotaci&#243;n de proxies, reputaci&#243;n de IP, backoff de reintentos, scheduling, durabilidad de almacenamiento y monitoring &#8212; todo se convierte en tu problema.</p><p>El c&#225;lculo cambia cuando necesitas recolecci&#243;n continua y resiliente. Ah&#237; es donde un VPS barato te cuesta m&#225;s en horas de operaci&#243;n de lo que ahorras en infraestructura.</p><p><strong>"Si hay cientos de Actors listos en el Store, &#191;para qu&#233; escribir c&#243;digo?"</strong></p><p>Los Actors listos son un punto de partida, no una l&#237;nea de meta. Los objetivos cambian su markup y su postura anti-bot en semanas. Necesitar&#225;s selectores custom, manejo de paginaci&#243;n, flujos de autenticaci&#243;n o reshaping de output.</p><p>El c&#243;digo open source es el producto real: fork&#233;alo, ad&#225;ptalo y solo paga por la operaci&#243;n.</p><p><strong>"&#191;No es scraping una violaci&#243;n de t&#233;rminos de servicio o GDPR?"</strong></p><p>Abordemos esto sin ambig&#252;edad:</p><ul><li><p>`robots.txt` y T&#233;rminos de Servicio <strong>no son lo mismo que la ley</strong></p></li><li><p>Los datos personales activan obligaciones de GDPR independientemente de la herramienta</p></li><li><p>Apify incluye utilidades de cumplimiento con `robots.txt` y gu&#237;as</p></li></ul><p>Trata el scraping como una pr&#225;ctica de ingenier&#237;a defendible con guardarra&#237;les. No como un hack de sombrero gris. Respeta `robots.txt`, limita tu tasa, no recolectes datos personales sin base legal &#8212; y estar&#225;s construyendo algo que sobrevive tanto a auditores como a GitHub Issues.</p><p>---</p><h2><strong>El Resumen que te Llevas</strong></h2><p>El scraping no es un problema de selectores CSS. Es un problema de orquestaci&#243;n anti-fr&#225;gil.</p><p>Crawlee es el cerebro open source que gestiona sesiones, reintentos y detecci&#243;n de bloqueo. Apify es la capa de operaci&#243;n que ejecuta ese c&#243;digo como un Actor serverless &#8212; con scheduling, almacenamiento y escalado que nunca se ejecuta en tu port&#225;til.</p><p><strong>Los cinco movimientos:</strong> forkear el Store &#8594; estresar en local &#8594; envolver como Actor &#8594; desplegar con monitoring &#8594; exponerlo como data microservice para tu pipeline de IA.</p><p>La empresa que tiene scraping como <em>operaci&#243;n</em>, no como <em>c&#243;digo</em>, es la que gana cuando el objetivo cambia su markup a las 2 de la madrugada.</p><p>Construye el scraper que sobreviva a la ejecuci&#243;n 47. Porque esa ejecuci&#243;n va a llegar &#8212; la &#250;nica pregunta es si tu pipeline la atraviesa en pie.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/apify-web-scraping-tutorial-2026-20260904?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Tu Primer Cliente Empaquetó el Artefacto Equivocado: Extrae el Estado Recurrente, No el Entregable]]></title><description><![CDATA[El 90% de las primeras productizaciones fracasan: empaquetan el informe est&#225;tico en vez del dato vivo. Checklist de 5 puntos antes de construir producto.]]></description><link>https://newsletter.brianmenagomez.com/p/tu-primer-cliente-empaqueto-el-artefacto</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/tu-primer-cliente-empaqueto-el-artefacto</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Fri, 04 Sep 2026 07:00:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ba37f46d-7463-446b-894b-bad6c2907848_1080x810.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 90% de las Primeras Productizaciones Fracasan &#8212; y No Es por el Producto. Es por Confundir a un Cliente Feliz con un Mercado Validado.</strong></h2><p>Crees que tu primer cliente fue tu validaci&#243;n. Que entregaste un trabajo brillante, que pag&#243; a gusto, que te dijo "esto lo comprar&#237;a cualquier empresa".</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>El 90% de las primeras productizaciones fracasan exactamente en ese punto. Y no por mala ejecuci&#243;n, ni por falta de calidad, ni por un producto feo.</p><p>Fracasan porque <strong>confundes una relaci&#243;n interpersonal con un segmento de mercado validado</strong>.</p><p>Tu primer cliente no compr&#243; tu producto. Compr&#243; tu capacidad de improvisar bajo ambig&#252;edad. Compr&#243; que le cogieras el tel&#233;fono, que entendieras su contexto sin que te lo explicara del todo, que iteraras quince veces sobre un entregable mal definido.</p><p><strong>*Ninguna de esas se&#241;ales se transfiere a un desconocido.</strong>*</p><p>El error gemelo es definir el "producto" por los entregables que produjiste para un solo cliente. Empaquetas el informe. La plantilla. El dashboard. Y llamas a eso producto.</p><p>Es historia. No producto.</p><p>Llevo a&#241;os enviando software en Espa&#241;a. He visto docenas de agencias y freelancers morir en esta bifurcaci&#243;n. La se&#241;al no es que un cliente pagara una vez con entusiasmo. La se&#241;al es que varios desconocidos verbalicen el mismo dolor &#8212; sin tu ayuda y sin haberte visto nunca.</p><p>En este art&#237;culo te doy el checklist que separa el oro de la paja antes de que inviertas un solo d&#237;a construyendo.</p><h2><strong>La Trampa del Sesgo de Supervivencia Inverso</strong></h2><p>Aqu&#237; est&#225; lo que nadie te dice cuando miras agencias que "productizaron tras su primer cliente".</p><p>Casi todas mintieron (o al menos, comprimieron la historia).</p><p>Cuando una agencia te ense&#241;a su servicio productizado en la web, suele haber tenido <strong>entre 5 y 10 clientes parecidos antes de empaquetar</strong>. Pero venden la narrativa como si el producto hubiera nacido del encargo n&#250;mero uno.</p><p>Ese es el sesgo de supervivencia inverso: solo ves a los que sobrevivieron al jinete del caballo blanco de un buen primer cliente. No ves a los cientos que empaquetaron el artefacto de un informe one-off y murieron en el intento porque ning&#250;n desconocido lo compr&#243;.</p><p>La cifra del 90% es un marco argumentativo, no un estudio externo. Pero el mecanismo es real y destruye m&#225;s operaciones que cualquier error t&#233;cnico.</p><p>Mec&#225;nica del fallo:</p><p>&#8594; Un fundador entrega un proyecto bespoke excelente a un cliente.</p><p>&#8594; El cliente, encantado, dice que "comprar&#237;a esto como producto".</p><p>&#8594; El fundador construye durante meses alrededor del entregable espec&#237;fico que produjo para ese cliente.</p><p>&#8594; Saca el producto. Los desconocidos no lo compran.</p><p>&#8594; El fundador concluye que "no ten&#237;a demanda". En realidad nunca la testeo.</p><p>El primer cliente <strong>no demuestra que haya demanda</strong>. Demuestra que t&#250; sabes construir rapport y entregar bajo ambig&#252;edad. Exactamente las dos competencias que menos se transfieren a extra&#241;os.</p><p>Un case study valida calidad de entrega y relaci&#243;n. No valida tama&#241;o de mercado. Un segmento necesita repetibilidad y compradores que no te conocen. No an&#233;cdotas.</p><h2><strong>La Bifurcaci&#243;n Real: Datos Vivos vs. Informe Est&#225;tico</strong></h2><p>Aqu&#237; est&#225; la decisi&#243;n que separa al producto del servicio renombrado.</p><p>Todo proyecto que entregas produce uno de dos tipos de output:</p><p>&#10060; <strong>Informe est&#225;tico</strong> &#8212; Un entregable one-off cuyo valor se deprecia a cero en el momento de la entrega. Una auditor&#237;a. Un informe de mercado. Un estudio de viabilidad. Un an&#225;lisis de seguridad puntual. Se factura una vez, se entrega, se acab&#243;. Si lo empaquetas, no has creado un producto: has creado <strong>un PDF con alcance</strong>. Eso es un servicio renombrado.</p><p>&#9989; <strong>Estado de datos vivos</strong> &#8212; Una necesidad que cambia por s&#237; sola y exige actualizaci&#243;n recurrente. El estado de cumplimiento normativo de una empresa. El inventario en tiempo real de un sector. El estado de las convocatorias de ayudas que afectan a un cliente. La operaci&#243;n de monitorizaci&#243;n de algo que muta cada semana.</p><p>La distinci&#243;n es brutal: <strong>el producto no es el entregable que produjiste. Es el umbral recurrente que dispara tu trabajo.</strong></p><p>Pongo un ejemplo m&#237;o. Gestiono gestoriascercademi.com, un directorio de gestor&#237;as en Espa&#241;a. Eso no naci&#243; de un informe est&#225;tico para un cliente. Naci&#243; de un dato vivo: la geolocalizaci&#243;n cambiante del tejido de asesor&#237;as y la demanda de b&#250;squeda local que muta cada trimestre. El dato vivo justifica la actualizaci&#243;n. La actualizaci&#243;n justifica la recurrencia.</p><p>Un informe no. Un informe es una foto. Nadie paga una suscripci&#243;n mensual por ver la misma foto.</p><p>Esto conecta directamente con el aprendizaje RaaS que ya document&#233;: <strong>el 90% de los nichos de suscripci&#243;n mueren antes de lanzar porque el fundador elige datos que cambian demasiado despacio</strong> para justificar una suscripci&#243;n mensual.</p><p>Si el dato del cliente cambia una vez al a&#241;o, no hay raz&#243;n para que nadie pague mensualmente. El nicho muere igual que muere el producto extra&#237;do del informe one-off. Misma ra&#237;z: falta de cadencia de cambio.</p><p>Diagn&#243;stico obligatorio antes de construir nada:</p><p>&#8594; &#191;El valor que entregaste muere al entregarlo, o renace solo porque el mundo sigue girando?</p><p>&#8594; &#191;El estado del problema del cliente cambia sin que t&#250; lo toques?</p><p>&#8594; &#191;Podr&#237;as escribir un cron job que detectara cu&#225;ndo hay que regenerar ese valor?</p><p>Si respondes no a las tres, <strong>no tienes un producto. Tienes un servicio con buena presentaci&#243;n.</strong></p><h2><strong>La Prueba de Recompra Sin Preguntar</strong></h2><p>El segundo error que mata la primera productizaci&#243;n es testear la demanda preguntando.</p><p>"&#191;Comprar&#237;as esto otra vez, [nombre del cliente]?"</p><p><strong>*Un "s&#237;, me encant&#243;" no es validaci&#243;n. Es cortes&#237;a post-entrega.</strong>*</p><p>La intenci&#243;n declarada post-entrega est&#225; contaminada por la relaci&#243;n. Ese cliente te debe favores, le caes bien, le resolviste un problema real. Por supuesto que dice que s&#237;. Decir no ser&#237;a un acto social desagradable.</p><p>El test real tiene dos capas:</p><p><strong>Capa 1 &#8212; La necesidad viva existe sin ti.</strong> &#191;El dato del cliente seguir&#237;a cambiando aunque desaparecieras? Si la respuesta es "no, el proyecto acab&#243; y ya no hay nada que actualizar", no hay recurrencia. Da igual lo que diga el cliente.</p><p><strong>Capa 2 &#8212; Desconocidos lo verbalizan solos.</strong> Encuentra al menos 3 desconocidos (no referidos por el cliente #1) que describan el mismo problema <strong>con sus propias palabras</strong> y el mismo umbral de dolor. Si nadie lo verbaliza sin que t&#250; lo nombres primero, el segmento no existe.</p><p>Aqu&#237; la trampa es sutil: un primer cliente conseguido por recomendaci&#243;n c&#225;lida es <strong>una muestra contaminada</strong>. Su compra arrastra el capital social del referidor. No es una se&#241;al limpia de demanda; es una se&#241;al de que alguien influyente apost&#243; por ti.</p><p>La se&#241;al limpia es la compra de un extra&#241;o que no te conoce, no ha visto tu trabajo y aun as&#237; paga por un output definido.</p><h2><strong>El Checklist de 5 Decisiones Antes de Construir Tu Producto</strong></h2><p>No hace falta esperar a tener 3 clientes parecidos para empezar. Tampoco hace falta rechazar al cliente #1. Lo que hay que hacer es <strong>tratarlo como fuente de datos y de relaci&#243;n, no como validaci&#243;n.</strong></p><p>Corre este checklist antes de escribir una l&#237;nea de c&#243;digo o dise&#241;ar una landing page. La validaci&#243;n y el arranque son actividades paralelas, no secuenciales.</p><h3><strong>Paso 1 &#8212; Diagnostica el Tipo de Necesidad</strong></h3><p>&#191;Datos vivos o informe est&#225;tico? Si el entregable fue puntual, no es producto. Es historia. Si existe un estado de datos u operaci&#243;n que cambia y exige actualizaci&#243;n, hay candidato a suscripci&#243;n.</p><p>&#10060; "Mi primer cliente me pidi&#243; un estudio de mercado. Lo empaqueto como producto."</p><p>&#9989; "Mi primer cliente necesita saber cada mes qu&#233; ayudas p&#250;blicas le afectan. El estado del mercado regulatorio cambia solo. Es dato vivo."</p><h3><strong>Paso 2 &#8212; Separa la Capa de Relaci&#243;n del Entregable</strong></h3><p>Haz dos listas:</p><p>&#8594; Lo que el cliente #1 compr&#243; por confianza y rapport: iteraciones infinitas, ambig&#252;edad, llamadas a cualquier hora, contexto que entendiste sin que te lo explicaran.</p><p>&#8594; Lo que se puede estandarizar en un entregable definido que un desconocido aceptar&#237;a <strong>sin conocerte ni haberte visto jam&#225;s</strong>.</p><p>La primera lista es tu servicio consultivo. No muere: se vende por horas o por proyecto. La segunda lista es tu candidato a producto.</p><p>El error t&#237;pico es empaquetar la primera lista y llamarla producto. Eso explica por qu&#233; tantos "productos" extra&#237;dos de un cliente son en realidad servicios renombrados con un PDF de alcance.</p><h3><strong>Paso 3 &#8212; Testea la Recompra Antes de Construir</strong></h3><p>No preguntes "&#191;te gust&#243;?". Pregunta: <strong>"Si pudiera entregarte este resultado cada [mes/trimestre] sin que tengas que record&#225;rmelo, &#191;lo contratar&#237;as &#8212; y a qu&#233; cadencia?"</strong></p><p>Y aunque responda s&#237;, no lo tomes como validaci&#243;n final. Un solo cliente feliz no es un mercado.</p><p>Un "s&#237;, me encant&#243;" no es validaci&#243;n. Es cortes&#237;a post-entrega.</p><h3><strong>Paso 4 &#8212; Encuentra 3 Desconocidos Que Verbalicen el Mismo Dolor</strong></h3><p>Sal a por compradores que no te conozcan. LinkedIn, comunidades sectoriales, b&#250;squeda de problemas. La pregunta no es "&#191;te interesa mi soluci&#243;n?". La pregunta es <strong>"&#191;cu&#225;l es el mayor dolor que tienes con [el tema]?"</strong></p><p>Si tres desconocidos describen el mismo problema con sus propias palabras y el mismo umbral de dolor &#8212; sin que t&#250; introduzcas el concepto &#8212; hay segmento. Si nadie lo verbaliza solo, no existe.</p><h3><strong>Paso 5 &#8212; Define Precio y Alcance Alrededor del Resultado Recurrente</strong></h3><p>El precio se ancla al estado de los datos vivos, no a las horas empleadas ni al artefacto hist&#243;rico que entregaste al cliente #1.</p><p>Tu producto cobra por mantener un problema del cliente en un estado controlado. No cobra por el informe que ya redactaste una vez.</p><p>La m&#233;trica de &#233;xito no es "cu&#225;ntos entregables produzco". Es <strong>"cu&#225;nto tiempo el problema del cliente permanece resuelto sin que yo intervenga &#8212; y qu&#233; pasa cuando deja de estarlo"</strong>.</p><p>Ese segundo t&#233;rmino es la oportunidad de recurrencia.</p><h2><strong>La Se&#241;al Que Buscas No Es un Cliente Feliz. Es un Extra&#241;o Que Paga.</strong></h2><p>Vuelvo al principio para rematar.</p><p>Un cliente feliz valida tu capacidad de construir relaci&#243;n y entregar bajo ambig&#252;edad. Son competencias valiosas &#8212; se venden caras por proyecto. Pero no son un producto.</p><p>El producto nace cuando a&#237;slas el dato vivo, lo separas del artefacto est&#225;tico, y encuentras desconocidos que verbalizan el mismo dolor sin que se lo nombres.</p><p>El entregable del cliente #1 es historia. El umbral recurrente que activa tu servicio es el producto. <strong>La bifuraci&#243;n del dato vivo es el filtro que separa al operador que productiza del que renombra su servicio.</strong></p><p>No hace falta esperar a tener tres clientes para empezar. Hace falta dejar de tratar al primero como validaci&#243;n y empezar a tratarlo como fuente de datos. Corre el checklist antes de construir. La validaci&#243;n y el arranque son actividades paralelas, no secuenciales.</p><p>El mercado no premia al que entrega bien un proyecto. Premia al que encuentra el dato que nunca deja de cambiar y construye alrededor de su ritmo.</p><p>Ah&#237; est&#225; tu producto. B&#250;scalo ah&#237;, no en el informe que ya entregaste.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/primer-cliente-productizar-estado-recurrente-checklist-20260904?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El 90% de los Nichos RaaS Están Muertos Antes de Empezar — y No es por Falta de Demanda]]></title><description><![CDATA[El 90% de los nichos RaaS mueren antes de existir. Aprende el filtro de 3 se&#241;ales para elegir nicho con suscripci&#243;n viable: frecuencia, pago real y competencia.]]></description><link>https://newsletter.brianmenagomez.com/p/el-90-de-los-nichos-raas-estan-muertos-267</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-90-de-los-nichos-raas-estan-muertos-267</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Thu, 03 Sep 2026 07:00:17 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7a5e3cc1-d081-40a8-8424-742661680344_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 90% de los Nichos RaaS Est&#225;n Muertos Antes de Empezar &#8212; y el Autopsy No Dice "No Hay Demanda"</strong></h2><p>Crees que un nicho RaaS fracasa porque no tiene suficiente demanda. O porque el mercado est&#225; demasiado saturado.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>El 90% de los nichos RaaS mueren antes de lanzar por una raz&#243;n m&#225;s simple y m&#225;s estructural: <strong>el fundador eligi&#243; datos que cambian demasiado despacio para justificar que alguien te pague dos veces.</strong></p><p>Lo he visto en los productos que he enviado desde Espa&#241;a &#8212; conversoriaecnae.es, gestoriascercademi.com, Juridica Integral &#8212; y lo he visto en el an&#225;lisis de nichos ajenos. El patr&#243;n se repite con precisi&#243;n quir&#250;rgica.</p><p>No es un problema de demanda. Es un problema de temporalidad.</p><p>El cliente racional no pagar&#225; una suscripci&#243;n mensual por datos que solo cambian trimestralmente. Comprar&#225; una vez. Y en la segunda renovaci&#243;n te preguntar&#225; por qu&#233; no lo produce &#233;l mismo en casa.</p><p>Vamos a desmontar el mito y construir lo &#250;nico que importa: <strong>el filtro que separa un nicho con suscripci&#243;n viable de un informe de una sola venta.</strong></p><p>---</p><h2><strong>El Espejismo de los Datos de Mercado</strong></h2><p>Empecemos por la trampa m&#225;s seductora de todas: los datos de mercado.</p><p>El consejo convencional de selecci&#243;n de nicho dice que elijas donde la demanda sea m&#225;s visible. Y no hay demanda m&#225;s visible que los datos de mercado. Todo el mundo habla de la econom&#237;a, de los tipos de inter&#233;s, de la inflaci&#243;n de los precios.</p><p><strong>*Pero el inter&#233;s visible no es pago real.</strong>*</p><p>Todos tienen inter&#233;s en la econom&#237;a. Casi nadie tiene una partida presupuestaria recurrente dedicada a un feed econ&#243;mico gen&#233;rico. El espejismo de los datos de mercado funciona as&#237;:</p><ul><li><p>La demanda "parece" alta porque todos hablan del tema.</p></li><li><p>Los incumbentes y las fuentes gratuitas ya responden la pregunta.</p></li><li><p>El cliente tiene alternativas en un feed RSS, en un informe trimestral gratuito, en un analista al que ya paga.</p></li></ul><p>El resultado: <strong>un nicho que se siente vivo y que monetiza p&#233;simamente.</strong></p><p>El inter&#233;s visible es la m&#233;trica equivocada. Lo que separa un nicho real de una charla de sal&#243;n es una pregunta mucho m&#225;s inc&#243;moda:</p><p>&gt; &#10060; "&#191;Le parece &#250;til al cliente esta informaci&#243;n?"</p><p>&gt; &#9989; "&#191;Qu&#233; est&#225; haciendo ESTE cliente HOY para resolver este problema?"</p><p>La disposici&#243;n a pagar no se declara. Se demuestra con comportamiento existente.</p><p>---</p><h2><strong>Se&#241;al #1: Disposici&#243;n a Pagar por Comportamiento, No por Inter&#233;s</strong></h2><p>La primera de las tres se&#241;ales que realmente importan es la disposici&#243;n a pagar. Y el discriminador limpio es el comportamiento actual.</p><p>Un cliente que <strong>ya paga a un analista, una suscripci&#243;n a una herramienta, o horas internas de un empleado</strong> para responder esta pregunta es un nicho real.</p><p>Un cliente que encontrar&#237;a tus datos "&#250;tiles" es una conferencia, no un mercado.</p><p>El truco est&#225; en la evidencia concreta. Si tu cliente objetivo ya est&#225; gastando recursos en el problema, tienes presupuesto que desviar. Si no est&#225; gastando nada, est&#225;s pidiendo a alguien que cree un presupuesto nuevo &#8212; y esa es la venta m&#225;s cara del mundo.</p><p>Esto explica por qu&#233; el nicho de datos de mercado se siente vivo pero monetiza mal: todo el mundo est&#225; interesado en la econom&#237;a, casi nadie mantiene un gasto recurrente dedicado a un feed econ&#243;mico gen&#233;rico.</p><p><strong>La pregunta correcta no es "&#191;le interesa?" Es "&#191;en qu&#233; gasta hoy para responder esta pregunta?"</strong></p><p>Busca uno de estos tres comportamientos:</p><ul><li><p><strong>Paga una suscripci&#243;n o herramienta</strong> que responde el problema de forma parcial.</p></li><li><p><strong>Paga horas a un analista o consultor</strong> que lo resuelve con fricci&#243;n.</p></li><li><p><strong>Paga salario interno</strong> de un empleado junior que lo produce a mano cada semana.</p></li></ul><p>Cualquiera de los tres significa que hay dinero circulando. El punto dos y el tres son especialmente interesantes &#8212; representan fricci&#243;n que tu RaaS elimina.</p><p>---</p><h2><strong>Se&#241;al #2: La Cadencia de Cambio que Nadie Audita</strong></h2><p>La segunda se&#241;al es la que la mayor&#237;a de fundadores nunca inspecciona: <strong>&#191;con qu&#233; frecuencia cambian los datos subyacentes?</strong></p><p>Este es el motor oculto del churn. Y nadie lo audita antes de construir.</p><p>Piensa en la l&#243;gica del cliente. Si los datos cambian trimestralmente, su movimiento racional es comprar una vez y redecidir cada trimestre. &#191;Por qu&#233; mantener una suscripci&#243;n mensual para un informe que solo cambia cada tres meses?</p><p>Y aqu&#237; est&#225; el peligro real: en la segunda renovaci&#243;n, el cliente no solo redecidir&#225;. <strong>Cuestionar&#225; si merece la pena producir los datos en casa.</strong></p><p>Los datos con cadencia mensual o superior, o los datos dirigidos por eventos, fuerzan dependencia continua. Convierten el modelo de entrega en algo natural: no est&#225;s reportando, est&#225;s <strong>monitorizando</strong>.</p><h3><strong>La auditor&#237;a de cadencia</strong></h3><p>Antes de escribir una sola l&#237;nea de c&#243;digo, haz esto:</p><p><strong>Paso 1:</strong> Escribe el nicho candidato y su fuente de datos subyacente.</p><p><strong>Paso 2:</strong> Define la cadencia natural de cambio: diaria, semanal, mensual, trimestral, dirigida por eventos.</p><p><strong>Paso 3:</strong> S&#233; honesto. Si la respuesta es trimestral o m&#225;s lenta, asume que est&#225;s construyendo un informe de una sola venta, no una suscripci&#243;n &#8212; hasta que se demuestre lo contrario.</p><p>La regla es brutal pero simple: <strong>los datos que cambian despacio destruyen el modelo de suscripci&#243;n por dise&#241;o.</strong></p><p>Esto no significa un veto duro. Un nicho con datos trimestrales puede funcionar si el flujo de trabajo del cliente est&#225; construido alrededor de esa cadencia y la producci&#243;n interna es costosa. Pero es la excepci&#243;n, no la regla. Y el riesgo es estructural: en alg&#250;n momento el cliente construir&#225; la capacidad interna.</p><h3><strong>El bonus doble: datos frecuentes y desordenados</strong></h3><p>Aqu&#237; hay una capa que pocos analizan. Los datos que cambian a menudo <strong>pero en formas desordenadas y no estandarizadas</strong> son doblemente atractivos.</p><p>&#191;Por qu&#233;?</p><p>Porque la capacidad de reproducir de forma consistente un entregable &#8212; lo que he llamado en art&#237;culos anteriores <strong>el contrato de datos</strong> &#8212; es genuinamente dif&#237;cil de copiar cuando la fuente de datos es ca&#243;tica.</p><p>Los datos limpios que cambian a menudo pueden ser replicados por cualquiera con un cron job y un buen parser. Los datos desordenados que cambian a menudo requieren una arquitectura que tolere la suciedad, normalice los inputs y garantice consistencia. Eso es dif&#237;cil. Y lo dif&#237;cil es donde vive la ventaja competitiva real.</p><p>---</p><h2><strong>Se&#241;al #3: Limitadas Alternativas Competitivas &#8212; y las Dos Causas del "No Hay Competencia"</strong></h2><p>La tercera se&#241;al es la m&#225;s malinterpretada del framework.</p><p>Ves un nicho donde no hay competencia y asumes luz verde. <strong>*Mal.</strong>*</p><p>La baja competencia tiene dos causas muy diferentes:</p><p><strong>Causa A &#8212; Descuido:</strong> Los incumbentes ignoran el nicho porque les queda peque&#241;o o porque est&#225; fuera de su foco. Aqu&#237;, luz verde: puedes ocupar la posici&#243;n de especialista.</p><p><strong>Causa B &#8212; Ausencia total de dinero:</strong> Nadie paga por ello porque no hay valor real. Aqu&#237;, luz roja: no hay competencia porque no hay mercado.</p><p>La prueba discriminadora es esta: <strong>&#191;responde el incumbente a la pregunta adyacente bien y simplemente se salta esta?</strong> Si s&#237;, es descuido &#8212; oportunidad. Si falla por completo, es ausencia de valor &#8212; trampa.</p><h3><strong>El mapa de sustitutos</strong></h3><p>Haz el mapa honesto de todas las alternativas que tiene el cliente hoy:</p><ul><li><p><strong>Agregadores gratuitos</strong> que responden la pregunta con un feed RSS o un dashboard p&#250;blico.</p></li><li><p><strong>Vendors incumbentes</strong> que la resuelven como feature secundario de un producto mayor.</p></li><li><p><strong>La hoja de c&#225;lculo del cliente</strong> donde un junior la produce cada lunes con dolor.</p></li></ul><p>El cliente ya resuelve el problema hoy. Tu preguntas es: <strong>&#191;lo paga, lo sufre, y lo produce con fricci&#243;n suficiente para que prefiera suscribirse a construirlo?</strong></p><p>El nicho RaaS defendible no est&#225; donde no hay alternativa. Est&#225; donde <strong>la alternativa es tan dolorosa o costosa que el cliente prefiere pagar recurrencia a producirla &#233;l mismo.</strong></p><p>---</p><h2><strong>El Filtro de las 3 Se&#241;ales: La Intersecci&#243;n Que Buscas</strong></h2><p>Has visto las tres se&#241;ales por separado. Ahora la jugada maestra: <strong>el nicho ganador existe solo en la intersecci&#243;n de las tres.</strong></p><p>Propongo un framework que puedes ejecutar en un d&#237;a &#8212; <strong>el Filtro de 3 Se&#241;ales para Nichos RaaS.</strong></p><h3><strong>Se&#241;al 1 &#8212; Disposici&#243;n a pagar</strong></h3><p><strong>Test de comportamiento existente.</strong> &#191;El cliente gasta hoy dinero, herramientas o tiempo interno en este problema? Interesado no paga. Comportamiento actual paga.</p><h3><strong>Se&#241;al 2 &#8212; Frecuencia de cambio</strong></h3><p><strong>Auditor&#237;a de cadencia.</strong> &#191;Los datos cambian mensualmente o m&#225;s a menudo? &#191;Est&#225;n dirigidos por eventos? &#191;Y son lo bastante desordenados para que la producci&#243;n consistente sea genuinamente dif&#237;cil?</p><h3><strong>Se&#241;al 3 &#8212; Alternativas limitadas</strong></h3><p><strong>Mapa de sustitutos.</strong> &#191;Responde hoy alguien a esta pregunta? &#191;La responde bien pero se salta tu nicho (descuido = oportunidad) o falla por completo (ausencia de valor = trampa)?</p><p>---</p><h3><strong>C&#243;mo puntuar tu nicho hoy</strong></h3><p><strong>Paso 1:</strong> Escribe tu nicho candidato en una hoja.</p><p><strong>Paso 2:</strong> Audita la cadencia. Si es trimestral o m&#225;s lenta, salvo excepciones demostrables, asume que no es una suscripci&#243;n.</p><p><strong>Paso 3:</strong> Busca evidencia de gasto existente. No intereses. Gasto. Un cliente que paga a un analista hoy es un mercado. Un cliente que encuentra tus datos &#250;tiles es una audiencia.</p><p><strong>Paso 4:</strong> Mapea los sustitutos. Trata el "no hay competencia" como luz verde solo si el incumbente ignora el nicho por descuido, no porque no haya dinero.</p><p><strong>Paso 5:</strong> Pregunta si el entregable soporta un contrato de datos. &#191;Puedes definir un esquema estable y una salida de monitorizaci&#243;n reproducible? Si los datos son demasiado inestables para contratar sobre ellos, lo que tienes es consultor&#237;a, no RaaS.</p><p>Solo el nicho que pasa las tres se&#241;ales con luz verde merece tu arquitectura. <strong>El 90% de los nichos muere en la se&#241;al 2.</strong> Antes de escribir c&#243;digo, antes de onboarding un primer cliente &#8212; ejecuta el filtro.</p><p>---</p><h2><strong>Sobre la Cifra del 90% &#8212; S&#233; Honesto Contigo Mismo</strong></h2><p>Vale. Hablemos claro sobre la cifra.</p><p>El 90% es una estimaci&#243;n interna, un patr&#243;n observado a trav&#233;s de intentos de nicho RaaS que he analizado y construido. No hay un dataset auditado detr&#225;s. La fuente del mecanismo es el contenido original de este thread, no una estad&#237;stica publicada.</p><p><strong>*&#191;Y qu&#233;?</strong></p><p>El valor intelectual no est&#225; en el n&#250;mero. Est&#225; en el mecanismo. Un 70%, un 80%, un 90% &#8212; cualquiera de esas cifras apunta a la misma conclusi&#243;n: <strong>la mayor&#237;a de los nichos mueren por una decisi&#243;n estructural evitable.</strong></p><p>Pod&#233;is falsificar el filtro con vuestro propio nicho en un d&#237;a. Poned el n&#250;mero por delante, sometedlo a prueba contra vuestras tres se&#241;ales, y dejad que el resultado hable &#8212; no la cifra.</p><p>Esto es lo que separa un filtro de una opini&#243;n: los filtros se pueden falsificar.</p><p>---</p><h2><strong>El Patr&#243;n de Entrega Correcto Nace del Nicho Correcto</strong></h2><p>Un apunte final sobre el orden de las operaciones.</p><p>Los art&#237;culos anteriores de este thread establecieron dos verdades de arquitectura:</p><p>1. El producto de un RaaS no es el informe. Es <strong>la entrega fiable y habitual de monitorizaci&#243;n.</strong></p><p>2. La ventaja competitiva es <strong>la reproducibilidad y consistencia del entregable</strong>, resuelta con un contrato de datos.</p><p>La selecci&#243;n de nicho es el prequel de ambas. No puedes dise&#241;ar una arquitectura de entrega hasta que sabes si el nicho produce la frecuencia y la suciedad de datos que la justifican.</p><p>Los datos frecuentes y desordenados fuerzan la arquitectura de monitorizaci&#243;n que ya describ&#237;. Los datos limpios y lentos no la justifican. <strong>El nicho que elijas determina qu&#233; arquitectura es viable.</strong></p><p>No construyas la capa de entrega antes de auditar la cadencia. Es construir infraestructura para un problema que todav&#237;a no has confirmado que existe.</p><p>---</p><h2><strong>Resumen: Las Tres Se&#241;ales y lo Que Viene Despu&#233;s</strong></h2><p>El 90% de los nichos RaaS mueren antes de existir &#8212; y el autopsy no dice falta de demanda.</p><p>Dice datos que cambian demasiado lento para que alguien te pague dos veces.</p><p>El nicho ganador es la intersecci&#243;n de tres se&#241;ales:</p><p>1. <strong>Disposici&#243;n a pagar demostrada por comportamiento actual</strong>, no por inter&#233;s declarado.</p><p>2. <strong>Datos con cadencia mensual o superior</strong>, y lo bastante desordenados para que la producci&#243;n consistente sea dif&#237;cil de copiar.</p><p>3. <strong>Alternativas limitadas por descuido del incumbente</strong>, no por ausencia de valor.</p><p>Ejecuta el <strong>Filtro de las 3 Se&#241;ales</strong> sobre tu nicho antes de invertir un solo euro en arquitectura o en onboarding de clientes.</p><p>El 90% de los nichos que auditas van a fallar el filtro. Y ese es el mejor resultado posible: <strong>fallar antes de construir es el &#250;nico fallo que te ahorra dinero.</strong></p><p>Los nichos RaaS que sobreviven no son los que tienen m&#225;s demanda visible. Son los que alimentan una decisi&#243;n recurrente con datos que nadie m&#225;s puede entregar de forma fiable &#8212; y que el cliente ya paga por resolver hoy.</p><p>La pr&#243;xima vez que te enamores de un nicho por su demanda visible, preg&#250;ntate una sola cosa:</p><p><strong>*&#191;Qu&#233; est&#225; haciendo el cliente HOY para resolver esto, y cu&#225;nto le duele?</strong>*</p><p>Esa respuesta te dir&#225; m&#225;s que cualquier dashboard de keywords del mundo.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/nicho-rasa-filtro-3-senales-seleccion-20260903?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Claude Code no es un Autocompletado Mejorado. Es un Operario que Posee el Loop Completo — y Eso Cambia Qué Determina la Calidad]]></title><description><![CDATA[Claude Code no es un copiloto de la IDE: es un agente que edita, ejecuta tests y corrige sus propios errores desde la terminal. Aprende a dominar CLAUDE.md, hooks y modos de permiso para que la autonom&#237;a sea segura.]]></description><link>https://newsletter.brianmenagomez.com/p/claude-code-no-es-un-autocompletado</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/claude-code-no-es-un-autocompletado</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Thu, 03 Sep 2026 07:00:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/71157f7c-c673-4232-ba04-476cd1a957c8_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>La Herramienta de C&#243;digo M&#225;s Disruptiva de este Ciclo no Tiene Chat Lateral, Panel de Extensiones ni Overlay de Resaltado &#8212; Es una Terminal Pelada donde Escribes `claude` y Dejas de Escribir</strong></h2><p>Porque empieza a escribir los tests. Los ejecuta. Lee el stack trace. Corrige su propio fallo. Y hace commit.</p><p><strong>*Ese cambio en qui&#233;n posee el loop vale m&#225;s que cualquier upgrade de modelo.</strong> *</p><p>Durante a&#241;os la industria asumi&#243; que el siguiente paso en IA para c&#243;digo era un autocompletado mejor o un chat inline en tu editor. El marco de Cursor y Copilot: el humano escribe, la IA sugiere.</p><p>El supuesto equivocado es que el modelo es el producto y la IDE es su casa.</p><p>Claude Code relocaliza la IA de "motor de sugerencias en el margen" a "trabajador aut&#243;nomo que posee el loop completo desde una terminal". Y la consecuencia contraria es la que casi nadie ve:</p><p><strong>*Lo que determina la calidad del output deja de ser la creatividad de tu prompt o el IQ del modelo. Se convierte en dos cosas: la higiene del contexto y el dise&#241;o de la gobernanza.</strong> *</p><p>Equipos que "solo apuntan al agente al repo" obtienen resultados mediocres y culpan al modelo. Equipos que tratan CLAUDE.md como una constituci&#243;n y los tests como una red de seguridad obtienen un resultado distinto con el mismo modelo.</p><p>El cuello de botella se ha movido. Ya no est&#225; en el modelo. Est&#225; en el repositorio y en el proceso que lo rodea.</p><h2><strong>Por Qu&#233; la Terminal, y no la IDE, es Donde los Agentes Cobraron Vida</strong></h2><p>En una IDE, la IA es un motor de sugerencias. Propone un diff y espera a que un humano lo aplique.</p><p><strong>No puede observar las consecuencias de sus propias acciones.</strong></p><p>En una terminal, Claude Code puede editar un fichero, ejecutar tu suite de tests, leer el stack trace, volver a editar y re-ejecutar. Es un bucle de feedback cerrado donde el agente <em>experimenta los resultados de lo que ha hecho</em>.</p><p>Ese bucle de autocorrecci&#243;n es la diferencia arquitect&#243;nica entre un copiloto y un agente.</p><p>&#10060; <strong>Copiiloto</strong>: propone c&#243;digo &#8594; t&#250; lo aplicas &#8594; t&#250; ejecutas &#8594; t&#250; corriges</p><p>&#9989; <strong>Agente</strong>: planifica &#8594; edita &#8594; ejecuta tests &#8594; lee el fallo &#8594; corrige &#8594; re-ejecuta &#8594; commitea</p><p>Es exactamente por eso que los vendors que corren a pegar "ag&#233;ntico" al chat lateral de la IDE est&#225;n peleando contra la forma equivocada. La fortaleza de la IDE &#8212; la proximidad a tu cursor &#8212; es precisamente lo que la mantiene como motor de sugerencias en lugar de agente.</p><p>La terminal no es un retroceso. Es el &#250;nico lugar donde el loop cierra.</p><h3><strong>La Bestia del Loop Ag&#233;ntico: Latencia y Tokens</strong></h3><p>Este dise&#241;o no es gratis. Un agente que de verdad <em>posee</em> el trabajo ejecuta decenas de llamadas de tool secuenciales por tarea: leer un fichero, editar este, ejecutar tests, leer el output, volver a editar...</p><p>Cada paso consume latencia y tokens.</p><p>Por eso Anthropic ha posicionado una clase de modelo m&#225;s r&#225;pida y ligera como el caballo de batalla ag&#233;ntico por defecto, reservando los modelos m&#225;s grandes para planificaci&#243;n compleja y ediciones de alto riesgo.</p><p><strong>*El throughput ag&#233;ntico es un objetivo de optimizaci&#243;n distinto a "mejor respuesta &#250;nica".</strong> *</p><p>Si eliges el modelo solo por su mejor single shot, est&#225;s optimizando para el problema equivocado. Aqu&#237; el trabajo no es una respuesta. Son decenas de pasos secuenciales donde cada milisegundo y cada token cuentan.</p><h2><strong>El Contexto es el Nuevo Prompt Engineering &#8212; y CLAUDE.md es la Palanca</strong></h2><p>Llevamos a&#241;os obsesionados con el system prompt. En los agentes, el texto de mayor palanca no es ese.</p><p><strong>Es el fichero de memoria del repositorio, cargado en cada sesi&#243;n.</strong></p><p>Ejecutas `/init` en Claude Code y la herramienta escanea tu repo, analiza estructura y convenciones, y genera un CLAUDE.md base.</p><p>Ah&#237; empieza el trabajo real. Porque el CLAUDE.md que genera la herramienta es un borrador. Tu trabajo es convertirlo en una constituci&#243;n.</p><h3><strong>El Patr&#243;n de las Tres Categor&#237;as Cr&#237;ticas</strong></h3><p>Hay tres categor&#237;as de contenido en tu CLAUDE.md que determinan la calidad del agente m&#225;s que cualquier otra cosa:</p><p>1. <strong>Comandos prohibidos</strong>: qu&#233; NO debe ejecutar jam&#225;s. Migraciones de base de datos destructivas, `git push --force`, `rm -rf` fuera de rutas de build.</p><p>2. <strong>Convenciones de estilo</strong>: c&#243;mo se escribe el c&#243;digo en *este* repo. No gen&#233;rico. Espec&#237;fico. Naming, estructura de ficheros, manejo de errores.</p><p>3. <strong>Mapa de m&#243;dulos</strong>: qu&#233; fichero pertenece a qu&#233; capa. Fronteras de responsabilidad. Qu&#233; tocar y qu&#233; no.</p><p>Un repo con arquitectura documentada con claridad, comandos prohibidos expl&#237;citos y convenciones impuestas produce resultados aut&#243;nomos dram&#225;ticamente mejores.</p><p>Una sesi&#243;n apuntada a un monorepo sin documentar se degrada a medida que el ruido llena la ventana de contexto.</p><p>Ah&#237; es donde `/compact` (que resume la conversaci&#243;n para mantener el contexto dentro de los l&#237;mites) y los subagentes existen para luchar contra esa degradaci&#243;n: podando y particionando contexto.</p><h2><strong>La Autonom&#237;a Convierte la Gobernanza en un Problema de Dise&#241;o, no de Confianza</strong></h2><p>El argumento est&#225;ndar contra los agentes es simple: <em>"no voy a dejar que una m&#225;quina ejecute comandos arbitrarios en mi repo. Una edici&#243;n mala y lo corrompo."</em></p><p>Es la objeci&#243;n m&#225;s fuerte. Y merece una respuesta dedicada, con configuraci&#243;n real.</p><p>Claude Code gestiona la autonom&#237;a con capas: modos de permiso, hooks de ciclo de vida y checkpoints.</p><h3><strong>Los Tres Modos que Todo Equipo Debe Dominar</strong></h3><ul><li><p><strong>`plan`</strong>: el agente propone cambios y espera tu aprobaci&#243;n antes de tocar un fichero.</p></li><li><p><strong>`default`</strong>: ejecuta comandos y ediciones tras pedirte confirmaci&#243;n en cada paso.</p></li><li><p><strong>`acceptEdits`</strong>: ediciones sin preguntar, pero a&#250;n controlado por los hooks.</p></li></ul><p>Empezar en modo `plan` no es cobard&#237;a. Es la fase de aprendizaje donde calibras qu&#233; sabe hacer el agente antes de soltarle las riendas.</p><h3><strong>Los Hooks como Capa de Cumplimiento Normativo</strong></h3><p>La autonom&#237;a se vuelve segura cuando la pol&#237;tica es c&#243;digo. Los hooks de ciclo de vida (`PreToolUse`, `PostToolUse`, `Notification`, `Stop`) se declaran en ficheros JSON de settings.</p><p>Este es el snippet que bloquea lo destructivo y te avisa cuando el agente se para:</p><p>```json</p><p>{</p><p>"hooks": {</p><p>"PreToolUse": [</p><p>{</p><p>"matcher": "Bash",</p><p>"hooks": [</p><p>{</p><p>"type": "command",</p><p>"command": "if echo \"$TOOL_INPUT\" | grep -qE 'rm -rf|git push --force|drop table'; then echo '{\"decision\":\"block\",\"reason\":\"Comando destructivo bloqueado por policy\"}'; exit 0; fi"</p><p>}</p><p>]</p><p>}</p><p>],</p><p>"Stop": [</p><p>{</p><p>"matcher": "",</p><p>"hooks": [</p><p>{</p><p>"type": "command",</p><p>"command": "curl -s -X POST https://tu-endpoint.webhook/agente-parado -d '{\"msg\":\"Claude Code ha terminado o fallado\"}'"</p><p>}</p><p>]</p><p>}</p><p>]</p><p>}</p><p>}</p><p>```</p><p>No le preguntas al agente <em>"&#191;puedo confiar en ti?"</em>. Le defines <em>qu&#233; le est&#225; permitido hacer</em> y <em>qu&#233; pasa cuando se para</em>.</p><p><strong>*Trata al agente como a un ingeniero nuevo con credenciales limitadas, no como a un or&#225;culo omnisciente.</strong> *</p><p>Los equipos que triunfan con agentes tratan los hooks como una capa de cumplimiento. Bloquean comandos destructivos. Exigen aprobaci&#243;n antes de push. Notifican en Stop.</p><p>Esto reencuadra la cr&#237;tica est&#225;ndar &#8212; "la IA no es de fiar con mi c&#243;digo" &#8212; como un problema de ingenier&#237;a resoluble de scopes y pol&#237;ticas. No como un juicio moral sobre la IA.</p><h2><strong>Marco de Implementaci&#243;n: La Constituci&#243;n del Repositorio</strong></h2><p>No es teor&#237;a. Es un orden de operaciones. Cinco pasos que convierten un agente desatado en un trabajador aut&#243;nomo con guardarra&#237;les.</p><h3><strong>Paso 1: Empieza Peque&#241;o y Planifica Primero</strong></h3><p>Elige un repo peque&#241;o y bien testeado para tus primeras sesiones. Lanza Claude Code en modo `plan` y deja que proponga cambios.</p><p>Revisa su plan antes de que toque un solo fichero.</p><h3><strong>Paso 2: Ejecuta `/init` y Cura el CLAUDE.md con Agresividad</strong></h3><p>El fichero generado es el esqueleto. Tu trabajo es codificar las tres categor&#237;as cr&#237;ticas: comandos prohibidos, convenciones y mapa de m&#243;dulos.</p><p>As&#237; se ve un fragmento bien curado:</p><p>```markdown</p><h1>CLAUDE.md &#8212; Constituci&#243;n del Repositorio</h1><h2>Reglas no negociables</h2><ul><li><p>NO ejecutar migraciones DDL directamente en producci&#243;n.</p></li></ul><p>Usa siempre `prisma migrate deploy` via CI.</p><ul><li><p>NO usar `git push --force` en ramas compartidas.</p></li><li><p>NO borrar ficheros fuera de `src/` sin aprobaci&#243;n humana.</p></li></ul><h2>Estilo</h2><ul><li><p>TypeScript estricto. Sin `any` impl&#237;cito.</p></li><li><p>Funciones puras fuera de componentes. Hooks en `hooks/`.</p></li><li><p>Errores se lanzan con causas nombradas, nunca gen&#233;ricos.</p></li></ul><h2>Mapa de m&#243;dulos</h2><ul><li><p>`src/api/` &#8594; handlers de API. Sin l&#243;gica de negocio.</p></li><li><p>`src/domain/` &#8594; reglas de negocio. Prohibido importar HTTP aqu&#237;.</p></li><li><p>`src/repos/` &#8594; acceso a datos. Solo se habla con la base de datos.</p></li></ul><p>```</p><p><strong>Cada sesi&#243;n carga este fichero.</strong> Cada promesa que le haces aqu&#237; es contexto durable que le ahorras al agente tener que adivinar.</p><h3><strong>Paso 3: Institucionaliza el Loop de TDD</strong></h3><p>Instruye al agente para que escriba primero un test que falle. Implemente hasta que la suite est&#233; en verde. Y revises cada cambio con `git diff` antes de aceptarlo.</p><p>La suite de tests se convierte en tu red de seguridad para la autonom&#237;a. No el humano. El test.</p><h3><strong>Paso 4: A&#241;ade Pol&#237;tica Encima de la Autonom&#237;a Antes de Escalar</strong></h3><p>Los hooks de `settings.json` que bloquean invocaciones de tools peligrosas y notifican en Stop. Capa de cumplimiento antes de soltar m&#225;s autonom&#237;a.</p><h3><strong>Paso 5: Escala Solo Tras Probar la Confianza Local</strong></h3><p>Descomp&#243;n el trabajo repetido en subagentes (ficheros Markdown bajo `.claude/agents/`) y comandos slash (`/changelog`, por ejemplo) bajo `.claude/commands/`. Las tools externas se conectan v&#237;a MCP servers.</p><p>Y cuando el agente demuestre fiabilidad local, grad&#250;alo a ejecuci&#243;n headless (`.claude -p`), Agent SDK o GitHub Actions. Siempre con un gate de revisi&#243;n humana obligatoria sobre el diff producido.</p><h3><strong>El Salto al Pipeline</strong></h3><p>El mismo loop que arregla un test local fallido puede programarse para hacer triage de pull requests o parchear issues autom&#225;ticamente en cada push.</p><p>La consecuencia es un cambio de rol del ingeniero. Dedicas menos tiempo a escribir cada l&#237;nea y m&#225;s a definir pol&#237;tica y revisar diffs producidos por el agente.</p><p><strong>El gate de revisi&#243;n se mueve m&#225;s temprano. Y la suite de tests, no el humano, se convierte en la primera l&#237;nea de defensa.</strong></p><h2><strong>La Objeci&#243;n del Repo Legacy</strong></h2><p>&#191;"Esto solo funciona en proyectos greenfield limpios; mi monorepo legacy es un caos y el agente se va a perder"?</p><p>Justo. Y parcialmente cierto.</p><p>Por eso el argumento honesto es el de la higiene del contexto: la curaci&#243;n de CLAUDE.md, `/compact`, los subagentes y la descomposici&#243;n de tareas con scope limitado son <em>precisamente</em> las herramientas para codebases grandes y desordenados.</p><p>Hay que conceder la correlaci&#243;n entre calidad de documentaci&#243;n del repo, cobertura de tests y &#233;xito ag&#233;ntico. No sobrevender la herramienta.</p><p>Pero &#8212; y esto es clave &#8212; ese trabajo de documentaci&#243;n y tests es exactamente el que har&#237;as para que cualquier ingeniero nuevo fuera productivo. Un agente solo hace que ese coste tenga retorno m&#225;s r&#225;pido.</p><h2><strong>La Verdad Inc&#243;moda</strong></h2><p>Claude Code no es un autocompletado mejorado con extra steps.</p><p>Un copiloto sugiere c&#243;digo mientras el humano posee la tarea. Claude Code posee la tarea de principio a fin desde la terminal, donde puede ejecutar comandos y observar resultados.</p><p>La diferencia de unidad de trabajo no es cosm&#233;tica. Es arquitect&#243;nica.</p><p>Y la consecuencia es que el pato de los agentes no se decide por el hardware del modelo. Se decide por cu&#225;nta disciplina tienes en el repo: qu&#233; permites, qu&#233; documentas, qu&#233; bloqueas y qu&#233; testes.</p><p><strong>El modelo ya no es el l&#237;mite. Tu repositorio lo es.</strong></p><p>Por eso el mismo agente que rinde mediocre en un monorepo sin documentar se convierte en un operario fiable en un repo con una constituci&#243;n clara y una suite de tests que muerde.</p><p>Los que aprendan a tratar el CLAUDE.md como una constituci&#243;n y los hooks como una capa de cumplimiento van a entregar software a una velocidad que los que pelean contra la forma de la herramienta no van a poder igualar.</p><p><strong>*El pr&#243;ximo salto no va a venir de un modelo m&#225;s listo. Va a venir de un repositorio mejor gobernado.</strong> *</p><p>Y la terminal pelada donde escribes `claude` y dejas de escribir &#8212; ese es el lugar donde se va a decidir todo.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/claude-code-agente-terminal-loop-seguro-20260903?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Tu Cliente Casi Nunca Visitará el Portal Que Estás Construyendo — y Si lo Diseñas Bien, Ese Es el Punto]]></title><description><![CDATA[Dise&#241;a portales cliente RaaS de presencia cero: el valor se entrega con push, contratos de datos y cadencia fija. El producto no es el informe, es la certeza.]]></description><link>https://newsletter.brianmenagomez.com/p/tu-cliente-casi-nunca-visitara-el</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/tu-cliente-casi-nunca-visitara-el</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Wed, 02 Sep 2026 07:00:12 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3c02fe49-9e5b-4367-b493-b5f323613f75_1080x810.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Tu Cliente Casi Nunca Visitar&#225; el Portal Que Est&#225;s Construyendo &#8212; y Si lo Dise&#241;as Bien, Ese Es el Punto</h2><p>Crees que el factor cr&#237;tico de tu Research-as-a-Service es impresionar. Un dashboard brillante. Gr&#225;ficos que se actualizan en vivo. M&#225;s fuentes de datos que tu competencia.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>El producto que tu cliente compra no es el informe en pantalla. Es la certeza tranquila, llegando a tiempo, de que alguien sigue vigilando. Y esa certeza se entrega con <em>push</em> &#8212; no con un portal que el cliente deba recordar visitar.</p><p>Tu cliente casi nunca entrar&#225; en el portal. Si lo dise&#241;as bien, eso no es un fallo. Es el objetivo.</p><h3>El Error de Tratar tu Entrega Como un SaaS</h3><p>Todo el pensamiento de producto mainstream optimiza para engagement. DAU. Time-on-page. Profundidad de sesi&#243;n. Cuantas m&#225;s visitas, mejor.</p><p><strong>*Para un sistema de entrega, una visita es una se&#241;al de fallo.</strong>*</p><p>Significa que el cliente tuvo que gastar esfuerzo para obtener el valor que ya pag&#243;. Significa que la monitorizaci&#243;n no lleg&#243; sola. Significa que tu sistema le pidi&#243; trabajo.</p><p>La investigaci&#243;n no es un evento que se encarga. Es un h&#225;bito. Un sistema de entrega perpetua. Y el h&#225;bito se construye con repetici&#243;n predecible, no con un portal brillante que nadie abre.</p><p>&#10060; <strong>Enfoque d&#233;bil:</strong> Dashboard impresionante dise&#241;ado para que el cliente entre cada d&#237;a. M&#233;tricas de engagement como KPI de &#233;xito. M&#225;s features, m&#225;s datos, m&#225;s gr&#225;ficos.</p><p>&#9989; <strong>Enfoque correcto:</strong> Portal de presencia cero. El cliente nunca necesita entrar. Las alertas, el timeline y los informes llegan solos. Una visita se investiga como una anomal&#237;a.</p><p>El valor que tu cliente renueva no lo demuestra el tr&#225;fico del portal. Lo demuestra la continuidad sentida de la monitorizaci&#243;n.</p><h3>Por Qu&#233; la Tranquilidad Supera a la Informaci&#243;n</h3><p>Un insight obliga al cliente a interpretarlo. Ese es trabajo cognitivo. Y el trabajo cognitivo es ansiedad.</p><p>La certeza viene pre-digerida. Elimina una preocupaci&#243;n de la carga mental del cliente.</p><p>Esto reencuadra cada decisi&#243;n de entrega: <strong>el objetivo del informe, la alerta y el timeline no es ser brillante. Es estar presente y ser predecible.</strong></p><p>Un informe mediocre que llega puntual cada martes entrega m&#225;s valor percibido que un informe brillante que llega tarde o de forma espor&#225;dica.</p><p>Pi&#233;nsalo: cuando el cliente abre su email y ve que la monitorizaci&#243;n de esta semana ya est&#225;, una peque&#241;a alarma mental se apaga. <em>Todav&#237;a me est&#225;n vigilando.</em> Esa alarma que se apaga es el producto.</p><p>La informaci&#243;n es la prueba del trabajo que gana la confianza. Pero la suscripci&#243;n recurrente se compra por la fiabilidad.</p><h3>El Contrato de Datos No es Burocracia. Es tu Foso.</h3><p>Todo el mundo asume que la ventaja competitiva de un RaaS es el volumen de captura de datos. M&#225;s scraping. M&#225;s fuentes. M&#225;s cobertura.</p><p><strong>*El foso no es eso. El foso es aburrido.</strong>*</p><p>La ventaja competitiva se define por <strong>lo reproducible y consistente que es el entregable</strong> &#8212; no por tener m&#225;s datos que el vecino.</p><p>El problema de la consistencia se resuelve estructuralmente, con un contrato de datos y una arquitectura de tres capas. No a&#241;adiendo fuentes.</p><p>Sin un contrato definido por escrito, cada ciclo de entrega depende del humor de la persona que lo ejecuta, de la herramienta que est&#233; de moda, de la fuente que decidi&#243; cambiar su formato.</p><p>Con un contrato, el entregable es auditable y predecible. El cliente puede planificar decisiones de negocio alrededor de un informe que siempre llega con la misma estructura. <strong>Esa predictibilidad convierte a un proveedor en infraestructura. Y la infraestructura justifica un contrato recurrente, no una compra puntual.</strong></p><p>La arquitectura de tres capas existe precisamente para que esa consistencia sobreviva al caos de las fuentes de datos reales.</p><h3>Tu Ventaja No es el Scraping. Es No Hacer Scraping de M&#225;s.</h3><p>Veamos la arquitectura que lo sostiene. La pipeline se divide en tres capas con interfaces estables entre ellas:</p><p><strong>Capa 1 &#8212; Captura:</strong> Recogida de datos cruda. Aqu&#237; es donde la gente se pierde a&#241;adiendo fuentes infinitas.</p><p><strong>Capa 2 &#8212; An&#225;lisis:</strong> Procesamiento y transformaci&#243;n. Convierte datos en lo que el contrato exige.</p><p><strong>Capa 3 &#8212; Entrega:</strong> Generaci&#243;n del entregable final. Informe, alerta, entrada de timeline.</p><p>El contrato es la interfaz. Las capas son la implementaci&#243;n.</p><p>Esto importa porque <strong>la consistencia del entregable debe sobrevivir al cambio de personal, al cambio de herramientas y al cambio de fuentes de datos.</strong></p><p>Si el analista se va, la capa de an&#225;lisis cambia. Pero si el contrato est&#225; bien definido, el entregable que recibe el cliente es indistinguible. Si una fuente de datos muere, la capa de captura se adapta. Pero el informe sigue llegando el martes con la misma estructura.</p><p>&lt;img src="https://placehold.co/800x400" alt="Pipeline de tres capas con contrato de datos como interfaz" /&gt;</p><p>Eso es lo que convierte tu servicio en infraestructura. Y la infraestructura es lo que se renueva.</p><h3>El Timeline Completa el Bucle del H&#225;bito</h3><p>La investigaci&#243;n deja de ser un evento que el cliente encarga y <strong>se convierte en un ritmo en el que puede confiar</strong>.</p><p>El timeline es la capa de cadencia: el mismo d&#237;a, la misma estructura, cada ciclo.</p><p>El cliente abre su email un martes cualquiera y ve la entrada del timeline. Sin buscarla. Sin entrar en el portal. La monitorizaci&#243;n es visible, continua y reduce la ansiedad sin exigir esfuerzo.</p><p>Esas entradas del timeline son la prueba tangible de que el trabajo sigue pasando. Son la evidencia que justifica la renovaci&#243;n. Un cliente que ve actividad cada ciclo no es un cliente que se pregunta qu&#233; est&#225; pagando.</p><p>La tranquilidad del cliente viene de <strong>poder predecir la monitorizaci&#243;n, no de que le sorprendan con ella</strong>.</p><h3>Presencia Cero No es Comunicaci&#243;n Cero</h3><p>Aqu&#237; est&#225; la objeci&#243;n m&#225;s com&#250;n: "Si el cliente nunca entra, &#191;no parece que no estoy haciendo nada?"</p><p>Hay una distinci&#243;n cr&#237;tica entre <strong>presencia cero y comunicaci&#243;n cero</strong>.</p><p>La ausencia se refiere al esfuerzo del cliente. No a tu silencio como proveedor.</p><p>El sistema debe empujar regularmente y de forma visible. El timeline garantiza que el cliente vea actividad cada ciclo sin tener que buscarla. Las alertas llegan cuando cambia algo relevante. Los informes aparecen en su inbox con la cadencia pactada.</p><p>&#10060; <strong>Zero-communication:</strong> Construyes el portal, lo env&#237;as, y esperas a que el cliente entre. Si no entra, no ve nada. Y el mes que viene no renueva porque "no pasa nada".</p><p>&#9989; <strong>Zero-presence:</strong> El valor viaja en push. El timeline empuja entradas. Las alertas empujan notificaciones. Los informes empujan documentos. El portal existe como red de seguridad y registro de auditor&#237;a &#8212; no como destino.</p><p>El momento en que un cliente debe entrar al portal para obtener valor, tu sistema ya ha fallado.</p><h3>La Regla del "No Construir" Como Estrategia de Entrega</h3><p>Cada feature que a&#241;ades al portal es coste de infraestructura recurrente. Y en un sistema de entrega, <strong>el scope es una responsabilidad</strong>.</p><p>Un sistema m&#237;nimo que hace una sola cosa &#8212; entregar monitorizaci&#243;n predecible &#8212; supera a un portal rico en features que ocasionalmente se rompe o se desv&#237;a del contrato.</p><p>Pasa cada idea de feature propuesta por este filtro:</p><p>1. <strong>&#191;Aumenta la sensaci&#243;n del cliente de ser monitorizado?</strong> O solo a&#241;ade superficie, coste y modos de fallo.</p><p>2. <strong>&#191;Reduce el esfuerzo del cliente?</strong> O solo existe para impresionar a otro proveedor de servicios.</p><p>3. <strong>&#191;Est&#225; en el contrato?</strong> Si no est&#225;, no se construye.</p><p>La respuesta por defecto es no.</p><h3>El Marco de los 5 Pasos para Dise&#241;ar tu Portal de Presencia Cero</h3><p>Aqu&#237; tienes el orden exacto para implementarlo. Se llama <strong>el Modelo de Presencia Cero</strong> &#8212; una arquitectura de entrega donde el valor viaja en push y el portal es una red de seguridad, no un destino.</p><p><strong>Paso 1 &#8212; Codifica el contrato de datos primero.</strong></p><p>Escribe exactamente qu&#233; recibe el cliente cada ciclo: campos, formato, desencadenantes de cambio y cadencia. Cualquier desviaci&#243;n de ese contrato se trata como <strong>un incidente de producci&#243;n</strong>.</p><p>El contrato existe antes que cualquier trabajo de UI. Sin &#233;l, todo lo dem&#225;s es an&#233;cdota.</p><p><strong>Paso 2 &#8212; Construye la pipeline de tres capas.</strong></p><p>Captura &#8594; An&#225;lisis &#8594; Entrega. Interfaces estables entre capas. El contrato es la interfaz; las capas son la implementaci&#243;n.</p><p>As&#237; la consistencia del entregable sobrevive al cambio de personal, herramientas y fuentes.</p><p><strong>Paso 3 &#8212; Dise&#241;a el portal como presencia cero.</strong></p><p>El canal de entrega por defecto es push: entradas de timeline, alertas y digest programados que llegan sin acci&#243;n del cliente.</p><p>Define una visita como anomal&#237;a a investigar. No como un KPI a crecer.</p><p><strong>Paso 4 &#8212; Instituye el timeline como ritual fijo.</strong></p><p>El mismo d&#237;a. La misma estructura. Cada ciclo.</p><p>La cadencia convierte la investigaci&#243;n de evento en h&#225;bito. Y el h&#225;bito es lo que el cliente renueva.</p><p><strong>Paso 5 &#8212; Pasa cada feature por el filtro de "no construir".</strong></p><p>&#191;Aumenta la sensaci&#243;n de ser monitorizado, o solo a&#241;ade superficie y modos de fallo?</p><p>El tiempo es la &#250;nica moneda irrecuperable. Cada feature que no construyes es tiempo que recuperas.</p><h3>La Ventaja de la Quietud</h3><p>En un mundo donde los proveedores presumen de dashboards y de vol&#250;menes de datos, la jugada ganadora es la contraria.</p><p>Un sistema m&#225;s peque&#241;o. M&#225;s callado. M&#225;s fiable.</p><p>Que hace que el cliente se sienta <strong>vigilado, no impresionado</strong>.</p><p>La consistencia y la reproducibilidad superan al volumen de datos porque hacen que el entregable sea auditable y predecible. Y esa predictibilidad es lo que convierte a tu servicio en infraestructura &#8212; el &#250;nico tipo de proveedor que justifica un contrato recurrente en vez de una compra puntual.</p><p>Tu producto no es el informe que aparece en pantalla. Es la alarma mental del cliente que se apaga cada martes cuando ve que la monitorizaci&#243;n ya est&#225; hecha.</p><p>Dise&#241;a para esa alarma. Y acepta que el portal &#8212; si lo haces bien &#8212; quedar&#225; casi vac&#237;o.</p><p>Esa quietud es tu se&#241;al de que el sistema est&#225; funcionando. Un sistema de entrega que no exige visitas es el m&#225;s cercano al verdadero <strong>productized services business model</strong>: uno donde el producto no es el contenido, sino la certeza de que nunca dejar&#225; de llegar.</p><p>---</p><p><strong>Conclusiones clave:</strong></p><p>&#8594; El valor RaaS se entrega con push (timeline, alertas, digest), no con pull (un portal que el cliente debe recordar visitar).</p><p>&#8594; Una visita al portal es una se&#241;al de fallo, no una m&#233;trica de &#233;xito.</p><p>&#8594; El contrato de datos es tu verdadero foso: hace el entregable auditable, predecible y renovable.</p><p>&#8594; La pipeline de tres capas mantiene la consistencia cuando cambian personas, herramientas y fuentes.</p><p>&#8594; El filtro de "no construir" es una estrategia de entrega, no solo de eficiencia.</p><p>El futuro no pertenece a quien construye el dashboard m&#225;s impresionante. Pertenece a quien construye la certeza m&#225;s silenciosa.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/portal-presencia-cero-client-delivery-raas-20260902?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El 80% de tu Esfuerzo en RaaS Está en el Sitio Equivocado: Automatiza la Entrega, No el Scraping]]></title><description><![CDATA[Tu RaaS no pierde clientes por falta de datos, sino por entregables inconsistentes. Aprende a automatizar la capa de entrega con un contrato de datos y tres capas separadas.]]></description><link>https://newsletter.brianmenagomez.com/p/el-80-de-tu-esfuerzo-en-raas-esta</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-80-de-tu-esfuerzo-en-raas-esta</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Tue, 01 Sep 2026 07:00:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7729da9a-d62f-44cb-92e7-4bdfc2750ecc_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 80% de tu Esfuerzo en RaaS Est&#225; en el Sitio Equivocado: Automatiza la Entrega, No el Scraping</strong></h2><p>Crees que el problema de tu Research-as-a-Service es que no capturas suficientes datos. Que necesitas m&#225;s scrapers, m&#225;s fuentes, m&#225;s volumen para que el servicio parezca serio.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>Tu problema no es que te falten datos: es que <strong>tus clientes se dan de baja porque cada informe que reciben llega con una estructura distinta</strong>. Mientras el 80% de tu esfuerzo est&#225; en scrapear, la batalla que de verdad retiene clientes se libra en la capa de entrega &#8212; y la est&#225;s perdiendo.</p><p>El 80/20 est&#225; invertido. Y la mayor&#237;a de las agencias digitales que montan servicios de investigaci&#243;n nunca lo notan porque est&#225;n demasiado ocupadas optimizando lo que pueden medir.</p><p>---</p><h3><strong>Por Qu&#233; Todos Creen Que el Problema es el Volumen de Datos</strong></h3><p>Hay una raz&#243;n estructural por la que los equipos RaaS invierten el 80% de su esfuerzo en la capa de recolecci&#243;n: <strong>el scraping es medible</strong>. URLs visitadas, p&#225;ginas descargadas, documentos procesados. Son m&#233;tricas que puedes poner en un dashboard y mostrar a tu equipo.</p><p>La calidad de la entrega, en cambio, es subjetiva. Dif&#237;cil de cuantificar. Requiere que alguien mire cada informe y juzgue si la estructura es coherente.</p><p>Esto es un cl&#225;sico <strong>efecto Goodhart</strong>: los equipos optimizan lo que pueden medir, aunque sea lo que menos impacta en la retenci&#243;n. La recolecci&#243;n se ha commoditizado &#8212; Scrapy, Playwright, APIs p&#250;blicas y LLMs para resumir hacen que traer datos sea barato y casi infinito &#8212; mientras que el churn se concentra en la &#250;ltima milla: estructura inconsistente, formato variable, citaci&#243;n descuidada, cadencia irregular.</p><p>&#10060; <strong>Lo que hace la mayor&#237;a:</strong> a&#241;ade m&#225;s fuentes al pipeline y mejora los scrapers</p><p>&#9989; <strong>Lo que retiene clientes:</strong> define un contrato de entrega, separa el pipeline en capas y automatiza el QA del entregable final</p><p>---</p><h3><strong>El 80/20 Invertido, en la Pr&#225;ctica</strong></h3><p>Piensa en tu propio pipeline. &#191;D&#243;nde se va el tiempo real de tu equipo?</p><ul><li><p><strong>Collection:</strong> escribir y mantener scrapers, lidiar con cambios de HTML, rotar proxies</p></li><li><p><strong>Processing:</strong> normalizar datos, limpiar, verificar citas, estructurar hallazgos</p></li><li><p><strong>Delivery:</strong> dar formato final, revisar que todo cuadre, enviar al cliente</p></li></ul><p>Si eres como el 80% de los operadores de RaaS, casi todo tu esfuerzo est&#225; en la primera capa. Y la primera capa es exactamente la que <strong>ya no produce diferenciaci&#243;n</strong>.</p><p>Aqu&#237; est&#225; la verdad inc&#243;moda: traer datos ya no es el trabajo caro. Es la normalizaci&#243;n de estructura, la verificaci&#243;n de citas y el formateo lo que decide si tu cliente renueva. Los equipos que invierten en la &#250;ltima milla <strong>reducen retrabajo y aumentan retenci&#243;n sin a&#241;adir ni una sola fuente nueva a su pipeline</strong>.</p><p>Yo lo veo con mis propios productos. En <strong>conversoriaecnae.es</strong> o <strong>gestoriascercademi.com</strong>, el valor no est&#225; en cu&#225;ntos registros capturo. Est&#225; en que cada entrega llega con la misma estructura, la misma cadencia y la misma fiabilidad &#8212; semana tras semana. Eso es lo que hace que un servicio de retenci&#243;n se sostenga.</p><p>---</p><h3><strong>El Content Lake Aplicado a Investigaci&#243;n</strong></h3><p>La soluci&#243;n estructural no es m&#225;s scraping. Es una <strong>arquitectura de tres capas</strong> que separa la recolecci&#243;n del procesamiento y de la entrega, en lugar de un &#250;nico monolito donde todo se mezcla.</p><p>Y hay una analog&#237;a perfecta que ya hemos cubierto en este hilo: <strong>Sanity.io no es un CMS. Es una base de datos de contenido (el content lake) con un editor open source encima</strong>. Los equipos fallan cuando buscan un dashboard en vez de escribir un esquema de contenido.</p><p>Traslada esa lecci&#243;n a tu RaaS y obtienes esto: en vez de producir un PDF por cliente, produces <strong>objetos de investigaci&#243;n estructurados</strong> &#8212; hallazgos, fuentes con URL y fecha de acceso, metadatos, nivel de confianza. Objetos que se pueden rebanar por cliente, actualizar incrementalmente y versionar.</p><p>El entregable final es una <strong>vista sobre los datos</strong>, no el almacenamiento. Quien entiende esto puede servir a diez clientes con la misma base de datos. Quien no, rehace cada informe desde cero.</p><p>Aqu&#237; est&#225; el contrato de datos que define cada entregable:</p><p>```json</p><p>{</p><p>"$schema": "https://example.com/contracts/research-deliverable/v1",</p><p>"type": "object",</p><p>"required": ["client_id", "topic", "generated_at", "findings"],</p><p>"properties": {</p><p>"client_id": { "type": "string", "pattern": "^cli_" },</p><p>"topic": { "type": "string" },</p><p>"generated_at": { "type": "string", "format": "date-time" },</p><p>"findings": {</p><p>"type": "array",</p><p>"minItems": 1,</p><p>"items": {</p><p>"type": "object",</p><p>"required": ["claim", "sources", "confidence"],</p><p>"properties": {</p><p>"claim": { "type": "string" },</p><p>"confidence": { "enum": ["high", "medium", "low"] },</p><p>"sources": {</p><p>"type": "array",</p><p>"minItems": 1,</p><p>"items": {</p><p>"type": "object",</p><p>"required": ["url", "accessed_at", "title"],</p><p>"properties": {</p><p>"url": { "type": "string", "format": "uri" },</p><p>"accessed_at": { "type": "string", "format": "date" },</p><p>"title": { "type": "string" }</p><p>}</p><p>}</p><p>}</p><p>}</p><p>}</p><p>}</p><p>}</p><p>}</p><p>```</p><p>Cada cliente es una vista sobre este mismo esquema. Cambias el `client_id`, el formato de salida, el template &#8212; y el contrato sigue siendo el mismo.</p><p>---</p><h3><strong>Tres Capas, No Un Monolito</strong></h3><p>Aqu&#237; est&#225; el <strong>fragmento clave</strong> del framework que te propongo. Se llama <strong>El Patr&#243;n del Contrato de Datos</strong> y tiene tres capas, cada una con su propio artefacto de entrada y salida:</p><p><strong>Capa 1 &#8212; Collection (scrapea amplio y barato):</strong></p><p>```python</p><h1>scrape_wide.py &#8212; Capa 1: solo recolecta crudo, sin pulir</h1><p>from scrapy import Spider</p><p>from datetime import datetime</p><p>class WideCollector(Spider):</p><p>name = "wide_collector"</p><h1>Output: fichero crudo, sin normalizar</h1><p>def parse(self, response):</p><p>yield {</p><p>"raw_html": response.text[:5000],</p><p>"url": response.url,</p><p>"crawled_at": datetime.utcnow().isoformat(),</p><h1>SIN estructura de negocio. Eso es trabajo de la Capa 2.</h1><p>}</p><p>```</p><p><strong>Capa 2 &#8212; Processing (extracci&#243;n y normalizaci&#243;n con IA):</strong></p><p>```python</p><h1>normalize.py &#8212; Capa 2: objetos estructurados, listos para el contrato</h1><p>from pydantic import BaseModel</p><p>class Finding(BaseModel):</p><p>claim: str</p><p>confidence: str  # high | medium | low</p><p>sources: list[Source]  # validados contra el contrato</p><p>def process(raw_records: list[dict]) -&gt; list[Finding]:</p><h1>LLM resume y estructura. La salida CUMPLE el contrato de datos.</h1><p>return [llm_extract(record) for record in raw_records]</p><p>```</p><p><strong>Capa 3 &#8212; Delivery (templates + QA + formato final):</strong></p><p>```python</p><h1>deliver.py &#8212; Capa 3: QA autom&#225;tico + formato por cliente</h1><p>def validate_deliverable(payload: dict) -&gt; bool:</p><p>errors = []</p><p>if "findings" not in payload or len(payload["findings"]) == 0:</p><p>errors.append("Sin hallazgos")</p><p>for f in payload["findings"]:</p><p>if not all(s["url"].startswith("http") for s in f["sources"]):</p><p>errors.append(f"Fuente inv&#225;lida en: {f['claim'][:50]}")</p><p>if f["confidence"] not in {"high", "medium", "low"}:</p><p>errors.append(f"Confianza inv&#225;lida: {f['confidence']}")</p><h1>Un entregable que no pasa QA NUNCA llega al cliente</h1><p>return len(errors) == 0, errors</p><p>```</p><p>Ninguna capa depende del formato de salida de otra. Puedes cambiar el scraper sin tocar el template. Puedes cambiar el template sin rehacer el pipeline de datos.</p><p>---</p><h3><strong>El Stretch Goal: Servir a Escala con una Base de Datos</strong></h3><p>Cuando separas las capas, algo m&#225;gico ocurre: <strong>puedes servir a m&#225;s clientes sin m&#225;s horas de trabajo</strong>.</p><p>Tu equipo ya no rehace el informe desde cero. Recompila datos, ejecuta la normalizaci&#243;n, valida contra el contrato, y genera el formato del cliente. La IA puede recompilar, actualizar y re-formatear por cliente <strong>sin rehacer el trabajo</strong>.</p><p>Y aqu&#237; entra la lecci&#243;n bootstrapped que hemos cubierto antes en este hilo: <strong>no construyas una plataforma de entrega a medida "por si acaso"</strong>. El tiempo es la &#250;nica moneda irrecuperable, y la infraestructura especulativa se paga en velocidad presente. En un RaaS bootstrapped, esa velocidad es literalmente la capacidad de servir m&#225;s clientes.</p><p>Usa herramientas existentes. Un content lake como Sanity, la API de Notion, o incluso un generador de documentaci&#243;n. <strong>El contrato de datos es tuyo; la infraestructura no tiene por qu&#233; serlo.</strong></p><p>---</p><h3><strong>El Marco de 5 Pasos para Implementar el Patr&#243;n del Contrato de Datos</strong></h3><p><strong>Paso 1 &#8212; Define primero el contrato de entrega.</strong> Un esquema &#250;nico y versionado de cada entregable, ANTES de escribir un solo scraper. El cliente no compra datos: compra un formato, una estructura y una cadencia. Escribe el JSON Schema primero.</p><p><strong>Paso 2 &#8212; Separa el pipeline en tres capas con SLAs propios.</strong> Collection scrapea amplio y barato. Processing normaliza con IA. Delivery aplica templates y QA. Que ninguna capa dependa del formato de salida de otra.</p><p><strong>Paso 3 &#8212; Audita d&#243;nde se va tu esfuerzo real.</strong> Mide horas por capa durante un sprint. Si m&#225;s del 80% est&#225; en Collection, rebalancea hacia Processing y Delivery. Ese es el 80/20 invertido que hay que corregir.</p><p><strong>Paso 4 &#8212; Mide el churn por causa, no por volumen.</strong> Clasifica cada baja de cliente &#8212; estructura inconsistente vs. datos incompletos vs. precio. Deja que los datos de retenci&#243;n dirijan la hoja de ruta t&#233;cnica, no las m&#233;tricas de scraping.</p><p><strong>Paso 5 &#8212; Trata cada entregable como dato estructurado, no como documento.</strong> Si el output vive en un content lake, puedes servir a diez clientes con la misma base.</p><p>---</p><h3><strong>Las Objeciones Que Vas a Querer Plantear (y Sus Respuestas)</strong></h3><p><strong>"Los clientes se van porque la investigaci&#243;n est&#225; incompleta &#8212; necesito M&#193;S datos."</strong></p><p>Ambos factores conviven, pero con pesos distintos. No lo asumas: haz entrevistas de churn y audita los entregables rechazados para clasificar el motivo real de cada baja antes de decidir d&#243;nde invertir. Ver&#225;s que la estructura inconsistente duele m&#225;s que el dato faltante.</p><p><strong>"Estandarizar mata el valor a medida &#8212; el cliente paga por an&#225;lisis personalizado."</strong></p><p>El contrato aplica al <strong>contenedor</strong> &#8212; formato, estructura, citaci&#243;n, cadencia &#8212; no al <strong>contenido anal&#237;tico</strong>. La personalizaci&#243;n vive en la capa de contenido y la consistencia en la capa de formato. Son capas separadas. Exactamente el argumento de las tres capas.</p><p><strong>"Esto suena a que nos convertimos en una empresa de software."</strong></p><p>No. El content lake reutiliza herramientas existentes. Est&#225;s definiendo un contrato de datos, no construyendo una plataforma. El objetivo no es la tecnolog&#237;a: <strong>es la retenci&#243;n</strong>.</p><p>---</p><h3><strong>La Consistencia Es la Confianza</strong></h3><p>Durante a&#241;os el marketing digital vendi&#243; el productoizado como un problema de adquisici&#243;n. Consigue m&#225;s clientes, haz m&#225;s lead gen, escala el outreach. Pero la retenci&#243;n es el motor silencioso del <strong>productized services business model</strong> &#8212; y en un RaaS, la retenci&#243;n no se juega en las fuentes que scrapeas. Se juega en el formato que entregas.</p><p>La entrega de investigaci&#243;n es un problema de <strong>UX, no de ingenier&#237;a</strong>. La experiencia del cliente ES la estructura, el formato y la cadencia del entregable &#8212; no los datos que hay detr&#225;s. En un servicio donde el output es el producto, la consistencia es la confianza, y la confianza es la retenci&#243;n.</p><p>Deja de optimizar el scraping. Define el contrato, separa las capas y automatiza el QA del entregable. El 80% de tu esfuerzo est&#225; donde ya no importa.</p><p><strong>Lo que viene despu&#233;s es un escenario inc&#243;modo para quienes siguen compitiendo por volumen: la ventaja ya no se construye con m&#225;s datos, sino con la arquitectura que los convierte en confianza. La recolecci&#243;n se ha vuelto infinitamente barata. La consistencia, infinitamente valiosa.</strong></p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/raas-automatiza-la-entrega-no-el-scraping-20260901?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El flag que rompe el build: por qué compilo con webpack y nunca con turbopack]]></title><description><![CDATA[Sanity crashea cada vez que activo --turbopack, as&#237; que el build de producci&#243;n de Conversor compila siempre con webpack. La historia de c&#243;mo bloque&#233; el flag en dos capas y por qu&#233; un tsc en verde n...]]></description><link>https://newsletter.brianmenagomez.com/p/el-flag-que-rompe-el-build-por-que</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-flag-que-rompe-el-build-por-que</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Tue, 01 Sep 2026 05:37:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7nbD!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9dcf7f-ea19-48c6-9eb8-91e45dd4b8eb_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Este ensayo se publico primero en <a href="https://brianmenagomez.com/blog/el-flag-que-rompe-el-build">brianmenagomez.com/blog/el-flag-que-rompe-el-build</a>.</p><h2>El flag que rompe el build</h2><p>Activar `--turbopack` deber&#237;a haber sido un cambio de una l&#237;nea. Es lo que le&#237;a en la documentaci&#243;n de Next.js: el bundler nuevo, escrito en Rust, m&#225;s r&#225;pido que webpack, empujado como su reemplazo natural. En mi cabeza la cuenta era sencilla. Pongo el flag, el build tarda menos, y me olvido. Lo puse. El build cay&#243;.</p><p>No cay&#243; una vez. Cay&#243; cada vez, en el mismo punto, con el mismo error. Quitaba el flag y compilaba sin problemas. Lo volv&#237;a a poner y crasheaba otra vez, id&#233;ntico. Repet&#237; el ciclo unas cuantas veces por pura incredulidad: el resultado no cambi&#243; en ninguna. Un fallo que se repite de forma determinista deja de ser un misterio: se convierte en un dato. Y el dato era inc&#243;modo: Sanity, el CMS con el que gestiono el contenido de Conversor, no soporta Turbopack.</p><p>Lo que estaba en juego no era un detalle cosm&#233;tico. El build es lo que empaqueta el sitio que sirve los datos fiscales y la API. Un build roto significa una p&#225;gina ca&#237;da y unos docs inaccesibles. Por eso me lo tom&#233; como un problema de verdad y no como una curiosidad de bundler.</p><h3>Lo que no pude arreglar</h3><p>Aqu&#237; est&#225; la parte que m&#225;s me cost&#243; aceptar. No es un bug que pueda arreglar desde mi c&#243;digo. Yo no escribo el plugin de Sanity; solo lo consumo. La incompatibilidad vive en una dependencia de terceros, y ah&#237; no pinto nada. Ten&#237;a dos caminos. Perseguir el fallo durante d&#237;as &#8212; probar versiones, abrir issues, leer c&#243;digo ajeno &#8212; o aceptar el dato y decidir.</p><p>Decid&#237; lo corto. El build de producci&#243;n usa siempre webpack: `npm run build`, sin flag. No es la opci&#243;n m&#225;s r&#225;pida, pero es la que no se rompe. Cuando despliegas cada semana, un build un poco m&#225;s lento es un precio razonable por no levantarte con un deploy ca&#237;do por culpa de una dependencia que no controlas.</p><p>Pero una decisi&#243;n tomada una vez no basta, porque yo no soy el &#250;nico que toca este repositorio.</p><h3>La defensa en profundidad</h3><p>Tengo un operador nocturno: un agente aut&#243;nomo que corre tareas de mantenimiento mientras duermo. Ese agente podr&#237;a reintroducir `--turbopack` de buena fe. Porque lo ley&#243; en la documentaci&#243;n, porque es lo que se recomienda, porque en las instrucciones que le dej&#233; nadie le cont&#243; lo del crash. No me f&#237;o de mi memoria para impedirlo, y no me f&#237;o de la suya.</p><p>As&#237; que lo bloque&#233; de forma determinista, en dos capas.</p><p>La primera es `permissions.deny`, la lista de permisos que el agente no puede usar. Ah&#237;, ese flag no existe: est&#225; denegado antes de que nada se ejecute. La segunda es `guard.mjs`, un hook que corre en cada paso y frena el flag antes de que llegue a tocar nada. Son dos mecanismos distintos, en dos puntos distintos del flujo: uno a nivel de permiso, otro a nivel de ejecuci&#243;n. Si una capa falla, queda la otra. Es defensa en profundidad, y el motivo es concreto: quiero que el flag no pueda volver a entrar por descuido, pase lo que pase. La redundancia no es paranoia; es lo que convierte un "no deber&#237;a pasar" en un "no puede pasar".</p><p>Esto es la diferencia entre esperar que no ocurra y hacer que no pueda ocurrir. Yo ya no espero.</p><h3>El build local no sirve como gate</h3><p>La segunda lecci&#243;n tir&#243; abajo un h&#225;bito que daba por bueno. Durante un tiempo verifiqu&#233; todo en mi m&#225;quina antes de subir nada: `npm run build` local, y si estaba en verde, adelante. El problema es que en Windows ese build local est&#225; roto para los c&#243;digos con asterisco. Los c&#243;digos IAE y CNAE con los que trabajo llevan `*`, y el build se atraganta con ellos en mi entorno. El resultado era un gate que me daba falsa seguridad o falsas alarmas, dependiendo del d&#237;a, y que adem&#225;s no reflejaba lo que iba a pasar en producci&#243;n.</p><p>Dej&#233; de hacer gate en el build local. La correcci&#243;n del build de producci&#243;n se verifica solo en la preview de Vercel. Si la preview compila, el build est&#225; bien. Si no, no lo est&#225;. No hay grises. La preview pas&#243; a ser la fuente de verdad, y el build local qued&#243; como una comprobaci&#243;n temprana que no siempre est&#225; disponible y en la que ya no baso ninguna decisi&#243;n.</p><h3>tsc en verde no es next build en verde</h3><p>La tercera lecci&#243;n es la que m&#225;s me resist&#237; a aceptar: un `tsc` en verde no prueba que un `next build` est&#233; en verde. Son dos comprobaciones distintas, y yo las trataba como una sola.</p><p>El chequeo de tipos de TypeScript valida que los tipos cuadran: que una funci&#243;n devuelve lo que declara, que un objeto tiene los campos que debe. El build valida que el proyecto entero empaqueta: el bundler, los plugins, el CMS, todo junto y en orden. Puedo tener tipos perfectos y un build que crashea. Lo s&#233; porque me pas&#243;: `tsc` pasaba sin un solo error, y Sanity segu&#237;a cayendo con el flag. Eran dos preguntas distintas y yo solo miraba la primera creyendo que respond&#237;a por las dos.</p><h3>Qu&#233; aprend&#237;</h3><p>Lo que me llevo es m&#225;s simple de lo que parece. Cuando un fallo es determinista y no es m&#237;o, no lo persigo: lo bloqueo, y lo bloqueo dos veces. Y ya no me f&#237;o de una comprobaci&#243;n como prueba de otra. El chequeo de tipos responde a una pregunta, el build responde a otra, la preview responde a una tercera. Cada una necesita su verificaci&#243;n, y ninguna sustituye a las dem&#225;s.</p><p>Lo dem&#225;s &#8212; webpack en vez de Turbopack &#8212; es solo una l&#237;nea en la configuraci&#243;n y dos capas de guardarra&#237;l que me dejan dormir tranquilo.</p><p>Lo que publica ese build, si quieres verlo: https://www.conversoriaecnae.es/api/v1/docs</p>]]></content:encoded></item><item><title><![CDATA[Sanity.io no es un CMS. Es una Base de Datos de Contenido con un Editor que te Tocará Reconstruir]]></title><description><![CDATA[Sanity.io no es un CMS: es un content lake con GROQ y un editor open source. Aprende a modelarlo como esquema-as-code en TypeScript en este tutorial.]]></description><link>https://newsletter.brianmenagomez.com/p/sanityio-no-es-un-cms-es-una-base-eb1</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/sanityio-no-es-un-cms-es-una-base-eb1</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Mon, 31 Aug 2026 07:00:15 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/aee7f02c-74db-4ab4-bbc1-3babf572c3cf_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>Sanity.io fue fundada en Oslo en 2014, y en 2025 acab&#243; absorbida por Contentful. Pero jam&#225;s envi&#243; un CMS. Envi&#243; una base de datos JSON, un lenguaje de consultas que nadie fuera de su ecosistema conoce, y un editor React open source que esperan que reconstruyas</strong></h2><p>Los equipos que triunfan con Sanity son los que dejan de preguntar "&#191;qu&#233; pinta el dashboard?" y empiezan a preguntar "&#191;cu&#225;l es mi esquema de contenido?".</p><p>El resto fracasa. No por culpa de Sanity. Por culpa de su propio marco mental.</p><p>La sabidur&#237;a convencional dice: "un CMS es donde los editores escriben blogs, y eliges uno comparando dashboards, plugins y editores WYSIWYG". Eso es err&#243;neo a tres niveles cuando hablamos de Sanity.</p><p>Primero: Sanity no tiene p&#225;ginas. El contenido es JSON definido por esquema. Comparar dashboards es comparar la decoraci&#243;n cuando lo que eliges es la capa de datos.</p><p>Segundo: todo el mundo asume que headless = "sin edici&#243;n visual". Falso. La colaboraci&#243;n en tiempo real y Visual Editing dan a los editores previews en vivo.</p><p>Tercero: la mayor&#237;a asume que las consultas necesitan GraphQL o REST. Sanity responde con GROQ, un lenguaje completo que supera a GraphQL t&#237;pico para contenido relacional. Elegir Sanity significa comprometerte con un lenguaje que la mayor&#237;a de desarrolladores jam&#225;s ha o&#237;do nombrar.</p><p><strong>*El take m&#225;s contracorriente: la mayor debilidad de Sanity es tambi&#233;n su mayor fortaleza. No hay producto hasta que escribes c&#243;digo.</strong>*</p><p>---</p><h2><strong>El Problema: Est&#225;s Comparando CMS Cuando Deber&#237;as Elegir una Capa de Datos</strong></h2><p>WordPress, Drupal, incluso Strapi: organizan el contenido alrededor de p&#225;ginas o documentos con campos fijos.</p><p>Sanity lo organiza alrededor de un esquema que escribes en TypeScript. Arrays, objetos, referencias y bloques de portable text. La misma entidad puede renderizarse como p&#225;gina web, tarjeta m&#243;vil, layout de impresi&#243;n o respuesta de API sin duplicaci&#243;n.</p><p>Pero eso significa que los stakeholders no t&#233;cnicos necesitan que les expliques el esquema <strong>antes de siquiera ver un editor</strong>.</p><p>Ah&#237; est&#225; el primer choque. Tu cliente quiere escribir un art&#237;culo. T&#250; le ense&#241;as un fichero de TypeScript.</p><p>Y el segundo choque ocurre un mes despu&#233;s, cuando intentas la integraci&#243;n con herramientas esperando un endpoint REST y descubres GROQ.</p><p>&#10060; <strong>El enfoque equivocado:</strong> Buscas el mejor "CMS headless" comparando dashboards, WYSIWYG y plugins. Esperas un giro que te d&#233; el panel bonito.</p><p>&#9989; <strong>El enfoque correcto:</strong> Asumes que est&#225;s eligiendo una capa de datos. El esquema es un contrato de programaci&#243;n, no una pantalla de ajustes. Y ese contrato vive en git.</p><p>El tercer choque es el m&#225;s silencioso: la adquisici&#243;n por parte de Contentful en 2025. Dos de los nombres m&#225;s grandes del headless content se fusionaron por l&#243;gica de infraestructura y consolidaci&#243;n, no por listas de features.</p><p>Para ti, como desarrollador, es una se&#241;al clara: <strong>elige tu stack por modelado de datos y dise&#241;o de API, no por el roadmap del vendor actual</strong>. Porque el mapa de vendors se mueve debajo de tus pies.</p><p>---</p><h2><strong>La Evidencia: Lo que Sanity Realmente Despliega</strong></h2><p>Desmontemos la arquitectura. Sanity es, arquitect&#243;nicamente, una base de datos de contenido hospedada &#8212; el famoso content lake. El contenido se almacena como documentos JSON, no como p&#225;ginas renderizadas. No existe una entidad "p&#225;gina" en el modelo de datos.</p><p>Esa pieza cambia todo.</p><p>El Studio es open source bajo licencia MIT, y es una aplicaci&#243;n React configurable. <strong>La interfaz de edici&#243;n es c&#243;digo que tus equipos pueden extender o reemplazar.</strong> Se configura v&#237;a `sanity.config.ts`, no v&#237;a un panel de administraci&#243;n.</p><p>Y GROQ &#8212; Graph-Relational Object Queries &#8212; es el motor relacional. Proyecta, filtra, atraviesa arrays y desreferencia referencias con el operador `-&gt;`. Sin GraphQL. Sin fragamentos. Sin round-trips REST.</p><p>```typescript</p><p>// sanity.config.ts &#8212; el "dashboard" que eliges</p><p>import { defineConfig } from 'sanity'</p><p>import { structureTool } from 'sanity/structure'</p><p>import { schemaTypes } from './schema'</p><p>export default defineConfig({</p><p>name: 'default',</p><p>title: 'Mi Studio de Contenido',</p><p>projectId: 'abc123',</p><p>dataset: 'production',</p><p>plugins: [structureTool()],</p><p>schema: { types: schemaTypes },</p><p>})</p><p>```</p><p>Se acab&#243; el comparar paneles. Esto es lo que eliges: <strong>una configuraci&#243;n de TypeScript que define c&#243;mo se modelo y edita tu contenido</strong>.</p><p>La evidencia est&#225; en el modelo de datos, no en el marketing.</p><p>---</p><h2><strong>El An&#225;lisis: Por Qu&#233; esto Importa Ahora, en 2026</strong></h2><p>La consolidaci&#243;n del mercado confirma el papel de Sanity. La adquisici&#243;n por Contentful en 2025 reframe por completo la categor&#237;a. Dos gigantes del headless content se fusionaron y la l&#243;gica fue de infraestructura y consolidaci&#243;n: no listas de features.</p><p>Para ti, desarrollador, hay una lecci&#243;n pr&#225;ctica y urgente: <strong>tu contenido deja de ser documentos de un vendor y se convierte en datos versionados en git.</strong> El esquema vive en tu repositorio, se revisa en pull requests, se migra con commits, no con clics en un panel.</p><p>Eso es lo que ning&#250;n CMS administrado te ha podido dar jam&#225;s.</p><p>Y la edici&#243;n visual disuelve la vieja l&#237;nea entre headless y legacy. El Presentation tool y la colaboraci&#243;n en tiempo real dan a los editores previews en vivo sobre el frontend real. Lo que los cr&#237;ticos del headless siempre dijeron imposible &#8212; editar con contexto visual &#8212; es ahora el default.</p><p>El resultado pr&#225;ctico: "headless" ya no significa "a ciegas". El factor decisivo entre Sanity y un CMS legacy ya no es el preview. <strong>Es si quieres tu modelo de contenido versionado en git o atrapado en una base de datos opaca.</strong></p><p>---</p><h2><strong>El Framework: El Patr&#243;n del Esquema Como Contrato</strong></h2><h3><strong>Paso 1: Scaffold y Acepta el Studio por Defecto</strong></h3><p>```bash</p><p>npm create sanity@latest</p><h1>O, para un proyecto existente:</h1><p>npm install sanity @sanity/client</p><p>```</p><p>Acepta el setup por defecto. Crear&#225;s una app Next.js o Remix con el Studio integrado. No te preocupes por personalizar a&#250;n. La personalizaci&#243;n viene despu&#233;s, cuando el esquema est&#233; estable.</p><h3><strong>Paso 2: Modela Contenido Como C&#243;digo Primero</strong></h3><p>Resiste la tentaci&#243;n de empezar por la UI. Define cada tipo &#8212; post, autor, producto &#8212; como un objeto TypeScript con campos, validaci&#243;n y referencias.</p><p>```typescript</p><p>// schema/post.ts &#8212; el modelo de contenido ES TypeScript</p><p>import { defineField, defineType } from 'sanity'</p><p>export default defineType({</p><p>name: 'post',</p><p>title: 'Post',</p><p>type: 'document',</p><p>fields: [</p><p>defineField({ name: 'title', type: 'string', validation: r =&gt; r.required() }),</p><p>defineField({ name: 'slug', type: 'slug', options: { source: 'title' } }),</p><p>defineField({ name: 'author', type: 'reference', to: [{ type: 'author' }] }),</p><p>defineField({ name: 'body', type: 'blockContent' }),</p><p>defineField({ name: 'tags', type: 'array', of: [{ type: 'reference', to: [{ type: 'tag' }] }] }),</p><p>],</p><p>})</p><p>```</p><p>Este fichero es tu contrato. Vive en git. Se revisa en PR. Se versiona.</p><h3><strong>Paso 3: Consulta con GROQ a trav&#233;s de @sanity/client</strong></h3><p>Versiona tus queries en un &#250;nico fichero. Usa el plugin Vision en Studio para iterar contra datos reales.</p><p>```javascript</p><p>// lib/queries.js &#8212; todas las queries versionadas en un sitio</p><p>export const postQuery = `*[_type == "post" &amp;&amp; publishedAt &lt;= now()]</p><p>| order(publishedAt desc) {</p><p>title,</p><p>slug,</p><p>"author": author-&gt;name,</p><p>"tags": tags[]-&gt;{label}</p><p>}`</p><p>```</p><p><strong>*El operador `-&gt;` desreferencia referencias inline. Lo que en GraphQL ser&#237;an m&#250;ltiples fragments, en GROQ es una l&#237;nea.</strong>*</p><h3><strong>Paso 4: Conecta a tu Frontend</strong></h3><p>```javascript</p><p>// app/page.js &#8212; fetch desde una app Next.js</p><p>import { client } from './lib/sanity'</p><p>import { postQuery } from './lib/queries'</p><p>export default async function HomePage() {</p><p>const posts = await client.fetch(postQuery, {}, { next: { revalidate: 60 } })</p><p>return &lt;PostList posts={posts} /&gt;</p><p>}</p><p>```</p><p>Sanity sirve desde CDN por defecto. El caching es parte de la capa de datos, no un plugin.</p><h3><strong>Paso 5: Real-time en vez de Rebuilds Est&#225;ticos</strong></h3><p>Activa el draft mode o el preview. Usa `client.listen()` o el Presentation tool para actualizaciones de contenido instant&#225;neas, en vez de rebuilds on-publish.</p><p>```javascript</p><p>// Escucha cambios en tiempo real &#8212; sin rebuild on publish</p><p>const subscription = client.listen(`*[_type == "post"]`)</p><p>subscription.subscribe(update =&gt; {</p><p>console.log('Contenido actualizado:', update.result)</p><p>// Invalidaci&#243;n selectiva de cach&#233;, no rebuild completo</p><p>})</p><p>```</p><h3><strong>Paso 6: Extiende el Studio para tus Workflows Reales</strong></h3><p>El editor es una app React que posees. A&#241;ade inputs custom, validaci&#243;n espec&#237;fica y plugins. Despu&#233;s itera sobre el esquema sabiendo que las migraciones son aditivas, no destructivas.</p><p>```tsx</p><p>// Custom input: valida slugs &#250;nicos v&#237;a API</p><p>import { useClient } from 'sanity'</p><p>import { StringInputProps } from 'sanity'</p><p>export function UniqueSlugInput(props: StringInputProps) {</p><p>const client = useClient({ apiVersion: '2026-01-01' })</p><p>// Verifica unicidad contra el content lake en tiempo real</p><p>return &lt;input {...props} placeholder="Escribe un slug &#250;nico..." /&gt;</p><p>}</p><p>```</p><p>El nombre de este patr&#243;n: <strong>El Patr&#243;n del Esquema Como Contrato</strong>. El esquema no es configuraci&#243;n. Es el contrato firmado entre editores, frontend y API. Todo lo dem&#225;s &#8212; Studio, queries, previews &#8212; desciende de &#233;l.</p><p>---</p><h2><strong>Las Objeciones que Me Har&#237;as (y sus Respuestas)</strong></h2><p><strong>"&#191;Por qu&#233; a&#241;adir GROQ al stack cuando ya conozco GraphQL? &#191;No eleva la curva de aprendizaje y me encierra en Sanity?"</strong></p><p>GROQ se aprende en una tarde. Viene con el client oficial. Y el contrato esquema-as-code reduce el riesgo de lock-in comparado con esquemas opacos de base de datos. La concesi&#243;n honesta: el ecosistema de tooling es menor que el de GraphQL.</p><p><strong>"El contenido JSON estructurado significa que no hay integridad relacional real &#8212; las referencias son strings que pueden quedar hu&#233;rfanas."</strong></p><p>El tipo `reference` de Sanity incluye reglas de validaci&#243;n. El trade-off: flexibilidad y evoluci&#243;n sin migraciones destructivas contra garant&#237;as de foreign keys estrictas. Si tu equipo necesita constraints ACID duros, reconsidera si un CMS es la herramienta correcta en absoluto.</p><p><strong>"Es SaaS hospedado &#8212; &#191;y si el servicio o el vendor fusionado cambia de rumbo tras la adquisici&#243;n?"</strong></p><p>El Studio es open source MIT. La API y la especificaci&#243;n GROQ son p&#250;blicas. Puedes exportar y hacer backup del contenido v&#237;a la API. Mitigaci&#243;n real. Pero s&#233; honesto: el content lake es un servicio administrado. Si necesitas self-hosting extremo, valora eso antes de comprometerte.</p><p>---</p><h2><strong>Resumen y Hacia Delante</strong></h2><p>El error colectivo es tratar Sanity como un WordPress sin interfaz. Lo que es: una base de datos de contenido donde el esquema es un contrato TypeScript versionado en git, consultada con GROQ, administrada por un editor React open source.</p><p><strong>Los take-aways:</strong></p><ul><li><p>El esquema es el producto. Todo lo dem&#225;s desciende.</p></li><li><p>GROQ reemplaza lo que a GraphQL le costar&#237;a fragments y round-trips.</p></li><li><p>El editor es c&#243;digo que posees, no un dashboard alquilado.</p></li><li><p>El contenido versionado en git es la raz&#243;n real de elegir Sanity.</p></li></ul><p>La frase que me repito cada vez que un cliente me ense&#241;a el "CMS": elige tu stack por el modelo de datos, no por la lista de features del vendor actual. El mapa de vendors se mover&#225;. Tu esquema, versionado en git, permanece.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/sanity-io-headless-cms-no-es-un-cms-sino-base-de-datos-de-contenido-20260831?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El 89% de las Startups Bootstrapped Construyen Infraestructura Que No Necesitan — y Pagan el Precio en Velocidad]]></title><description><![CDATA[El 89% de startups bootstrapped construyen infraestructura que no necesitan y la pagan en velocidad. Aprende a priorizar alto apalancamiento y a no construir.]]></description><link>https://newsletter.brianmenagomez.com/p/el-89-de-las-startups-bootstrapped</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-89-de-las-startups-bootstrapped</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Mon, 31 Aug 2026 07:00:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ec3a7fc3-7235-4183-8687-801eafb51e87_1080x608.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>El 89% de las Startups Bootstrapped Construyen Infraestructura Que No Necesitan &#8212; y Pagan el Precio en Velocidad</h2><p>Crees que ser eficiente con el capital es gastar menos. Que la tanda de este mes, el plan de hosting m&#225;s barato, el servidor compartido en vez del dedicado, te convierten en un fundador frugal.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>El 89% de las startups bootstrapped construyen infraestructura que no necesitan &#8212; y la pagan en velocidad, la &#250;nica moneda que no se puede recuperar. La eficiencia de capital no es cu&#225;nto gastas. Es <strong>qu&#233; decides no construir</strong>.</p><p>Este art&#237;culo no va de recortar presupuesto. Va de entender que tu funci&#243;n objetivo es distinta a la de una startup con financiaci&#243;n, y que cada decisi&#243;n de arquitectura que tomas hoy se cobra en el &#250;nico recurso que no vas a recuperar: tus horas de fundador. Vamos a desmontar la trampa, analizar el patr&#243;n por el que copiamos infraestructura ajena, y construir un framework de decisi&#243;n que puedes aplicar esta misma semana.</p><p>---</p><p>---</p><h2>El Problema: la Trampa de la Preparaci&#243;n</h2><p>Mira tu arquitectura actual. &#191;Cu&#225;nto de lo que montaste existe para servir a los usuarios que tienes hoy?</p><p>No. Lo montaste <strong>por si acaso</strong>.</p><p>Por si acaso llegan diez mil usuarios. Por si acaso el proveedor se cae. Por si acaso alg&#250;n VC te pide escalabilidad en el due diligence. El mismo gesto que en una startup VC es racional &#8212; prepararse para escalar &#8212; es destructivo en una bootstrapped.</p><p>La raz&#243;n es estructural. Una startup VC optimiza cu&#225;nto capital quema por unidad de crecimiento, porque su restricci&#243;n es el capital disponible. T&#250; tienes capital acotado pero decides tu propia pista. Tu restricci&#243;n real son <strong>las horas del fundador</strong>. Copiar patrones de infraestructura VC es copiar una soluci&#243;n dise&#241;ada para otra restricci&#243;n: el mismo gesto es racional en un marco y suicida en el otro.</p><h3>La asimetr&#237;a que nadie nombra</h3><p>Si tu startup nunca escala &#8212; el resultado m&#225;s probable para la mayor&#237;a de bootstrapped &#8212; la infraestructura diferida nunca se paga. La construida "por si acaso" s&#237; se pag&#243;, en tiempo presente.</p><p>La deuda t&#233;cnica de no prepararte <strong>solo se cobra si creces</strong>. La deuda de prepararte <strong>se cobra siempre, desde el d&#237;a uno</strong>.</p><p>Aceptar esa asimetr&#237;a es el primer paso. Es un trade entre rework hipot&#233;tico y supervivencia real. Y la mayor&#237;a de bootstrapped nunca llega a la escala que preparan.</p><h3>El coste oculto: el mantenimiento como impuesto perpetuo</h3><p>Hay un matiz que rara vez se menciona cuando hablamos de infraestructura anticipada: construir no es el &#250;nico coste. La infraestructura que montas por adelantado genera una deuda de <strong>mantenimiento perpetuo</strong>. Cada dependencia que a&#241;ades, cada servicio que despliegas, cada abstracci&#243;n que introduces, se convierte en algo que tienes que mantener, actualizar, depurar y documentar &#8212; no este trimestre, sino todos los trimestres mientras la startup exista.</p><p>Una cola de mensajes que configuraste "por si acaso el tr&#225;fico crece" no es un coste &#250;nico. Es un sistema que se cae a las tres de la ma&#241;ana, que necesita monitorizaci&#243;n, que acumula deuda t&#233;cnica cuando las librer&#237;as se actualizan, y que desv&#237;a tu atenci&#243;n de lo &#250;nico que importa en una etapa temprana: encontrar producto-mercado-ajuste.</p><p>Es lo que algunos llaman el <strong>impuesto de la anticipaci&#243;n</strong>: pagas por adelantado, y luego pagas intereses todos los meses. El problema no es solo que la infraestructura anticipada cueste tiempo hoy; es que te lo sigue costando ma&#241;ana, aunque nunca lleguen los usuarios que justificaban su existencia.</p><p>Cuando eres un equipo peque&#241;o o un solo fundador, cada sistema adicional es un nodo de atenci&#243;n que compite con las tareas de distribuci&#243;n, onboarding y venta. Y en un equipo de una o dos personas, no hay nadie m&#225;s que absorba ese coste.</p><p>---</p><p>---</p><h2>La Evidencia: el Patr&#243;n Supabase y la Alineaci&#243;n del Mapa</h2><p>Cuando digo que la infraestructura que crees propietaria en realidad ya existe, pongo un ejemplo concreto: <strong>Supabase</strong>.</p><p>Supabase no es un servicio de base de datos ni "Firebase con SQL". Es una capa de orquestaci&#243;n sobre PostgreSQL donde cada feature "m&#225;gica" es un <strong>primitivo de Postgres disfrazado de API</strong>. Tu REST API en Supabase es PostgREST &#8212; un primitivo existente. Tu auth es un wrapper sobre Postgres. Tu realtime es l&#243;gica de suscripci&#243;n sobre los mismos mecanismos.</p><p>Nadie construy&#243; eso desde cero. Lo empaquetaron.</p><p>La lecci&#243;n para el fundador bootstrapped es implacable: <strong>antes de escribir tu propio sistema de auth, tus colas, tu capa de API o tus cobros, busca el primitivo gestionado que ya lo resuelve</strong>. La mayor&#237;a de las features "m&#225;gicas" del SaaS son wrappers. Y adoptar el wrapper siempre es m&#225;s eficiente que convertirte t&#250; mismo en el wrapper.</p><h3>El principio subyacente: la reutilizaci&#243;n de primitivos</h3><p>Vale la pena detenerse un momento en el mecanismo que hace que Supabase funcione, porque es el mismo mecanismo que deber&#237;a gobernar todas tus decisiones de infraestructura.</p><p>PostgreSQL lleva m&#225;s de treinta a&#241;os en desarrollo. Tiene m&#225;s de mil contribuidores. Ha sido probado en entornos de producci&#243;n que gestionan petabytes de datos, en bancos, en aerol&#237;neas, en sistemas de tr&#225;fico a&#233;reo. Cuando decides que tu sistema de auth "propio" va a ser mejor o m&#225;s apropiado que lo que Postgres ya ofrece, est&#225;s asumiendo que puedes replicar &#8212; en semanas de trabajo de un equipo peque&#241;o &#8212; lo que una comunidad global ha tardado d&#233;cadas en madurar.</p><p>Eso no es eficiencia. Es arrogancia disfrazada de control.</p><p>El patr&#243;n se repite en cada capa del stack. Las colas de mensajes llevan d&#233;cadas resolviendo problemas de desacoplamiento. Los sistemas de pago como Stripe absorben la complejidad de compliance, fraude y conversi&#243;n de divisas que jam&#225;s vas a replicar. Los servicios de auth gestionados manejan hashing, sesiones, OAuth, recovery de contrase&#241;as y rate limiting &#8212; todos los casos borde que solo descubres cuando ya es tarde.</p><p>Cada vez que decides "construir lo nuestro", no est&#225;s ahorrando dinero. Est&#225;s aceptando una desventaja comparativa brutal frente a un equipo que dedica su existencia entera a ese problema concreto, y cuya soluci&#243;n puedes adoptar en una tarde de integraci&#243;n.</p><h3>La micro-optimizaci&#243;n no rescata un mapa desalineado</h3><p>Segundo aprendizaje del patr&#243;n: las mejoras t&#225;cticas no producen eficiencia si el mapa estrat&#233;gico est&#225; desalineado.</p><p>Puedes pulir tus tooltips, tus checklists de onboarding, tus email flows. Si tu modelo de crecimiento (PLG vs Sales-Led) y tu segmento de cliente no est&#225;n alineados, <strong>ninguna mejora t&#225;ctica reduce el resultado</strong>.</p><p>Es el mismo error de eficiencia a otro nivel. La micro-eficiencia t&#225;ctica no rescata una asignaci&#243;n estrat&#233;gica equivocada. La eficiencia empieza en el mapa, no en los tooltips. Ambos casos son gasto en actividad de bajo apalancamiento &#8212; y ambos comparten ra&#237;z: copiar el comportamiento del otro, en vez de alinear con tu restricci&#243;n real.</p><p>Un ejemplo concreto en el contexto espa&#241;ol: imagina una startup de gestor&#237;as que construye un sistema de onboarding impecable, con emails autom&#225;ticos y checklists interactivos, pero que vende a clientes que deciden comprar por recomendaci&#243;n de su asesor fiscal, no por autoservicio. Todo ese esfuerzo de PLG optimizado est&#225; orientado a un modelo de crecimiento Sales-Led. Las gestor&#237;as compran cuando alguien les presenta una soluci&#243;n con confianza, no cuando rellenan un formulario. El resultado: horas y horas de micro-optimizaci&#243;n que no mueven ni una d&#233;cima la conversi&#243;n.</p><p>La alineaci&#243;n entre tu modelo de crecimiento, tu segmento y tu producto es el mapa. Todo lo dem&#225;s son detalles sobre un mapa equivocado.</p><p>---</p><p>---</p><h2>An&#225;lisis: por Qu&#233; Copiar a los VC Es un Error de Marco, No de Ejecuci&#243;n</h2><p>"Los VC tambi&#233;n exigen eficiencia de capital &#8212; &#191;qu&#233; tiene de distinto?"</p><p>Haz la pregunta correcta: <strong>eficiencia respecto a qu&#233;?</strong></p><p>La eficiencia VC se mide como capital quemado por unidad de crecimiento, con capital abundante. La bootstrapped mide <strong>valor entregado por unidad de tiempo, con capital acotado</strong>. Misma palabra, funciones objetivo distintas.</p><p>Por eso copiar su infraestructura es un error de marco, no de ejecuci&#243;n. No est&#225;s ejecutando mal la misma funci&#243;n. Est&#225;s resolviendo un problema distinto.</p><h3>El espejismo del falso empirismo</h3><p>Pero hay una trampa adicional en este an&#225;lisis, y conviene nombrarla con honestidad. Cuando observamos c&#243;mo operan una startup con financiaci&#243;n y otra bootstrapped, tendemos a pensar que ambas est&#225;n jugando el mismo juego con recursos distintos. La realidad es m&#225;s inc&#243;moda: est&#225;n jugando juegos con <strong>reglas completamente diferentes</strong>.</p><p>Una startup VC tiene una ventaja que rara vez se menciona en los an&#225;lisis de capital efficiency: su modelo de negocio no depende de la rentabilidad, sino de la valoraci&#243;n. La infraestructura escalable tiene un valor de se&#241;alizaci&#243;n ante futuras rondas &#8212; demuestra que el equipo "piensa en grande". Aunque esa infraestructura nunca se use, est&#225; cumpliendo una funci&#243;n real: la de reducir el riesgo percibido por el inversor.</p><p>Tu caso es el opuesto. T&#250; no tienes a qui&#233;n se&#241;alarle nada. Tu &#250;nica se&#241;al de progreso es el producto funcionando y los usuarios pagando. La infraestructura anticipada no te compra nada en tu mercado; solo te cuesta tiempo que tu competidor &#8212; quiz&#225; con el mismo presupuesto &#8212; est&#225; usando para vender.</p><p>Cuando llamamos a esto un "error de marco", queremos decir exactamente eso: no te equivocaste en la ejecuci&#243;n de la infraestructura. Te equivocaste en el juego que est&#225;s jugando. Y el error m&#225;s caro en cualquier negocio no es ejecutar mal una estrategia, sino ejecutar perfectamente la estrategia equivocada.</p><h3>Los n&#250;meros correctos</h3><p>Es momento de ser transparente sobre el titular de este art&#237;culo. El 89% es un encuadre provocador del an&#225;lisis, no una estad&#237;stica validada por un estudio externo. Tr&#225;talo como lo que es: un patr&#243;n que he visto repetirse cientos de veces en agencias y solos que env&#237;an software en Espa&#241;a. Lo que importa no es el porcentaje exacto &#8212; es <strong>el mecanismo</strong>.</p><p>Preg&#250;ntate a tu alrededor. &#191;Cu&#225;ntos proyectos de Espa&#241;a conoces con una cola de mensajes configurada para servir a menos de mil usuarios? &#191;Cu&#225;ntos sistemas de auth propios en productos que a&#250;n no han validado que alguien los quiere? &#191;Cu&#225;ntos clusters de Postgres con replicaci&#243;n en empresas que podr&#237;an pasar dos a&#241;os sin llegar a los diez mil usuarios?</p><p>El porcentaje exacto da igual. La pregunta que de verdad importa es: &#191;qu&#233; porcentaje de tu propia arquitectura actual existe para servir a los usuarios que tienes hoy? Si la respuesta te incomoda, sabes d&#243;nde est&#225; el problema.</p><p>---</p><p>---</p><h2>El Triage de los Tres Pilares: el Framework de Decisi&#243;n</h2><p>Aqu&#237; est&#225; lo que puedes implementar hoy. Llamo a este filtro <strong>El Triage de los Tres Pilares</strong> &#8212; una regla de decisi&#243;n, no un presupuesto. Todo gasto de tiempo debe justificarse contra el presente, no contra el futuro imaginado.</p><h3>Paso 1: El test del usuario actual</h3><p>Ante cualquier build &#8212; feature o infraestructura &#8212; exige que sirva a una necesidad <strong>demostrada por tus usuarios actuales</strong>.</p><p>No "el pr&#243;ximo segmento". No "cuando tengamos tracci&#243;n". Los que est&#225;n pagando hoy. Si no demuestran la necesidad, se difiere.</p><p>Esto suena m&#225;s f&#225;cil de lo que es, porque el cerebro humano est&#225; dise&#241;ado para anticipar problemas antes de que ocurran. Cuando un usuario te dice "esto no me va bien", es natural pensar "y si crece, esto ser&#225; peor". Pero la evidencia funciona al rev&#233;s: la mayor&#237;a de las startups bootstrapped mueren por no tener suficientes usuarios, no por tener demasiados. El problema real nunca es la escala; es la distribuci&#243;n.</p><p>Un ejercicio concreto para este paso: escribe una lista de las cinco cosas que est&#225;s construyendo ahora mismo. Ahora tacha todas las que no puedas conectar directamente con una petici&#243;n o dolor verbalizado y repetido por tus usuarios actuales. Si algo queda en la lista, justif&#237;calo por escrito. Si no puedes, se difiere.</p><h3>Paso 2: La auditor&#237;a de primitivos</h3><p>Antes de escribir infraestructura propia, pregunta: <strong>&#191;ya existe un primitivo gestionado que resuelve el 80%?</strong></p><ul><li><p>&#191;Auth? Supabase Auth, Clerk, Auth0.</p></li><li><p>&#191;Colas? Un cron job gestionado o una cola de un proveedor.</p></li><li><p>&#191;Capa de API? PostgREST, Directus, un ORM.</p></li><li><p>&#191;Cobros? Stripe, no tu sistema de billing.</p></li></ul><p>Si existe, <strong>adopta el wrapper</strong>. No conviertas tu c&#243;digo en el wrapper.</p><p>Este paso tiene una regla de dedo: <strong>el 80% de las veces, el primitivo gestionado es suficiente</strong>. El 20% restante son casos donde tu necesidad real &#8212; no imaginada &#8212; excede lo que el primitivo ofrece. Solo entonces deber&#237;as considerar construir. Y aun as&#237;, con la disciplina de hacerlo en una capa fina por encima del primitivo, nunca reemplaz&#225;ndolo.</p><p>La clave est&#225; en el orden de evaluaci&#243;n. La pregunta no es "&#191;me conviene construir esto?" &#8212; esa pregunta mentalmente tiende a responder "s&#237;" porque subestimamos sistem&#225;ticamente el coste de mantenimiento. La pregunta correcta es "&#191;existe una soluci&#243;n gestionada que resuelve el 80%?" &#8212; y solo cuando la respuesta es "no" pasamos al an&#225;lisis de construcci&#243;n.</p><h3>Paso 3: El check de alineaci&#243;n</h3><p>Toda optimizaci&#243;n debe pasar por el mapa. Pregunta: &#191;est&#225; alineada con mi modelo de crecimiento (PLG vs Sales-Led) y con mi segmento de cliente?</p><p>Sin alineaci&#243;n, las mejoras t&#225;cticas no reducen el resultado. La eficiencia empieza en el mapa.</p><p>Este es el paso que la mayor&#237;a de la gente salta, precisamente porque es el m&#225;s inc&#243;modo. Comprobar la alineaci&#243;n significa admitir que quiz&#225; has estado optimizando en la direcci&#243;n equivocada durante meses. Significa que puede que hayas construido un onboarding impecable para un producto que se vende por tel&#233;fono, o un sistema de trials generosos para un segmento que compra por urgencia, no por curiosidad.</p><p>El check de alineaci&#243;n no es un ejercicio de una tarde. Es una revisi&#243;n trimestral en la que te preguntas: dado d&#243;nde estoy, dado mi producto y mi mercado, &#191;cu&#225;l es la palanca correcta para crecer? &#191;Adquisici&#243;n? &#191;Retenci&#243;n? &#191;Expansi&#243;n? Y cuando encuentras la respuesta, todos los gastos de tiempo &#8212; de infraestructura, de features, de marketing &#8212; deben filtrarse a trav&#233;s de esa palanca.</p><h3>Paso 4: Time-boxea la preparaci&#243;n</h3><p>Prepara <strong>solo hasta donde exige tu cuello de botella actual</strong>. Revisa trimestralmente.</p><p>No prepares para diez mil usuarios si tienes doscientos. El momento de pensar en escala es cuando el cuello de botella actual te lo pide &#8212; no antes.</p><p>Es tentador pensar en el cuello de botella como el momento en que "ya es tarde". En realidad, tiene una se&#241;al inequ&#237;voca: el d&#237;a en que tus usuarios actuales empiezan a sufrir por un problema de rendimiento real, medido y no especulado. Cuando tu API responde en tres segundos y la gente se queja, es el momento de a&#241;adir un &#237;ndice, una cach&#233; o un CDN. No antes.</p><p>Time-boxear la preparaci&#243;n tiene otra ventaja: te obliga a re-evaluar cada trimestre. La decisi&#243;n que tomaste en enero &#8212; "no necesito escala" &#8212; puede revisarse en abril con datos nuevos. Tal vez el crecimiento fue real, tal vez el cuello de botella cambi&#243;, tal vez el mercado se movi&#243;. La revisi&#243;n trimestral convierte la preparaci&#243;n en una decisi&#243;n informada, no en un ejercicio de fe.</p><h3>Paso 5: Mide velocidad, no escala</h3><p>El precio de la infraestructura innecesaria se paga en <strong>velocidad de entrega de valor</strong> a los usuarios actuales.</p><p>Convierte la velocidad en tu m&#233;trica operativa de eficiencia. &#191;Cu&#225;nto tarda entregar valor nuevo esta semana? Si la respuesta es "sigo manteniendo infraestructura", est&#225;s en la trampa.</p><p>La velocidad no es una m&#233;trica vaga. Es concreta: &#191;cu&#225;ntas features llegaron a producci&#243;n este mes? &#191;Cu&#225;ntos bugs de los reportados se resolvieron esta semana? &#191;Cu&#225;nto tiempo pas&#243; entre que un usuario pidi&#243; algo y lo recibi&#243;? Todas esas son medidas de velocidad.</p><p>Cuando montas infraestructura anticipada, esa velocidad cae de forma invisible. No ves un descenso brusco &#8212; ves un goteo. Tres horas aqu&#237;, una tarde all&#225;, un fin de semana resolviendo un problema de una cola que no necesitabas. Al final del trimestre, has entregado tres features en lugar de doce, y no puedes se&#241;alar un momento exacto en que perdiste las horas restantes.</p><p>Por eso la velocidad tiene que ser una m&#233;trica expl&#237;cita, revisada en el mismo lugar que tu rentabilidad. El d&#237;a que tu velocidad de entrega baja sin que la demanda de los usuarios lo justifique, tienes la respuesta: est&#225;s pagando el impuesto de la anticipaci&#243;n.</p><p>---</p><p>---</p><h2>Implementaci&#243;n: Un Ejemplo Real</h2><p>Imagina que est&#225;s lanzando un SaaS para gestor&#237;as en Espa&#241;a. Tu stack podr&#237;a ser:</p><ul><li><p><strong>Frontend</strong>: Next.js con deploy en Vercel &#8212; Edge Functions gratuitas donde las necesites.</p></li><li><p><strong>Datos</strong>: Postgres gestionado. Nada de cluster propio ni replicaci&#243;n.</p></li><li><p><strong>Auth</strong>: primitivo gestionado. No escribas la tabla de sesiones.</p></li><li><p><strong>API</strong>: PostgREST o una capa fina sobre tu ORM. No construyas un framework propio.</p></li><li><p><strong>Cobros</strong>: Stripe Checkout. No tu sistema de billing.</p></li></ul><p>&#10060; <strong>El enfoque equivocado</strong>: cluster de Postgres con r&#233;plicas para "preparar escala", sistema de auth propio, colas distribuidas, API construida desde cero, tres microservicios separados.</p><p>&#9989; <strong>El enfoque eficiente</strong>: un solo deploy, primitivos gestionados para todo lo que ya existe, y el tiempo ahorrado invertido en <strong>distribuci&#243;n, onboarding y venta</strong>.</p><p>El primer enfoque te lleva tres meses m&#225;s lento. El segundo te coloca en el mercado esta semana.</p><h3>Qu&#233; har&#237;as con las tres semanas que te sobran</h3><p>Detente un momento y haz el c&#225;lculo. Con el enfoque eficiente, probablemente lanzas en dos o tres semanas. Con el enfoque equivocado, en tres o cuatro meses. Esa diferencia no es te&#243;rica: son cerca de doce semanas en las que no est&#225;s hablando con gestor&#237;as, no est&#225;s aprendiendo qu&#233; les duele de verdad, no est&#225;s iterando sobre feedback real.</p><p>&#191;Qu&#233; podr&#237;as hacer en doce semanas? Podr&#237;as hablar con cincuenta gestor&#237;as de tu mercado, identificar los tres dolores que se repiten, construir las features que los resuelven y validar que alguien paga por ellas. Eso es producto. Eso es negocio. Eso es lo que la infraestructura anticipada te roba.</p><p>Y hay un detalle que la mayor&#237;a de la gente pasa por alto: cuando por fin lanzas con el enfoque equivocado, tu arquitectura est&#225; dise&#241;ada para un tr&#225;fico que no tienes, pero no est&#225; dise&#241;ada para las cosas que s&#237; has aprendido. Las gestor&#237;as te habr&#225;n pedido quince cosas que no anticipaste, y tu cluster de Postgres con r&#233;plicas no te habr&#225; ayudado en ninguna. La flexibilidad que necesitas en etapa temprana no viene de la infraestructura; viene de la ausencia de infraestructura.</p><h3>El timing de la migraci&#243;n</h3><p>Una objeci&#243;n leg&#237;tima: "entiendo el argumento, pero &#191;no es peor migrar despu&#233;s, cuando el tr&#225;fico conduce?"</p><p>La respuesta corta es: rara vez. Migrar a primitivos gestionados es, por definici&#243;n, adoptar soluciones maduras que manejan la migraci&#243;n como un caso de uso est&#225;ndar. La migraci&#243;n inversa &#8212; de soluciones gestionadas a infraestructura propia &#8212; es la que s&#237; es costosa y peligrosa.</p><p>Recuerda la asimetr&#237;a del principio: si nunca creces, la infraestructura diferida nunca se paga. Si creces, migrar de Postgres gestionado a un cluster propio es mover datos de un sistema maduro a otro sistema maduro &#8212; un trabajo de fin de semana con herramientas probadas. Lo que casi nunca ocurre es que necesites migrar en medio de un pico de tr&#225;fico sin margen de error. Cuando llega ese momento, si los primitivos gestionados se han quedado cortos, suelen ofrecer rutas de escalado vertical indoloras antes de que necesites pensar en la escala horizontal.</p><p>La migraci&#243;n futura es un problema blando. La velocidad presente es un problema duro. No intercambies el presente por un futuro hipot&#233;tico.</p><p>---</p><p>---</p><h2>Conclusi&#243;n: Dejar de Construir Es la Estrategia</h2><p>Esto no es frugalidad barata. Es <strong>capital efficiency con otra funci&#243;n objetivo</strong>: la infraestructura lean no es una restricci&#243;n, es una ventaja competitiva que convierte tu recurso m&#225;s escaso (tiempo) en velocidad de entrega.</p><p>Tres takeaways:</p><p>1. Tu restricci&#243;n no es el dinero, es el tiempo. Dise&#241;a para &#233;l.</p><p>2. La "infraestructura propia" casi siempre es un primitivo disfrazado. Adopta el wrapper.</p><p>3. Sin alineaci&#243;n estrat&#233;gica, ninguna micro-optimizaci&#243;n te salva.</p><p>La trampa de la preparaci&#243;n se evita con una sola pregunta: <strong>&#191;esto sirve a mis usuarios actuales, o a un futuro imaginado?</strong></p><p>El bootstrap startup without funding &#8212; o con cualquier cantidad de funding &#8212; se construye con primitivos, velocidad y disciplina de no construir. Porque la decisi&#243;n m&#225;s eficiente que tomar&#225;s este trimestre no es qu&#233; montar. Es <strong>qu&#233; no montar</strong>.</p><p>Y esa decisi&#243;n se toma hoy.</p><p>No esperes a que el pr&#243;ximo trimestre te traiga m&#225;s datos. No esperes a que el tr&#225;fico crezca para justificar la auditor&#237;a. La auditor&#237;a se hace ahora, con lo que tienes, con los usuarios que tienes. Si algo de lo que est&#225;s manteniendo no sobrevive al test del usuario actual, al check de alineaci&#243;n o a la auditor&#237;a de primitivos, esa es tu oportunidad de recuperar horas.</p><p>La velocidad que recuperes esta semana &#8212; no la que recuperar&#225;s "cuando toque" &#8212; es la que decide si tu startup llega a ver el crecimiento que est&#225;s preparando. Porque la paradoja final es esta: toda la infraestructura que montas para el futuro imaginado la pagas precisamente con la velocidad que necesitas para llegar a ese futuro.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/eficiencia-de-capital-bootstrap-infraestructura-20260831?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Supabase vs Firebase 2026: Supabase es PostgreSQL con Gabardina, y el Miedo al Lock-In es lo que Menos Merece]]></title><description><![CDATA[Supabase vs Firebase 2026: Supabase no es "Firebase con SQL". Es PostgreSQL con gabardina. Descubre por qu&#233; el lock-in es lo que menos debes temer.]]></description><link>https://newsletter.brianmenagomez.com/p/supabase-vs-firebase-2026-supabase</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/supabase-vs-firebase-2026-supabase</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Sun, 30 Aug 2026 07:00:15 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/77803775-079d-4ff3-b1c2-9051ac1798b3_1080x810.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Supabase es PostgreSQL con Gabardina: tu REST API es PostgREST, tu auth es una tabla, tu realtime es LISTEN/NOTIFY y tu seguridad entera es Row Level Security</h2><p>Cada "feature m&#225;gica" de Supabase es un primitivo de Postgres disfrazado de API.</p><p>Tu REST API tipo CRUD no es middleware personalizado &#8212; es PostgREST exponiendo tu esquema directamente. Tus usuarios autenticados viven en una tabla `auth.users` que puedes cruzar con JOIN contra tu negocio. Tu realtime se apoya en LISTEN/NOTIFY y replicaci&#243;n l&#243;gica. Tu modelo de autorizaci&#243;n completo son pol&#237;ticas de Row Level Security evaluadas contra tu JWT.</p><p>Esto no es una paradoja curiosa ni un detalle de implementaci&#243;n para fan&#225;ticos de Postgres. Es la diferencia fundamental entre alquilar una plataforma y poseer un activo. Y una vez que lo ves, deja de ser posible volver a pensar en Supabase como "Firebase pero con SQL" sin sentir que est&#225;s haciendo trampa mental.</p><p><strong>Eso significa que el miedo m&#225;s grande que tiene la gente con Supabase &#8212; el lock-in &#8212; es exactamente lo que menos merece.</strong></p><p>No est&#225;s encerrado en una plataforma propietaria. Est&#225;s pagando por una orquestaci&#243;n de componentes open-source pegados alrededor de un Postgres que puedes mover cuando quieras. La relaci&#243;n de dependencia no es con un vendor cerrado sino con un est&#225;ndar de base de datos que lleva d&#233;cadas establecido y que no depende de la salud financiera de ninguna startup de San Francisco.</p><p>---</p><h2>El Reframing Que Cambia C&#243;mo Arquitectas</h2><p>Todo el mundo asume lo mismo: Supabase es "Firebase pero con SQL". Otro BaaS propietario al que te vas a quedar atado.</p><p>La realidad es la inversa. Con Firebase, tus datos viven detr&#225;s de una API propietaria y una migraci&#243;n significa reescribir queries. Cada llamada `firestore.collection('x').get()` es una invocaci&#243;n a un contrato que solo Google conoce y que Google puede cambiar cuando le plazca. Tu esquema no es tuyo: es una proyecci&#243;n de las reglas de Firestore. La migraci&#243;n no es un `pg_dump` sino una reescritura completa de la capa de datos de tu aplicaci&#243;n.</p><p>Con Supabase, el contrato entero es "es Postgres". El REST API se genera del esquema. La tabla de auth es SQL est&#225;ndar. Un `pg_dump` se lleva todo contigo. Incluso las features que parecen m&#225;s acopladas &#8212; el realtime, las pol&#237;ticas de seguridad &#8212; son extensiones de un motor de base de datos cuyo comportamiento est&#225; documentado en manuales que no dependen de un roadmap de startup.</p><p>El framework mental correcto: <strong>no est&#225;s comprando una base de datos. Est&#225;s comprando el ensamblaje</strong> &#8212; el pegamento entre Postgres, PostgREST, un servicio de auth en Go, un servidor de realtime en Elixir y storage compatible con S3.</p><p>Esos componentes existen todos por separado. Puedes montarlos t&#250; mismo. Lo que Supabase vende es la integraci&#243;n: el DX, la cadencia de releases coordinada, el dashboard, las Edge Functions y el hecho de que todo funcione junta con un solo comando en local. Esa es la distinci&#243;n importante &#8212; entre lo que <em>es</em> la plataforma y lo que <em>hace</em> la plataforma. Lo que hace es orquestar. Lo que es, sigue siendo Postgres.</p><p>Hay una analog&#237;a &#250;til con el mercado de inteligencia artificial. Cuando un producto como Claude o GPT te da una API, est&#225;s comprando acceso a un modelo cuyo comportamiento solo puedes controlar mediante prompts y par&#225;metros. Migrar entre proveedores significa reentrenar tus h&#225;bitos de prompting. Con Postgres, en cambio, el lenguaje de query no es una abstracci&#243;n propietaria; es SQL, un est&#225;ndar que precede a cualquier startup y que seguir&#225; existiendo si Supabase desaparece ma&#241;ana. La lecci&#243;n es la misma: cuando el contrato es un est&#225;ndar abierto, la portabilidad es una propiedad del sistema, no una promesa del vendor.</p><p>---</p><h2>Evidencia: Cada "Magia" es un Primitivo de Postgres</h2><h3>1. El REST API no existe &#8212; es tu esquema</h3><p>Crea una tabla con su pol&#237;tica de RLS y ya tienes un endpoint funcional sin escribir ni una l&#237;nea de servidor:</p><p>```sql</p><p>-- Cero c&#243;digo de aplicaci&#243;n. Cero middleware.</p><p>create table posts (</p><p>id bigint generated always as identity primary key,</p><p>title text not null,</p><p>author_id uuid not null references auth.users(id)</p><p>);</p><p>alter table posts enable row level security;</p><p>create policy 'read all' on posts for select using (true);</p><p>create policy 'insert own' on posts for insert with check (auth.uid() = author_id);</p><p>```</p><p>Ahora `curl https://&lt;tu-proyecto&gt;.supabase.co/rest/v1/posts` con la cabecera de anon apikey devuelve datos. El endpoint no es una feature. Es tu tabla expuesta por PostgREST.</p><p>Detente un segundo aqu&#237;. Ese curl funciona porque PostgREST traduce cada petici&#243;n HTTP a una query SQL sobre tu esquema. El filtro, la paginaci&#243;n, el select de columnas espec&#237;ficas: todo es SQL transpilado a HTTP. Si migras a un Postgres hosteado en cualquier otro sitio, puedes levantar PostgREST t&#250; mismo en un contenedor y el mismo curl funciona con un cambio de URL. No hay c&#243;digo de aplicaci&#243;n que reescribir porque no hab&#237;a c&#243;digo de aplicaci&#243;n en primer lugar.</p><p>Este es el punto donde la gente suele hacer la pregunta obvia: "&#191;y si necesito l&#243;gica de negocio m&#225;s compleja que un CRUD?" La respuesta es que PostgREST soporta funciones de Postgres expuestas como endpoints RPC, y para todo lo dem&#225;s est&#225;n las Edge Functions en Deno. Pero la arquitectura mental correcta es invertir el orden: empieza por el esquema y sube. No empieces por el servidor y bajes.</p><h3>2. Realtime es un case study de reutilizar primitivos</h3><p>`postgres_changes` usa replicaci&#243;n l&#243;gica &#8212; perfecto para eventos a nivel de fila que escalan. Presence y broadcast usan LISTEN/NOTIFY &#8212; ligero pero con l&#237;mites de fan-out.</p><p>Saber cu&#225;l respalda tu canal te dice cu&#225;ndo va a romperse. Presence de alta frecuencia entre miles de clientes no es lo que LISTEN/NOTIFY fue dise&#241;ado para soportar:</p><p>```js</p><p>const channel = supabase.channel('posts-live')</p><p>.on('postgres_changes', {</p><p>event: 'INSERT',</p><p>schema: 'public',</p><p>table: 'posts'</p><p>}, payload =&gt; console.log(payload.new))</p><p>.subscribe();</p><p>// El filtro se ejecuta en Postgres, no en el cliente</p><p>```</p><p>Lo que la mayor&#237;a de la gente no aprecia es la separaci&#243;n de responsabilidades que hay detr&#225;s. `postgres_changes` se implementa sobre el mecanismo de replicaci&#243;n l&#243;gica que Postgres usa desde hace a&#241;os para replicaci&#243;n entre servidores. Cuando te suscribes con un filtro de schema/table/event, ese filtro se eval&#250;a en el motor de Postgres, no en un hub central de mensajer&#237;a. La consecuencia pr&#225;ctica: los payloads que llegan al cliente ya est&#225;n filtrados, la autorizaci&#243;n de RLS se aplica en la propia fila, y no hay una capa intermedia de eventos que duplique tus datos.</p><p>Esto importa porque el error cl&#225;sico de las plataformas BaaS es tratar el realtime como una feature independiente de la base de datos. Aqu&#237; el realtime es un subproducto de la base de datos. Si entiendes que LISTEN/NOTIFY es broadcast puro sin garant&#237;as de orden ni persistencia, sabes que no debes construir un sistema de colas de mensajes sobre presence. Y si entiendes que la replicaci&#243;n l&#243;gica es el motor de `postgres_changes`, sabes que la fiabilidad del sistema depende de Postgres, no de un servicio de websockets propietario.</p><h3>3. Tu auth es "solo una tabla" &#8212; y eso tiene las dos caras</h3><p>```js</p><p>const { data } = await supabase.auth.signUp({ email, password });</p><p>// El usuario aterriza en auth.users. Una tabla normal.</p><p>// Queries posteriores viajan con el JWT:</p><p>const { data: posts } = await supabase.from('posts').select('*');</p><p>// RLS eval&#250;a auth.uid() fila a fila. No hay middleware.</p><p>```</p><p>La cara buena: joins entre `auth.users` y tus tablas de negocio te dan anal&#237;tica, paneles de admin y queries por usuario gratis. Cada tabla que quieras consultar con la identidad del usuario se cruza con una foreign key hacia `auth.users(id)` sin necesidad de sincronizar con un servicio de usuarios separado. No hay evento de usuario duplicado en un bucket de S3 ni una llamada a una API de gesti&#243;n de identidades que no conoces.</p><p>La cara mala: los metadatos de usuario viven en la misma base que tus datos de producto. PII, retenci&#243;n y preguntas tipo GDPR se convierten en preguntas de base de datos, no de servicio aparte. Cuando borras usuarios de `auth.users`, tienes que pensar en cascada: &#191;qu&#233; pasa con sus posts, sus comentarios, sus sesiones? &#191;Anonimizas o borras en cascada con foreign keys? &#191;C&#243;mo manejas el derecho al olvido cuando tu esquema de negocio referencia a ese usuario? Estas preguntas no desaparecen con Firebase, pero con Supabase son preguntas de SQL que t&#250; controlas, no campos de un formulario de consola de administraci&#243;n.</p><p>La decisi&#243;n de dise&#241;o aqu&#237; es profunda: al mantener auth y negocio en la misma base, Supabase intercambia la separaci&#243;n de responsabilidades por la capacidad de hacer joins. Para la mayor&#237;a de los proyectos, ese intercambio vale la pena &#8212; es el mismo trade-off que hace cualquier base de datos relacional bien dise&#241;ada. Lo importante es que la decisi&#243;n la tomas t&#250;, con conocimiento, no una que el vendor tom&#243; por ti.</p><h3>4. Edge Functions y Storage siguen siendo pluggable</h3><p>Las Edge Functions corren en Deno y Storage es compatible con S3. Nada propietario:</p><p>```js</p><p>// Deno.serve: la l&#243;gica de negocio corre fuera del app server</p><p>Deno.serve(async (req) =&gt; {</p><p>const { data } = await supabase.from('posts').select('*');</p><p>return new Response(JSON.stringify(data), {</p><p>headers: { 'Content-Type': 'application/json' }</p><p>});</p><p>});</p><p>```</p><p>Storage es un caso particularmente revelador. El API de storage de Supabase es un prefijo de S3: objetos, buckets, URLs firmadas para uploads y downloads, pol&#237;ticas de acceso por bucket. Si ma&#241;ana decidieras mover tus archivos a cualquier proveedor S3 &#8212; AWS, la nube de tu empresa, MinIO en tu servidor &#8212; el &#250;nico coste es cambiar el endpoint y reconfigurar los buckets. Los archivos son tuyos, el API es est&#225;ndar.</p><p>Y para las Edge Functions, Deno es un runtime de JavaScript/TypeScript open-source que puedes ejecutar en cualquier sitio. La contribuci&#243;n de Supabase aqu&#237; es el gestionado: el deploy con un solo comando, el autoscaling, la integraci&#243;n con la base de datos. Pero el c&#243;digo que escribes no depende de ning&#250;n SDK propietario. Es el mismo patr&#243;n que en el resto de la plataforma: el ensamblaje es de Supabase, el material es est&#225;ndar.</p><h3>5. Todo es self-hostable</h3><p>Un Docker Compose levanta Postgres m&#225;s la API, auth, realtime, storage y studio localmente. `docker compose up` en supabase/docker arranca el stack entero.</p><p>Esto no es un truco de marketing. Significa que puedes hacer tu desarrollo local completo sin tocar la nube, con tus migraciones, tus policies y tus tests. Y significa &#8212; esto es lo importante&#8212; que el stack completo es reproducible fuera de la plataforma hosted. Vale la pena enfatizar el contraste con el resto del mercado BaaS, donde el "entorno local" suele ser un emulador con un subconjunto de features. Aqu&#237; no hay emulador: es el mismo c&#243;digo, el mismo Postgres, los mismos binarios.</p><p>---</p><h2>El Impuesto Oculto Real: tus H&#225;bitos, No el Vendor</h2><p>Aqu&#237; est&#225; la paradoja del lock-in.</p><p>Con Firebase o Firestore, el impuesto es estructural: tus datos viven detr&#225;s de una API propietaria y la migraci&#243;n significa reescribir queries. Ese es el motor de negocio. El vendor gana cuando te quedas. El ecosistema completo &#8212; las reglas de seguridad de Firestore, el SDK, el modelo de documentos &#8212; se dise&#241;a para que la fricci&#243;n de salir sea m&#225;xima.</p><p>Con Supabase, el "impuesto" solo existe si t&#250; lo creas:</p><p>&#10060; <strong>Si construyes tablas clickeando en el dashboard</strong> y escribes l&#243;gica de autorizaci&#243;n en el cliente, te has encerrado t&#250; mismo. Da igual que el Postgres subyacente sea portable. Lo que se ha vuelto inportable es tu proceso: tu esquema no est&#225; versionado, tu seguridad no est&#225; en la base de datos, y el conocimiento que has acumulado sobre tu propio sistema vive en clicks de interfaz que no puedes reproducir en otro Postgres.</p><p>&#9989; <strong>Si versionas tu esquema como migraciones SQL</strong> y pones tu seguridad en RLS, tu contrato con Supabase es trivial de romper. El `pg_dump` se lleva los datos, las migraciones se llevan el esquema, las policies se llevan la seguridad, y un PostgREST levantado localmente replica el API.</p><p><strong>El riesgo de lock-in no es el vendor. Son tus h&#225;bitos de equipo.</strong></p><p>Si dependes de clicks en el dashboard y l&#243;gica client-side, te has encerrado independientemente de lo portable que sea el Postgres debajo. El Postgres no te va a salvar de un proceso que no versiona el esquema.</p><p>Esto conecta con una verdad m&#225;s general del software: la fricci&#243;n de migrar no la crea la tecnolog&#237;a, la crea el conocimiento t&#225;cito acumulado sobre la tecnolog&#237;a. Si ese conocimiento est&#225; en SQL versionado y policies documentadas, es transferible. Si est&#225; en la cabeza de la persona que clickeaba el dashboard, no se va a transferir nunca.</p><p>---</p><h2>RLS Como Modelo de Seguridad: el Cambio Mental</h2><p>Aqu&#237; va el cambio de chip que poca gente explica bien.</p><p>El frontend habla con la base de datos directamente. Eso significa que la autorizaci&#243;n <strong>tiene que vivir en la base de datos o no existe</strong>. Esto invierte la asunci&#243;n cl&#225;sica de "conf&#237;a en el app server".</p><p>En una arquitectura tradicional, el servidor filtra: el cliente pide, el servidor decide. Con Supabase, el cliente puede ejecutar queries directamente contra el REST API. Si la pol&#237;tica de RLS no est&#225; en la tabla, la fila es visible y editable para cualquiera con una API key de anon. Nada te protege. La seguridad deja de ser un middleware y se convierte en una propiedad del esquema.</p><p>Esto tiene implicaciones de dise&#241;o que van m&#225;s all&#225; de "escribe un `create policy`". Por ejemplo:</p><ul><li><p>Cada pol&#237;tica debe evaluar el JWT con `auth.uid()` o `auth.jwt()`. No puedes confiar en un campo booleano guardado en el cliente.</p></li><li><p>Las pol&#237;ticas se eval&#250;an por fila. Una query con un JOIN que cruza tablas con pol&#237;ticas distintas aplica cada pol&#237;tica en su tabla. Entender c&#243;mo se componen las pol&#237;ticas entre joins es fundamental para no filtrar datos por accidente.</p></li><li><p>Las funciones de Postgres que usan `security definer` se saltan las pol&#237;ticas de RLS. Son una herramienta potente &#8212; para servicio a servicio o para l&#243;gica que necesita traspasar la seguridad por fila &#8212; pero tambi&#233;n un riesgo si no se controlan.</p></li></ul><p>El coste de depuraci&#243;n es real: una policy demasiado permisiva es silenciosa. Y una query que devuelve vac&#237;o cuando esperabas datos puede dejarte horas mirando un SELECT que deber&#237;a funcionar.</p><p>Por eso el desarrollo local con `supabase start` y testear policies en SQL no es negociable. Y por eso el modelo documentado de Supabase es "RLS en cada tabla con checks de `auth.uid()`", no guardias en el app layer.</p><p>El impuesto de depuraci&#243;n se aprende. Y se paga solo en seguridad.</p><p>---</p><h2>El Protocolo de Salida Ensayada</h2><p>Este es el framework que te permite soltar Supabase cuando quieras &#8212; y el que convierte la portabilidad en una feature, no en esperanza.</p><h3>Paso 1: Versiona tu esquema como migraciones desde el d&#237;a uno</h3><p>Nada de clickear tablas en el dashboard. Usa `supabase db push` o una carpeta de migraciones versionada. Esto es lo que hace real la afirmaci&#243;n de portabilidad. Cada cambio de esquema, cada policy, cada funci&#243;n de Postgres es un archivo `.sql` que tu equipo revisa en un pull request igual que revisa el c&#243;digo de la aplicaci&#243;n. Si ma&#241;ana cambias de plataforma, el esquema no vive en Supabase: vive en tu repositorio.</p><h3>Paso 2: RLS en cada tabla antes de escribir l&#243;gica de autorizaci&#243;n</h3><p>Pon tus policies (con `auth.uid()` y `auth.jwt()`) antes de escribir cualquier guardia en el app. RLS es la &#250;nica fuente de verdad para el control de acceso. La regla es simple: si una tabla no tiene RLS habilitada con al menos una policy, es una tabla p&#250;blica o una tabla rota. No deber&#237;an existir tablas en esa zona gris.</p><h3>Paso 3: Dise&#241;a tu esquema de auth intencionalmente</h3><p>Referencia `auth.users(id)` con foreign keys. Trata la tabla de usuarios como parte de tu modelo de datos. Auth y negocio conviven en una sola base consultable. Preguntas como "&#191;qu&#233; usuarios han escrito m&#225;s posts este mes?" son un JOIN, no una integraci&#243;n con un servicio externo.</p><h3>Paso 4: Usa Realtime con filtros en servidor</h3><p>Suscr&#237;bete con `postgres_changes` y filtra por schema/table/event. Nada de suscribirte a tablas enteras y filtrar en el cliente. Payloads peque&#241;os y autorizaci&#243;n dentro de Postgres. El filtro en el cliente es una invitaci&#243;n a enviar datos que el cliente no deber&#237;a recibir y a escalar un fan-out que no necesitas.</p><h3>Paso 5: Ensaya el drill de salida antes de necesitarlo</h3><p>Peri&#243;dicamente, prueba un restore de `pg_dump` en una instancia de Postgres puro:</p><p>```bash</p><p>supabase start          # Postgres local + todos los servicios</p><p>supabase db push        # migraciones versionadas</p><p>pg_dump -Fc ...         # tu base entera se va contigo</p><p>```</p><p>"soltar Supabase en cualquier momento" es una operaci&#243;n ensayada, no una esperanza. Igual que se ensayan los disaster recovery plans en producci&#243;n, ensayar la migraci&#243;n fuera de la plataforma te da dos cosas: la confianza de que puedes hacerlo, y el diagn&#243;stico temprano de cualquier cosa que se haya acoplado accidentalmente a la plataforma.</p><p>---</p><h2>La Pregunta "&#191;Por Qu&#233; No Montarlo Yo Mismo?"</h2><p>Todos los componentes existen por separado. Postgres + PostgREST + un servicio de auth en Go + un servidor de realtime en Elixir + S3.</p><p>&#191;Por qu&#233; no saltarte Supabase y montarlos t&#250;?</p><p>Por la misma raz&#243;n por la que nadie monta su propio corredor de mensajes antes de lanzar un MVP: el valor no est&#225; en las piezas, est&#225; en el ensamblaje. El DX local, el dashboard, el workflow de migraciones, las Edge Functions en Deno y la cadencia de release coordinada entre componentes.</p><p>Puedes reconstruir el ensamblaje si tienes el apetito de operaciones. No quieres tenerlo.</p><p>Pi&#233;nsalo en t&#233;rminos de coste de oportunidad. Cada hora que dedicas a parchear el realtime de Elixir o a mantener actualizado tu auth server en Go es una hora que no dedicas a tu producto. El ensamblaje de Supabase ya est&#225; resuelto, testado y versionado. Lo que te queda a ti es lo &#250;nico que de verdad importa: el esquema, las policies y la l&#243;gica de negocio. La diferencia entre comprar el ensamblaje y construirlo no es el dinero &#8212; es la atenci&#243;n.</p><p>Existe, eso s&#237;, un escenario leg&#237;timo para montarlo t&#250; mismo: si tu equipo tiene una necesidad operativa que el ensamblaje hosted no cubre &#8212; una red privada estricta, compliance de datos que proh&#237;be proveedores externos, o un volumen de throughput que no justifica el coste del hosted. En esos casos, el hecho de que todo sea open-source y self-hostable es exactamente la salida que necesitas. Ni siquiera en ese escenario te quedas atrapado: puedes empezar hosted y migrar a self-hosted cuando la escala lo justifique, con la certeza de que los componentes son los mismos.</p><p>---</p><h2>Conclusi&#243;n</h2><p>Supabase no es un servicio de base de datos. Es un Postgres con una capa fina de orquestaci&#243;n encima &#8212; y cada "feature m&#225;gica" es un primitivo de Postgres disfrazado de API.</p><p>Eso invierte la conversaci&#243;n sobre lock-in. Con Firestore, tu impuesto es estructural. Con Supabase, el &#250;nico impuesto que pagas es el que te impones con clicks en el dashboard y l&#243;gica client-side.</p><p>La lecci&#243;n real del debate supabase vs firebase 2026: no est&#225;is eligiendo entre dos BaaS. Est&#225;is eligiendo entre una API propietaria que os cobra por quedarse y un Postgres portable que se va con vosotros en un `pg_dump`.</p><p>El ensamblaje lo alquila. La base de datos es vuestra.</p><p>Y eso, a la larga, es la diferencia que importa. Porque el software que sobrevive a sus vendors no es el que tiene el mejor DX ni el ecosistema m&#225;s brillante &#8212; es el que se construye sobre est&#225;ndares que cualquiera puede ejecutar. Postgres lleva d&#233;cadas demostrando esa longevidad. Supabase, al elegir envolverlo en lugar de reinventarlo, ha hecho algo m&#225;s inteligente de lo que parece a primera vista: ha convertido la base de datos m&#225;s fiable de la industria en un servicio moderno sin renunciar a lo que la hace fiable. Ese es el trade-off que merece la pena hacer.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/supabase-vs-firebase-2026-postgresql-con-gabardina-20260830?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El 73% de los SaaS Fracasa — y No Es por Mal Producto. Es por un Onboarding con el Mapa Equivocado.]]></title><description><![CDATA[El 73% de los SaaS fracasa no por mal producto sino por un onboarding con el mapa equivocado. Aprende el diagn&#243;stico conductual de los primeros 7 d&#237;as.]]></description><link>https://newsletter.brianmenagomez.com/p/el-73-de-los-saas-fracasa-y-no-es</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-73-de-los-saas-fracasa-y-no-es</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Sun, 30 Aug 2026 07:00:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3fa80dbd-690b-485d-a07c-b3d9b7f55d5f_1080x608.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 73% de los SaaS que Fracasan No Cae por Mal Producto. Es por un Onboarding con el Mapa Equivocado.</strong></h2><p>Crees que tu churn es un problema de producto. Que si la feature es mejor, el dise&#241;o m&#225;s claro, o el precio m&#225;s justo, la retenci&#243;n subir&#225;.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>La cifra citada en la industria &#8212;73% de los SaaS que fracasan&#8212; no apunta al c&#243;digo. Apunta al d&#237;a 1: <strong>el onboarding entrega el mapa equivocado desde el primer login.</strong></p><p>El onboarding no es UX. No es un checklist bonito ni un tour de producto pulido. <strong>Es un mapa estrat&#233;gico</strong> que gu&#237;a al usuario hacia el valor. Y si el mapa es el equivocado, una ejecuci&#243;n perfecta lleva al usuario al destino equivocado. O lo deja perdido a mitad de camino.</p><p>El 73% de los SaaS no fracasa por tener churn alto: <strong>fracasa porque el churn es solo el s&#237;ntoma tard&#237;o de un desajuste que empez&#243; el d&#237;a 1.</strong></p><p>Piensa en t&#233;rminos de navegaci&#243;n real: si un GPS est&#225; mal configurado, por muy bonita que sea la interfaz, por muy fluidas que sean las instrucciones paso a paso, te llevar&#225; a una rotonda equivocada o a un callej&#243;n sin salida. El dise&#241;o del GPS no es el problema. El destino lo es. En SaaS ocurre exactamente igual: puedes tener el mejor tooltip del mercado, el wizard m&#225;s elegante y el checklist m&#225;s gamificado, pero si el destino al que conducen no coincide con el valor real que tu producto puede entregar al segmento que lo usa, todo ese esfuerzo t&#225;ctico se pierde.</p><p>Este art&#237;culo va a desmontar el ciclo completo: por qu&#233; el churn miente, c&#243;mo leer la se&#241;al real en los primeros 7 d&#237;as, por qu&#233; el mapa correcto depende de tu modelo de crecimiento y de tu segmento, y qu&#233; pasos concretos puedes dar esta semana para diagnosticar (y corregir) el mapa antes de que sea tarde.</p><p>---</p><h2><strong>El Churn Miente. El Comportamiento de los Primeros 7 D&#237;as Dice la Verdad.</strong></h2><p>Aqu&#237; est&#225; el problema de fondo: el churn es una m&#233;trica agregada y rezagada. Es un indicador que llega <strong>meses tarde</strong> y culpa al producto cuando el verdadero culpable es el desajuste entre modelo de crecimiento y segmento de cliente.</p><p>Cuando el churn aparece en tu dashboard, el fracaso del onboarding ya ocurri&#243; hace semanas. Los usuarios ya se fueron. Los datos ya son historia.</p><p>Las se&#241;ales reales viven en los primeros d&#237;as:</p><p>&#8594; Tasa de activaci&#243;n por segmento</p><p>&#8594; Tiempo hasta el primer valor</p><p>&#8594; Abandono de la acci&#243;n core</p><p>&#8594; Features que se ignoran sistem&#225;ticamente</p><p>Estas son <strong>m&#233;tricas l&#237;deres</strong>. Te dicen en d&#237;as lo que el churn te contar&#225; en meses. Y te dicen *d&#243;nde<em> est&#225; el desajuste, no solo </em>que* existe.</p><p>Imagina que pilotas un avi&#243;n y tu &#250;nico instrumento es el alt&#237;metro que marca la altitud del aeropuerto de destino. Si vas rumbo a otra ciudad, solo te enterar&#225;s cuando ya sea demasiado tarde para corregir. Las m&#233;tricas l&#237;deres del onboarding son tu giroscopio y tu br&#250;jula: te dicen si est&#225;s en el rumbo correcto <em>mientras a&#250;n tienes tiempo de corregir</em>. El churn es el alt&#237;metro: &#250;til para confirmar que aterrizaste donde no deb&#237;as, in&#250;til para evitar el error de rumbo.</p><p>Concretamente, hay una diferencia operativa importante entre ambas familias de m&#233;tricas. El churn mensual (MRR churn o logotipo) se calcula sobre cohortes de hace 90 o 180 d&#237;as. Para cuando sabes que la cohorte de junio fall&#243;, la empresa ya ha gastado su presupuesto de adquisici&#243;n de agosto. Las m&#233;tricas de primeros d&#237;as, en cambio, se pueden observar en tiempo real y, sobre todo, se pueden correlacionar con la cohorte exacta que est&#225; entrando hoy. Eso convierte al diagn&#243;stico en una operaci&#243;n continua, no en una autopsia trimestral.</p><p><strong>Los dashboards de churn deber&#237;an relegarse a confirmaci&#243;n de hip&#243;tesis.</strong> La vigilancia real est&#225; en el comportamiento del d&#237;a 1 al d&#237;a 7. No necesitas esperar a que una cohorte complete su ciclo de vida para saber si tu onboarding funciona: la se&#241;al te la da la primera semana de cada nuevo signup.</p><p>---</p><h2><strong>El Churn Como S&#237;ntoma, No Como Causa</strong></h2><p>Vamos a desmontar el mito con se&#241;ales conductuales concretas. Estas son las firmas de un mapa equivocado &#8212; y ninguna aparece en tu dashboard de churn:</p><p>&#10060; <strong>Usuarios que completan todo el setup pero nunca ejecutan la acci&#243;n core.</strong> Hicieron todos los pasos del checklist. Importaron datos. Conectaron cuentas. Y nunca usaron la feature central. No es pereza: es que el mapa los llev&#243; a un destino que no era el valor.</p><p>Este es quiz&#225; el patr&#243;n m&#225;s enga&#241;oso porque activa todas las m&#233;tricas de "&#233;xito" del onboarding tradicional: completaron el wizard, importaron los datos, conectaron las integraciones. El producto deber&#237;a estar funcionando. Pero la acci&#243;n core &#8212;la que produce el valor y, por tanto, la retenci&#243;n&#8212; nunca ocurre. &#191;Por qu&#233;? Porque el checklist estaba dise&#241;ado para completar pasos, no para producir valor. Cuando dise&#241;as el onboarding como una serie de tareas administrativas, obtienes usuarios que completan tareas administrativas. El valor no estaba en el mapa.</p><p>&#10060; <strong>Alta adopci&#243;n de features perif&#233;ricas con activaci&#243;n baja de la central.</strong> Los usuarios exploran y usan las funciones secundarias porque son f&#225;ciles. Nunca alcanzan el momento "aha" porque el camino hacia &#233;l no est&#225; se&#241;alizado.</p><p>En SaaS de tama&#241;o medio es habitual que la feature central sea la m&#225;s compleja de configurar. Las perif&#233;ricas (ajustes, preferencias, integraciones f&#225;ciles) requieren menos contexto y se pueden explorar por curiosidad. El resultado es un usuario "activo" que en realidad nunca ha vivido el valor. Si tu dashboard de engagement muestra sesiones frecuentes pero tu activaci&#243;n de la feature core no sube, tienes un mapa que conduce a los pasillos del edificio pero no a la sala principal.</p><p>&#10060; <strong>Sesiones que parecen productivas pero no convergen al aha moment.</strong> El usuario pasa tiempo en el producto, hace clicks, configura cosas... y aun as&#237; no activa. El producto parece funcionar. El mapa no.</p><p>Este patr&#243;n es el m&#225;s dif&#237;cil de detectar porque no hay un fracaso evidente. No hay errores t&#233;cnicos, no hay usuarios bloqueados, no hay rage clicks. Simplemente, la energ&#237;a se dispersa. El usuario explora, juega, configura... y se va sin haber cruzado el umbral del valor. En estas sesiones el tiempo de interacci&#243;n es alto pero el progreso hacia la activaci&#243;n es nulo.</p><p>&#9989; <strong>El diagn&#243;stico correcto:</strong> estas firmas conductuales revelan el desajuste <strong>antes</strong> de que el churn lo confirme. Cada una apunta a un punto exacto donde el mapa se desv&#237;a del valor real.</p><p>La clave de estas tres firmas es que todas son observables en una herramienta de anal&#237;tica de producto est&#225;ndar (Mixpanel, Amplitude o PostHog) sin gran complejidad t&#233;cnica. Solo necesitas tener definido el evento de activaci&#243;n &#8212;del que hablaremos en el Paso 4&#8212; y segmentar el comportamiento por tipo de usuario. Si ves cualquiera de las tres firmas en los primeros 7 d&#237;as, el diagn&#243;stico no est&#225; en duda: el mapa apunta a otro sitio que no es el valor.</p><p>---</p><h2><strong>El Mapa Correcto Depende de Tu Modelo de Crecimiento</strong></h2><p>El desajuste m&#225;s com&#250;n no est&#225; en el onboarding en s&#237;. Est&#225; entre tu <strong>modelo de crecimiento</strong> y tu <strong>dise&#241;o de onboarding</strong>. Funciona as&#237;:</p><p><strong>En un modelo PLG (Product-Led Growth):</strong> el valor debe alcanzarse en auto-servicio <strong>antes</strong> de pedir cualquier compromiso. El onboarding tiene que conseguir que el usuario vea el "aha" sin hablar con nadie. Si pones un paywall o pides datos demasiado pronto, rompes el mapa.</p><p>En PLG el producto es, simult&#225;neamente, el canal de adquisici&#243;n, la demo y el vendedor. El usuario aterriza, se registra solo, y debe llegar al valor en minutos o en esa primera sesi&#243;n. Cualquier fricci&#243;n &#8212;un formulario de 8 campos, una demo requerida, un paywall prematuro&#8212; no es un inconveniente menor: es un desv&#237;o del mapa que puede costarte el usuario entero. En este modelo, el time-to-value no es una m&#233;trica a optimizar: es la columna vertebral del negocio.</p><p><strong>En un modelo Sales-Led:</strong> el onboarding puede y debe usar intervenci&#243;n humana. Puedes sacrificar velocidad a cambio de cualificar mejor al cliente. Tu mapa puede incluir llamadas, demos y asistencia humana desde el d&#237;a 1 &#8212; el time-to-value ser&#225; m&#225;s largo, y eso es correcto.</p><p>En Sales-Led el valor no tiene que ser inmediato. Lo que importa es que el cliente enterprise se sienta acompa&#241;ado, que el caso de uso est&#233; bien definido y que la implementaci&#243;n sea guiada por una persona. Aqu&#237;, un onboarding 100% auto-servicio y fr&#237;o no es eficiencia: es abandono. El mapa correcto incluye a los humanos como feature del producto. La cualificaci&#243;n cuenta m&#225;s que la velocidad.</p><p><strong>Los desajustes t&#237;picos que matan el mapa:</strong></p><p>&#8594; Paywalls o pedidos de datos <strong>demasiado tempranos</strong> en un producto PLG. Matas la activaci&#243;n antes de que el valor exista.</p><p>&#8594; Flujos de auto-servicio <strong>fr&#237;os</strong> en segmentos enterprise que necesitan gu&#237;a humana desde el d&#237;a 1. El mapa los deja solos donde necesitan a una persona.</p><p>&#8594; Un mapa <strong>&#250;nico para todos</strong>: tu early adopter t&#233;cnico y tu cliente mainstream no comparten el mismo d&#237;a 1. Uno quiere poder, el otro quiere sencillez. Un solo mapa no puede servir a ambos.</p><p>Este &#250;ltimo punto merece atenci&#243;n especial porque es el m&#225;s frecuente en la pr&#225;ctica. Cometes el error de dise&#241;ar el onboarding para el usuario que tienes en mente &#8212;normalmente, el m&#225;s parecido a ti&#8212; y luego te sorprendes de que la mitad de tus se&#241;ales de comportamiento no cuadran. La raz&#243;n es sencilla: no existe "el usuario" de tu SaaS. Existe una distribuci&#243;n de usuarios con expectativas y niveles de madurez distintos, y cada uno necesita un camino distinto hacia el valor. Un &#250;nico mapa no es neutral: sesga hacia un segmento y abandona a los dem&#225;s.</p><p>Aqu&#237; conecta una lecci&#243;n importante del mundo del emprendimiento: el Product-Market Fit crea el despegue, pero el ajuste estrat&#233;gico &#8212;incluido el del onboarding con el modelo de crecimiento&#8212; crea la permanencia. Muchos productos SaaS consiguen tr&#225;fico y registros (product-market fit superficial) pero fracasan en convertir ese inter&#233;s inicial en retenci&#243;n. El ajuste estrat&#233;gico del onboarding es justamente el puente entre el momento del registro y la dominaci&#243;n del mercado.</p><p>---</p><h2><strong>El Patr&#243;n de los 7 D&#237;as: Diagn&#243;stico y Correcci&#243;n en un Solo Marco</strong></h2><p>He usado este proceso en cada SaaS que he construido &#8212; desde gestor&#237;as en Espa&#241;a hasta herramientas B2B. Lo llamo <strong>El Patr&#243;n de los 7 D&#237;as</strong>. Va as&#237;:</p><h3><strong>Paso 1: Audita el comportamiento de los primeros 7 d&#237;as antes de mirar el churn</strong></h3><p>Deja de mirar el churn como primera m&#233;trica. Abre tu anal&#237;tica de producto &#8212; Mixpanel, Amplitude o PostHog funcionan &#8212; y mira:</p><p>&#8594; &#191;D&#243;nde se desv&#237;an los usuarios del camino esperado?</p><p>&#8594; &#191;Qu&#233; features ignoran sistem&#225;ticamente por segmento?</p><p>&#8594; &#191;Alcanzan el evento "aha" definido, y en cu&#225;nto tiempo?</p><p>La idea es reconstruir el viaje real de cada cohorte semanal desde el registro hasta el d&#237;a 7, sin las gafas del dise&#241;o ideal. Preg&#250;ntate, para cada paso del onboarding: &#191;qu&#233; porcentaje de usuarios llega al siguiente paso? &#191;D&#243;nde cae la curva de forma pronunciada? Una ca&#237;da brusca del 60% al 20% entre el paso 2 y el paso 3 es una se&#241;al inequ&#237;voca de un desajuste localizado.</p><h3><strong>Paso 2: Declara expl&#237;citamente tu modelo de crecimiento</strong></h3><p>Nada de h&#237;bridos difusos. Escribe la regla: <em>en este producto, el valor se alcanza en auto-servicio antes de cualquier compromiso</em> (PLG) o <em>el onboarding usa intervenci&#243;n humana para cualificar</em> (Sales-Led). Ahora compara el onboarding con esa regla.</p><p>Este paso parece de tr&#225;mite, pero es donde la mayor&#237;a de los equipos se bloquean. Declarar el modelo por escrito obliga a tomar decisiones inc&#243;modas: si eres PLG pero tu equipo de ventas insiste en cualificar leads antes del registro, tienes un conflicto estrat&#233;gico no resuelto que se manifestar&#225; en el d&#237;a 1. El onboarding no tiene un "problema de UX": tiene un problema de estrategia no decidida.</p><h3><strong>Paso 3: Dise&#241;a mapas por segmento y por madurez</strong></h3><p>Tu early adopter t&#233;cnico no quiere un wizard explicando conceptos b&#225;sicos. Tu cliente mainstream no quiere un formulario con campos avanzados. Segmenta el d&#237;a 1:</p><p>&#8594; Segmento t&#233;cnico: mapa m&#237;nimo, acceso temprano al poder.</p><p>&#8594; Segmento mainstream: gu&#237;a paso a paso, sin asumir jerga.</p><p>C&#243;mo hacerlo en la pr&#225;ctica: captura una &#250;nica se&#241;al de segmentaci&#243;n al inicio del onboarding &#8212;rol, tama&#241;o de empresa, o quiz&#225;s simplemente una pregunta de "&#191;qu&#233; quieres hacer aqu&#237;?"&#8212; y ramifica los siguientes pasos. No necesitas segmentaci&#243;n sofisticada basada en machine learning. Necesitas dos (o tres) caminos bien dise&#241;ados en lugar de uno gen&#233;rico mal dise&#241;ado para todos.</p><h3><strong>Paso 4: Define el evento de activaci&#243;n por segmento</strong></h3><p>El "aha moment" no es universal. Def&#237;nelo por segmento y mide el <strong>time-to-value</strong> como indicador l&#237;der. Comp&#225;ralo contra el punto esperado de abandono.</p><p>Un error habitual es definir la activaci&#243;n como "completar el registro" o "crear el primer proyecto". Eso no es activaci&#243;n: es administraci&#243;n. La activaci&#243;n debe ser el evento que, cuando ocurre, correlaciona estad&#237;sticamente con la retenci&#243;n a 90 d&#237;as. Para descubrirlo, haz un an&#225;lisis retroactivo de las cohortes que s&#237; retuvieron y busca el evento com&#250;n que todas ejecutaron en su primera semana. Ese evento, y no el que te parece intuitivo, es tu evento de activaci&#243;n real.</p><h3><strong>Paso 5: Crea el bucle de correcci&#243;n</strong></h3><p>Cuando el comportamiento revele desajuste &#8212; setup completado pero acci&#243;n core nunca ejecutada &#8212; <strong>realimenta el dise&#241;o del onboarding y la segmentaci&#243;n</strong>. No te limites a pulir la UX: pregunta si el mapa en s&#237; es el correcto.</p><p>El bucle de correcci&#243;n debe ser un ritual recurrente, no una reacci&#243;n a crisis. Prop&#243;n una cadencia sencilla: cada viernes, revisa las m&#233;tricas del Patr&#243;n de los 7 D&#237;as de la cohorte de la semana anterior. Si aparece una de las tres firmas de desajuste, dedica la siguiente semana a redise&#241;ar el paso del mapa donde ocurre la desviaci&#243;n. As&#237; el onboarding deja de ser un proyecto puntual y se convierte en un sistema de mejora continua alineado con la estrategia.</p><p>---</p><h2><strong>Respondiendo a Tus Objeciones</strong></h2><p><strong>"Nuestro problema no es el onboarding: es el pricing o la competencia."</strong></p><p>No te estoy acusando de UX. Te estoy diciendo que <strong>el onboarding es donde el desajuste estrat&#233;gico modelo-segmento se hace visible primero</strong>. Si el mapa es correcto, tus dem&#225;s palancas &#8212; pricing, product-market fit &#8212; operan sobre usuarios que ya alcanzaron el valor. Sin eso, todas las dem&#225;s palancas empujan en vac&#237;o.</p><p>Pi&#233;nsalo as&#237;: nadie discute que el pricing o la competencia importan. Pero est&#225;s intentando arreglar el techo de una casa cuyos cimientos se est&#225;n desmoronando. Un usuario que nunca alcanz&#243; el valor no te puede dar feedback &#250;til sobre el pricing &#8212;su opini&#243;n est&#225; contaminada por la falta de valor. Un usuario que s&#237; vivi&#243; el aha moment y aun as&#237; se queja del precio es un dato accionable. Lo primero es asegurarte de que el mapa lleva al valor. Solo entonces puedes evaluar si el precio o la competencia son realmente el problema.</p><p><strong>"Mejorar la UX s&#237; funcion&#243;: subimos la activaci&#243;n con tooltips y checklists."</strong></p><p>Las ganancias t&#225;cticas sobre un mapa equivocado <strong>tienden a estancarse</strong>. Mejoraste la legibilidad del mapa, no el mapa en s&#237;. La pregunta no es si la activaci&#243;n subi&#243; esta semana: es si la mejora persiste a los 60 d&#237;as y si ataca el desajuste de fondo.</p><p>Hay un fen&#243;meno bien documentado en los equipos de producto: las mejoras de superficie (tooltips, microcopy, color de botones) producen subidas de activaci&#243;n a corto plazo que se desvanecen al cabo de las semanas. El motivo es que no afectan al destino: solo hacen que sea m&#225;s f&#225;cil caminar hacia un punto que no es el valor. Si la activaci&#243;n sube pero la retenci&#243;n a 60 d&#237;as no se mueve, lo que has hecho es acelerar a los usuarios hacia el mismo lugar equivocado.</p><p><strong>"Mi modelo es h&#237;brido (PLG + Sales-Led). &#191;D&#243;nde queda el mapa?"</strong></p><p>En los h&#237;bridos el riesgo de desajuste es m&#225;ximo. La respuesta es definir <strong>reglas expl&#237;citas</strong>: &#191;en qu&#233; punto toma el relevo la intervenci&#243;n humana? &#191;Qu&#233; condiciones marcan el paso de auto-servicio a Sales-Led? Y validar esas reglas con comportamiento de los primeros d&#237;as &#8212; no con churn. El churn te lo dir&#225; demasiado tarde.</p><p>El modelo h&#237;brido es leg&#237;timo &#8212;muchos SaaS B2B lo usan con &#233;xito&#8212; pero exige una coreograf&#237;a m&#225;s precisa que los otros dos. Necesitas responder a preguntas como: &#191;qu&#233; evento de bajo valor en auto-servicio activa el trigger para una llamada comercial? &#191;Qu&#233; umbral de usage score convierte a un usuario en candidate para un sales rep? Cada respuesta implica un punto concreto del onboarding donde el mapa cambia de mano. Si esas reglas no est&#225;n escritas, el h&#237;brido se convierte en una tierra de nadie donde el usuario no sabe si le van a vender o a acompa&#241;ar.</p><p>---</p><h2><strong>La Lecci&#243;n: El Mapa es la Estrategia, no la UX</strong></h2><p>El onboarding es el punto donde la estrategia se convierte en experiencia. Si tu modelo de crecimiento es PLG, tu onboarding debe regalar el valor antes de pedir nada. Si es Sales-Led, debe usar los humanos como feature. Y si tienes segmentos distintos, debes dibujar mapas distintos.</p><p>F&#237;jate en la asimetr&#237;a que esto revela: el equipo de producto tiende a tratar el onboarding como un problema de dise&#241;o, cuando en realidad es un problema de estrategia con consecuencias de dise&#241;o. El dise&#241;o (tooltips, checklists, tours) es la capa de presentaci&#243;n del mapa. Pero el mapa en s&#237; &#8212;d&#243;nde empieza, d&#243;nde lleva, qu&#233; desv&#237;os elimina y cu&#225;les permite&#8212; es una decisi&#243;n de negocio. Confundir ambas capas es el error que asegura que seguir&#225;s puliendo la presentaci&#243;n de un mapa equivocado.</p><p>El churn es una se&#241;al de confirmaci&#243;n, no de diagn&#243;stico. <strong>El diagn&#243;stico est&#225; en el comportamiento de los primeros 7 d&#237;as.</strong> Deja de pulir tooltips sobre un mapa que apunta al destino equivocado &#8212; redes&#233;&#241;alo primero.</p><p>Para cerrar, cuatro comprobaciones que puedes hacer ma&#241;ana mismo:</p><p>1. <strong>&#191;Tienes definido el evento de activaci&#243;n por segmento, o un &#250;nico evento global?</strong> Si es lo segundo, empieza por ah&#237;.</p><p>2. <strong>&#191;Sabes qu&#233; porcentaje de tu &#250;ltima cohorte complet&#243; el setup pero nunca ejecut&#243; la acci&#243;n core?</strong> Si la respuesta es "no lo s&#233;", tienes tu primera tarea de auditor&#237;a.</p><p>3. <strong>&#191;Puedes escribir en una frase tu regla de modelo de crecimiento?</strong> Si necesitas m&#225;s de una frase o te contradices, el desajuste estrat&#233;gico ya est&#225; operando en tu d&#237;a 1.</p><p>4. <strong>&#191;Tu &#250;ltima mejora de onboarding cambi&#243; la legibilidad del mapa o el mapa en s&#237;?</strong> Si fue lo primero, no esperes que la retenci&#243;n se mueva.</p><p>La cifra del 73% viene citada en la industria sin una fuente primaria unificada. Atrib&#250;ela con cautela. Pero no necesitas la estad&#237;stica para ver la l&#243;gica: construye el mapa correcto, alinea el day-1 con tu modelo de crecimiento y tu segmento, y el churn dejar&#225; de ser un misterio imposible de diagnosticar.</p><p><strong>El time-to-value no se optimiza. Se dise&#241;a.</strong> Y el dise&#241;o empieza antes del primer login &#8212; empieza en la estrategia.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/onboarding-optimization-mapas-estrategicos-saas-20260830?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Planning y Reasoning en AI Agents 2026: Tu Agente no Falla por Tonto. Falla porque Razona en Una Sola Pasada]]></title><description><![CDATA[Los AI agents no fallan por ser "tontos": fallan porque razonan en una sola pasada sin verificaci&#243;n. Descubre el bucle deliberativo plan&#8594;ejecuta&#8594;verifica&#8594;revisa y c&#243;mo construirlo hoy.]]></description><link>https://newsletter.brianmenagomez.com/p/planning-y-reasoning-en-ai-agents-7ca</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/planning-y-reasoning-en-ai-agents-7ca</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Sat, 29 Aug 2026 07:00:18 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1956c9bd-3379-45ee-b1c7-920b6160c7a9_1080x600.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 95% de los Fallos de Planificaci&#243;n en AI Agents No Son Culpa del Modelo</strong></h2><p>Tu agente no falla porque el modelo sea tonto. Falla porque razona en una sola pasada y sin nadie que le revise el trabajo.</p><p>La gente te dice dos cosas. Primera: <em>"el modelo no es suficientemente inteligente, esperemos al siguiente m&#225;s grande"</em>. Segunda: <em>"chain-of-thought YA es razonamiento"</em>.</p><p>Ambas son falsas.</p><p><strong>*Una traza de chain-of-thought es un mon&#243;logo interno.* Un mon&#243;logo es serial y auto-confirmatorio: no puede detectar su propia contradicci&#243;n porque nunca confronta su plan con el mundo.</strong></p><p>El razonamiento en un agente no es generar texto. Es un bucle que confronta un plan con resultados reales de tools, invariantes y restricciones &#8212; y se corrige. Ese bucle deliberativo es lo que separa un agente que planifica de uno que alucina. Y no necesitas un modelo m&#225;s grande para construirlo: necesitas arquitectura.</p><p>Aqu&#237; est&#225; el dato inc&#243;modo, dicho con transparencia: en producci&#243;n, he observado que la mayor&#237;a de fallos de planificaci&#243;n vienen de una arquitectura de prompting pobre &#8212; concretamente, la ausencia de bucles deliberativos con verificaci&#243;n &#8212; no de los l&#237;mites de capacidad del modelo. Lo llamo observaci&#243;n de producci&#243;n, no estad&#237;stica publicada, porque no hay un estudio revisado por pares detr&#225;s. Pero los mecanismos que lo explican s&#237; se miden: la tasa de divergencias plan-vs-resultado, el n&#250;mero de retries sin verificaci&#243;n, el coste de fallar tarde.</p><p>Y hay otro dato que s&#237; pod&#233;is comprobar: el 90% de los sistemas <em>"multi-agente"</em> en producci&#243;n son un &#250;nico LLM instanciado varias veces con prompts distintos. Sin jerarqu&#237;a. Sin contratos de datos. Sin validaci&#243;n cruzada. Es un modelo en gabardina disfrazado de equipo.</p><p>Cuando alguien os diga que <em>"el agente A supera al agente B"</em>, a menudo est&#225;is comparando variantes de prompt del mismo modelo. La <em>capacidad</em> percibida es arquitectura de prompting.</p><h2><strong>Por Qu&#233; el 95% No Es una Exageraci&#243;n (Y Qu&#233; es Honestamente una Hip&#243;tesis)</strong></h2><p>Vamos a ser claros sobre qu&#233; es qu&#233;.</p><p>El 95% es una hip&#243;tesis de trabajo basada en a&#241;os de construir agents en producci&#243;n, no un dato revisado por pares. Tratadla como tal. Pero el mecanismo detr&#225;s s&#237; es verificable, y os lo demuestro con c&#243;digo en un momento.</p><p>El 90% de los sistemas multi-agente sin contratos de datos ya sab&#233;is que es cierto porque lo veis en vuestras propias codebases: llam&#225;is al mismo modelo con tres system prompts distintos y lo llam&#225;is <em>"arquitectura multi-agente"</em>. Cuando los agentes no comparten un schema validado, el agente B recibe la salida del agente A sin verificar. Es el mismo modelo cometiendo los mismos errores en paralelo. Escalar eso no mejora nada: multiplica el ruido.</p><p>La implicaci&#243;n pr&#225;ctica es contraintuitiva y molesta para la industria: <strong>pod&#233;is mejorar agentes de planificaci&#243;n hoy mismo con los modelos actuales a&#241;adiendo bucles de verificaci&#243;n.</strong> No necesit&#225;is esperar al LLM m&#225;s grande.</p><h2><strong>El Enfoque Que Falla: La Pasada &#218;nica Auto-Confirmatoria</strong></h2><p>Empecemos con el &#10060; enfoque que casi todos us&#225;is. Un &#250;nico prompt que genera plan y ejecuta tools en el mismo turno:</p><p>```python</p><h1>&#10060; Single-pass: plan + ejecuci&#243;n en el mismo prompt, sin artefacto intermedio</h1><p>def naive_agent(query: str):</p><p>prompt = f"""</p><p>Objetivo ambiguo: {query}</p><p>1. Genera un plan paso a paso.</p><p>2. Ejecuta las tools necesarias.</p><p>3. Devuelve el resultado final.</p><p>Piensa en voz alta (chain-of-thought).</p><p>"""</p><h1>El LLM genera plan Y ejecuta en el mismo turno</h1><p>return llm(prompt, tools=TOOLS)</p><p>```</p><p>&#191;Qu&#233; pasa aqu&#237;? El modelo genera una traza lineal. En el paso 2, <em>predice</em> que la tool va a devolver `{"status": "ok", "rows": 42}`. Ejecuta la tool real y devuelve `{"error": "timeout", "rows": 0}`. &#191;Y qu&#233; hace el agente? Nada. No lo detecta, porque la verificaci&#243;n nunca ocurri&#243;.</p><p>&#191;Por qu&#233;? Porque <strong>CoT de una pasada NO es un bucle deliberativo.</strong> Es una traza lineal que se auto-confirma. La traza nunca confronta su plan con el resultado real de la tool. Ese es el fallo t&#237;pico, y es reproducible con cualquier modelo actual.</p><h2><strong>El Bucle ReAct Manual: Razonamiento Como Confrontaci&#243;n, No Como Traza</strong></h2><p>Ahora el &#9989; enfoque. Un bucle ReAct manual, sin framework, con condici&#243;n de parada expl&#237;cita y comparaci&#243;n lado a lado contra la versi&#243;n single-pass:</p><p>```python</p><h1>&#9989; Deliberative loop: plan &#8594; ejecuta &#8594; observa &#8594; verifica &#8594; decide</h1><p>def deliberative_agent(query: str, max_iterations: int = 5):</p><p>plan = generate_plan(query)          # Fase 1: plan separado</p><p>validate_plan_schema(plan)           # Fase 2: contrato de datos</p><p>for i in range(max_iterations):</p><p>result = execute_step(plan[i])   # Fase 3: ejecutar</p><h1>Fase 4: verificaci&#243;n &#8212; el cr&#237;tico</h1><p>verification = verify_step(</p><p>plan=plan[i],</p><p>expected=plan[i]["expected"],</p><p>actual=result</p><p>)</p><p>if verification.passes:          # Fase 5: condici&#243;n de parada verificable</p><p>continue</p><h1>Reflexi&#243;n: revisa el plan, no improvises</h1><p>plan[i:] = revise_plan(</p><p>plan=plan[i:],</p><p>evidence=verification.failure_reason,</p><p>constraints=CONSTRAINTS</p><p>)</p><p>return plan</p><p>```</p><p>Mirad el log de ambos y ver&#233;is d&#243;nde diverge la traza lineal del bucle deliberativo:</p><p>```</p><p>[NAIVE]   Paso 2: "La tool devuelve 42 rows" &#8594; tool devuelve 0 rows &#8594; agente no lo detecta</p><p>[NAIVE]   Resultado final: 42 rows (inventados)</p><p>[LOOP]    Paso 2: "La tool devuelve 42 rows" &#8594; tool devuelve 0 rows &#8594; VERIFICACI&#211;N FALLA</p><p>[LOOP]    Cr&#237;tico: timeout detectado. Revisando plan...</p><p>[LOOP]    Paso 2 revisado: retry con backoff &#8594; 42 rows reales</p><p>[LOOP]    Resultado final: 42 rows (verificados)</p><p>```</p><p>El loop no es un gasto de tokens. <strong>Es la funci&#243;n de evaluaci&#243;n que la pasada &#250;nica no tiene.</strong> El razonamiento vive en la verificaci&#243;n: generar sin discriminar es solo muestreo.</p><h2><strong>T&#233;cnicas Que ya Comprueban Esto (Si las Us&#225;is Como Bucles, No Como Prompts)</strong></h2><p>Esto no es teor&#237;a. Reflexion, Self-Refine y self-consistency comparten exactamente el mismo patr&#243;n: a&#241;adir un discriminador al generador. El problema es que casi todo el mundo los implementa como <em>"prompt de turno extra"</em> en lugar de <em>"punto de control con verificaci&#243;n"</em>.</p><ul><li><p><strong>Reflexion</strong>: el modelo recibe retroalimentaci&#243;n verbal sobre su intento fallido antes del siguiente. Eso es un discriminador habl&#225;ndole al generador.</p></li><li><p><strong>Self-Refine</strong>: el modelo produce, luego *cr&#237;tica su propia salida<em> contra criterios, luego corrige. Cr&#237;ticar no es opcional</em>*: es el paso donde el razonamiento ocurre.</p></li><li><p><strong>Self-consistency</strong>: muestre&#225;is varias trazas y vot&#225;is. Cada traza es un candidato de descomposici&#243;n; la votaci&#243;n es la selecci&#243;n contra restricciones.</p></li></ul><p>La descomposici&#243;n de un objetivo ambiguo en un plan concreto no es un problema de generaci&#243;n: es un <strong>problema de b&#250;squeda</strong>. El agente debe generar candidatos de descomposici&#243;n y seleccionarlos contra restricciones. Una pasada &#250;nica no puede hacerlo porque se compromete con la primera descomposici&#243;n que genera.</p><h2><strong>El Bucle Deliberativo de 5 Fases para Planning de AI Agents</strong></h2><p>Aqu&#237; est&#225; el framework. Lo llamo <strong>El Bucle Deliberativo de 5 Fases</strong>, y es lo que he enviado a producci&#243;n en projects reales &#8212; desde herramientas para aut&#243;nomos espa&#241;oles hasta sistemas para asesor&#237;as y gestor&#237;as.</p><p><strong>Fase 1 &#8212; Genera el plan como artefacto, no como texto de relleno.</strong></p><p>Genera primero un plan expl&#237;cito, validado contra un JSON Schema. Ejecuta <em>despu&#233;s</em>. Nunca generes plan y ejecutes en el mismo prompt: sin artefacto intermedio no hay nada que verificar.</p><p>```python</p><p>from pydantic import BaseModel, Field, ValidationError</p><p>class PlanStep(BaseModel):</p><p>action: str</p><p>tool: str</p><p>params: dict = Field(...)</p><p>expected: dict          # &#8592; lo que el plan PROMETE que pasar&#225;</p><p>invariants: list[str]   # &#8592; restricciones del mundo (rangos, formatos)</p><p>class Plan(BaseModel):</p><p>steps: list[PlanStep]</p><p>goal: str</p><p>def validate_plan_schema(plan: dict) -&gt; Plan:</p><p>try:</p><p>return Plan.model_validate(plan)</p><p>except ValidationError as e:</p><p>raise PlanValidationError(e)  # &#8592; el agente NUNCA sigue un plan inv&#225;lido</p><p>```</p><p><strong>Fase 2 &#8212; Contratos de datos entre cada paso.</strong></p><p>Ning&#250;n paso recibe salida no validada. Esto es la validaci&#243;n cruzada que el 90% de los sistemas multi-agente no tienen. Si el agente B recibe la salida cruda del agente A, est&#225;is corriendo el mismo modelo con los mismos errores en paralelo.</p><p><strong>Fase 3 &#8212; Ejecuta una acci&#243;n, una tool call, aislada.</strong></p><p>Un paso, un resultado observable.</p><p><strong>Fase 4 &#8212; Un cr&#237;tico verifica contra el plan y las restricciones.</strong></p><p>Puede ser el mismo modelo con rol distinto, un modelo m&#225;s barato, o validadores deterministas (Pydantic contra invariantes del mundo: formato, rangos, referencias cruzadas). <em>"El hilo piensa en voz alta, pero con alguien que revise."</em></p><p><strong>Fase 5 &#8212; Condici&#243;n de parada VERIFICABLE, no presupuesto de tokens.</strong></p><p>Repite plan &#8594; ejecuta &#8594; verifica &#8594; revisa <strong>hasta que el verificador pase</strong>, no hasta agotar tokens. Si no hay criterio de parada verificable, no es un bucle deliberativo: es un gasto de tokens en bucle.</p><h2><strong>El Presupuesto de Inferencia ES el Dise&#241;o</strong></h2><p>Ahora la objeci&#243;n que est&#225;is pensando: <em>"los bucles de reflexi&#243;n duplican tokens y latencia; inviables en producci&#243;n."</em></p><p>Respuesta: la verificaci&#243;n no tiene que ser cara.</p><ul><li><p>Un modelo peque&#241;o como verificador en puntos cr&#237;ticos del plan.</p></li><li><p>Validadores deterministas con Pydantic para invariantes mec&#225;nicas.</p></li><li><p>Verificaci&#243;n solo en los pasos de riesgo, no en todos.</p></li></ul><p>Y lo m&#225;s importante: el coste de retry <strong>sin verificaci&#243;n</strong> suele superar al del verificador. Fallar tarde &#8212; despu&#233;s de ejecutar acciones sobre un plan err&#243;neo &#8212; es mucho m&#225;s caro que un modelo barato que detecta la divergencia antes de continuar. Es medible con tracing (LangSmith o Weave sirven) logueando divergencias plan-vs-resultado y la tasa de revisiones que el loop necesita.</p><p>El dinero gastado en modelos m&#225;s grandes est&#225; mal asignado si el bucle de verificaci&#243;n no existe. <strong>Un modelo barato con un verificador puede superar a un modelo grande en single-pass.</strong> Es un patr&#243;n observado en producci&#243;n, no un benchmark publicado &#8212; pero pod&#233;is medirlo en vuestro propio sistema esta semana.</p><h2><strong>Qu&#233; Hacer Ahora: El Diagn&#243;stico que Te Dice D&#243;nde Invertir</strong></h2><p>Instrumenta y mide. Loguea divergencias plan-vs-resultado y la tasa de revisiones que el bucle necesita. Aqu&#237; est&#225; la regla de oro:</p><p><strong>Si el bucle no mejora la tasa de &#233;xito, el problema no es el planificador &#8212; es el verificador.</strong></p><p>Ese diagn&#243;stico os dice exactamente d&#243;nde gastar el presupuesto de inferencia. &#191;Divergencias altas y el cr&#237;tico no las detecta? Mejorad el cr&#237;tico (constrained, mejor prompt, determinista). &#191;El cr&#237;tico detecta pero el planificador no corrige bien? Mejorad la revisi&#243;n. &#191;Ninguna divergencia? Ten&#233;is un agente trivial que no necesitaba el bucle.</p><p>Herramientas concretas: <strong>LangGraph</strong> para grafos con checkpoints y loops (el checkpoint es lo que hace el estado expl&#237;cito entre pasos), <strong>Pydantic</strong> para contratos de datos, y <strong>LangSmith/Weave</strong> para tracing de divergencias.</p><h2><strong>La Verdad Incomoda: CoT Es el Material en Bruto, No el Razonamiento</strong></h2><p>Decidme si esto os suena: <em>"prob&#233; chain-of-thought y mi agente sigue fallando; el modelo no es lo bastante inteligente."</em></p><p>No. El problema es que tratasteis CoT como si fuera el razonamiento completo. CoT es el material en bruto del razonamiento. El razonamiento es el bucle.</p><p>Una traza de chain-of-thought muestra el mon&#243;logo interno del modelo. Pero un mon&#243;logo es serial: nunca confronta el plan con el mundo porque nadie se lo pide. El bucle deliberativo fuerza esa confrontaci&#243;n con resultados reales de tools. <strong>Esa confrontaci&#243;n es lo que en los agents merece llamarse razonamiento.</strong></p><p>La pr&#243;xima vez que vuestro agente falle, no mir&#233;is el modelo. Mirad el bucle. Si no hay verificaci&#243;n, no hay razonamiento &#8212; solo texto generado con confianza.</p><p>El patr&#243;n est&#225; claro: el agente que planifica de verdad no es el que produce el mejor mon&#243;logo. Es el que se corrige cuando su plan choca con la realidad. Empezad por ah&#237;, con los modelos que ya ten&#233;is, y dejad de esperar al LLM que os va a salvar del mal prompting.</p><p><strong>No vais a llegar al primer mill&#243;n esperando a que el siguiente modelo razone por vosotros. Vais a llegar construyendo el bucle que verifica lo que ya gener&#225;is hoy.</strong></p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/planning-reasoning-ai-agents-bucle-deliberativo-20260829?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El 73% de los SaaS No Fracasa por Tener Churn Alto: Fracasa por Medir los Síntomas en Vez de la Causa]]></title><description><![CDATA[El 73% de los SaaS fracasan por rigidez de modelo de crecimiento, no por churn alto. Aprende a diagnosticar la causa ra&#237;z con cohortes por motion, exit surveys y patrones de uso.]]></description><link>https://newsletter.brianmenagomez.com/p/el-73-de-los-saas-no-fracasa-por-fad</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-73-de-los-saas-no-fracasa-por-fad</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Sat, 29 Aug 2026 07:00:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/34f22dd9-d1a2-4df4-8b8b-dfd8f5e27c60_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 73% de los SaaS No Fracasa por Tener Churn Alto: Fracasa por Creer que su Modelo de Crecimiento Es para Siempre</strong></h2><p>Crees que tu problema es el churn. Que sube en el dashboard, que el logo churn es un pozo, que necesitas mejores flujos de activaci&#243;n, mejor NPS y mejor soporte. Que si arreglas el onboarding, el segmento se queda.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>El churn no es la enfermedad. Es el s&#237;ntoma tard&#237;o. Y el 73% de los SaaS no fracasa por tener churn alto: <strong>fracasa por tratar su modelo de crecimiento como una decisi&#243;n permanente</strong>, cas&#225;ndose con PLG o con Sales-Led y neg&#225;ndose a adaptarlo cuando deja de encajar con sus segmentos de cliente. El dato no habla de tasas de churn. Habla de <strong>rigidez estrat&#233;gica</strong>.</p><p>Y por eso tus dashboards de churn, tus cohortes por fecha de alta y tus exit surveys gen&#233;ricas llevan meses <strong>apuntando al producto cuando el verdadero culpable es el desajuste entre c&#243;mo vendes y a qui&#233;n le vendes</strong>.</p><p>&#128269; <strong>C&#243;mo descubro el desajuste que nadie mide</strong>: en mis productos (conversoriaecnae.es, gestoriascercademi.com, findemergencyplumber.com) el patr&#243;n se repite: el churn que parece de producto casi siempre es de motion. Un cliente que compr&#243; por autoservicio pero necesitaba onboarding guiado no falla por tu feature set. Falla porque <strong>el modelo con el que lo adquiriste no encaja con su segmento</strong>.</p><p>---</p><p>Pongamos un ejemplo concreto para que esta idea no quede en el aire. Piensa en un SaaS de gesti&#243;n documental para despachos de abogados. Lanzas un plan self-serve de 29 &#8364; al mes y lo apuntas a peque&#241;as firmas independientes. Todo parece razonable: el precio es bajo, la configuraci&#243;n es trivial, puedes activarlo en una tarde. Tres meses despu&#233;s, el churn de ese segmento ronda el 8% mensual. Tu primera reacci&#243;n es mirar el onboarding: "quiz&#225; los flujos de bienvenida no empujan suficiente valor". Redise&#241;as el onboarding, lanzas un email sequence nuevo, mejoras el empty state. El churn no se mueve ni un punto.</p><p>Lo que no has mirado es el <em>motion</em>: &#191;ese abogado independiente que pag&#243; 29 &#8364; esperaba realmente configurarlo solo? &#191;O le prometi&#243; tu p&#225;gina de ventas una "implementaci&#243;n asistida sin coste" mientras por el otro lado empujabas el autoservicio? Cuando segmentas esa cohorte por el canal que la trajo &#8212; no por el mes de alta &#8212; descubres que el 9% de la fuga viene de cuentas que llegaron por un webinar de venta consultiva. Compraban con la expectativa de una mano guiada. Recibieron un producto que les ped&#237;a "explorar por su cuenta". <strong>Ese cliente no fall&#243; por tu producto: fall&#243; por el contrato t&#225;cito roto entre c&#243;mo lo vendiste y c&#243;mo lo entregaste.</strong></p><h3><strong>Por Qu&#233; Esto se Confunde Tan F&#225;cilmente con un Problema de Producto</strong></h3><p>La raz&#243;n por la que el desajuste de motion se disfraza de problema de producto es sutil. Cuando un cliente no se activa, tu telemetr&#237;a de uso muestra exactamente lo mismo que mostrar&#237;a con un onboarding deficiente: pocos logins, funciones clave sin tocar, breve tiempo de sesi&#243;n. Desde fuera, los datos sangu&#237;neos del producto son id&#233;nticos. Solo cuando cruzas esa telemetr&#237;a con la variable <em>motion</em> aparecen dos realidades distintas conviviendo bajo la misma curva de uso.</p><p>Ese es el core del problema que aborda este art&#237;culo: <strong>tu dashboard te dice d&#243;nde duele, pero no qu&#233; lo causa</strong>. Para saberlo necesitas a&#241;adir una dimensi&#243;n que casi ning&#250;n dashboard SaaS est&#225;ndar contempla: el movimiento de mercado con el que adquiriste a cada cohorte.</p><p>---</p><h2><strong>Por Qu&#233; los Dashboards de Churn Mienten</strong></h2><p>El churn promedio es una mentira estad&#237;stica. Puro sesgo de agregaci&#243;n.</p><p>Si un segmento churnea al doble que otro, promediar ambos en una sola m&#233;trica <strong>hace desaparecer el indicador adelantado en el ruido</strong>. El equipo mira el n&#250;mero global, ve que "est&#225; estable", y sigue optimizando onboarding para siempre mientras un segmento entero se fuga en silencio.</p><p>&#10060; <strong>El enfoque convencional</strong>: dashboards con churn mensual agregado, cohortes por mes de alta, exit surveys con "&#191;por qu&#233; te fuiste?" y opciones (precio, competencia, falta de uso).</p><p>&#9989; <strong>El enfoque que funciona</strong>: cohortes segmentadas por <strong>motion de adquisici&#243;n</strong>, no solo por fecha. Compara por separado la retenci&#243;n de tus cohortes self-serve (PLG) contra tus cohortes sales-assisted.</p><p>Si una cohorte churnea al doble que la otra, <strong>el problema es de modelo, no de producto</strong>. Y eso cambia absolutamente todo el plan de acci&#243;n.</p><h3><strong>El Sesgo Que Esconde la Causa Real</strong></h3><p>Pi&#233;nsalo conmigo. Adquieres un cliente enterprise con un ciclo de venta largo de tres meses. Lo cierras, entra en tu dashboard. Al mes siguiente, su activaci&#243;n est&#225; por los suelos. &#191;Qu&#233; dice el dashboard? "Problema de onboarding."</p><p>Qu&#233; dice la realidad: <strong>adquiriste a un cliente enterprise con un motion self-serve</strong>. Espera autoservicio, clicks y self-onboarding. Pero el sales-assisted que lo cerr&#243; le prometi&#243; onboarding guiado, &#233;xito dedicado y migraci&#243;n asistida. Ese cliente no necesita mejor onboarding: necesita el motion con el que lo vendiste.</p><p>Un SMB forzado por un ciclo de venta largo es el mismo desajuste al rev&#233;s. Compra un SaaS barato que esperaba configurar en una tarde y de repente tiene proceso de compra con demostraciones y vendor manager. <strong>Churn inevitable.</strong></p><p>Ninguna de esas fugas es producto. Las dos son <strong>motion mismatch</strong>.</p><h3><strong>El Precio de Seguir Solo la M&#233;dia Agregada</strong></h3><p>El sesgo de agregaci&#243;n no solo oculta el problema: lo retroalimenta. Cuando promedias el churn de un segmento self-serve sano con uno sales-assisted enfermo, obtienes un n&#250;mero "aceptable". Ese n&#250;mero te da permiso para no actuar, o peor, para actuar en la direcci&#243;n equivocada. Optimizas el onboarding que ya funcionaba en la cohorte sana, ignoras al segmento en fuga y, mientras tanto, sigues adquiriendo clientes con el motion equivocado para su perfil. Seis meses despu&#233;s, el segmento enfermo es el doble de grande y la fuga silenciosa se convierte en una hemorragia imposible de ignorar.</p><p>El churn promedio no es solo in&#250;til: <strong>es activamente da&#241;ino</strong>, porque convierte tu principal sistema de alerta temprana en un tranquilizante estad&#237;stico.</p><p>---</p><h2><strong>El Framework: El Protocolo de Motion Mismatch</strong></h2><p>El <strong>Protocolo de Motion Mismatch (PMM)</strong> es el m&#233;todo para diagnosticar el churn por su causa ra&#237;z real. Cuatro pasos medibles, no filosof&#237;a.</p><p>Antes de entrar en los pasos, una aclaraci&#243;n importante sobre el esp&#237;ritu del m&#233;todo. El PMM no pretende sustituir a tu an&#225;lisis de producto ni a tus procesos de customer success. Lo que hace es <strong>a&#241;adir una capa de diagn&#243;stico que hoy no existe</strong>: separar el fracaso de producto del fracaso de motion. Sin esa separaci&#243;n, cualquier inversi&#243;n en el producto (onboarding, features, soporte) puede estar bien ejecutada y, sin embargo, ser completamente in&#250;til, porque est&#225; tratando el s&#237;ntoma equivocado.</p><h3>Paso 1: Segmenta por Motion, No por Fecha</h3><p>Deja de agrupar cohortes por mes de alta. Segmenta por canales de adquisici&#243;n su movimiento de mercado: PLG/directo vs. sales-led.</p><p>En tu tabla de retenci&#243;n, compara el churn de la cohorte que compr&#243; self-serve contra la que vino por ciclo de venta. Traza ambas curvas. Si divergen m&#225;s de un 20-30% al tercer mes, <strong>tienes un mismatch de motion</strong>. El producto no es el culpable.</p><p><strong>&#191;C&#243;mo implementarlo en la pr&#225;ctica?</strong> Necesitas una columna `acquisition_motion` en tu base de datos de clientes. No es dif&#237;cil de rellenar retrospectivamente: la mayor&#237;a de CRM y herramientas de atribuci&#243;n distinguen entre tr&#225;fico org&#225;nico directo (self-serve), ciclo de venta con demo (sales-assisted) y canales intermedios (partnerships, marketplaces, recomendaciones). Si no la tienes, asigna la etiqueta por el canal con mayor peso en la atribuci&#243;n del cierre.</p><p>A partir de ah&#237;, tu tabla de retenci&#243;n deber&#237;a tener tres dimensiones: <strong>cohort (por fecha), motion (por canal) y retenci&#243;n</strong>. Al cruzar estas tres variables aparecen patrones que la vista agregada jam&#225;s revela. Por ejemplo, una curva de retenci&#243;n self-serve que se mantiene estable al 90% a los seis meses, mientras la sales-assisted cae al 60%. Si solo mirabas la media, ve&#237;as un 75% "asumible". Ahora ves un segmento entero en descomposici&#243;n.</p><h3>Paso 2: Redise&#241;a la Exit Survey para Aislar la Capa Que Fall&#243;</h3><p>La mayor&#237;a pregunta "&#191;por qu&#233; te vas?" y obtiene respuestas gen&#233;ricas: precio, competidor, "ya no lo uso". Puro ruido.</p><p>Redise&#241;ala con dos preguntas que jam&#225;s ver&#225;s en una encuesta de satisfacci&#243;n de producto:</p><ul><li><p><strong>"&#191;C&#243;mo compraste?"</strong> (autoservicio, demo guiada, recomendaci&#243;n)</p></li><li><p><strong>"&#191;Qu&#233; esperabas al comprar?"</strong> (configurarlo solo, onboarding asistido, migraci&#243;n incluida)</p></li></ul><p>Un cliente que eligi&#243; self-serve pero necesitaba gu&#237;a es <strong>fallo de motion que jam&#225;s aparecer&#225;</strong> si solo preguntas por satisfacci&#243;n. La exit survey deja de ser autopsia y se convierte en triaje.</p><p><strong>Dise&#241;o de la encuesta: menos es m&#225;s.</strong> No hagas diez preguntas. Dos preguntas de clasificaci&#243;n + una opcional de texto libre es suficiente para el diagn&#243;stico temprano. El objetivo no es entender cada matiz de la insatisfacci&#243;n del cliente; es clasificar r&#225;pidamente la fuga en una de dos categor&#237;as: *"consume como esperaba pero no encuentra valor durable"<em> (fallo de producto/propuesta) o </em>"no consume como esperaba porque el journey de compra prometi&#243; otra cosa"* (fallo de motion).</p><p>La primera categor&#237;a te lleva al roadmap de producto. La segunda te lleva a revisar messaging, packaging y proceso de venta. <strong>Son caminos de acci&#243;n tan distintos que no puedes permitirte mezclarlos.</strong></p><h3>Paso 3: Monitoriza el Uso como Indicador Adelantado</h3><p>El churn es una m&#233;trica <strong>lagging</strong>: aparece cuando ya es tarde. La tasa de activaci&#243;n y el time-to-value por segmento son <strong>leading</strong>: avisan antes.</p><p>Mide el umbral de activaci&#243;n que hist&#243;ricamente predice retenci&#243;n, y el comportamiento de power user, <strong>por segmento</strong>. Cuando la activaci&#243;n de un segmento se estanca por debajo de ese umbral durante dos trimestres, esa es la se&#241;al m&#225;s temprana de mismatch de motion &#8212; mucho antes de que el churn aparezca en el dashboard.</p><p><strong>&#191;Qu&#233; m&#233;tricas concretas mirar?</strong> Tres, en orden de prioridad:</p><p>1. <strong>Tasa de activaci&#243;n definida</strong>: el porcentaje de cuentas nuevas que alcanzan tu "aha moment" en los primeros 14 d&#237;as. Def&#237;nelo por funci&#243;n clave, no por login.</p><p>2. <strong>Time-to-value</strong>: d&#237;as desde el alta hasta el primer resultado entregado (primera automatizaci&#243;n activada, primera factura emitida, primer reporte generado).</p><p>3. <strong>Ratio de power users</strong>: porcentaje de cuentas activas que usan el producto por encima del percentil 80 de uso.</p><p>La combinaci&#243;n de estas tres m&#233;tricas, segmentada por motion, te ofrece un panel de alerta premium a la altura del problema. Si ves un segmento con activaci&#243;n al 20% cuando el umbral hist&#243;rico que predice retenci&#243;n es el 40%, tienes un aviso de mismatch con meses de antelaci&#243;n. No necesitas esperar a que el churn aparezca en el dashboard para saber que algo estructural est&#225; roto.</p><p>Triangula tres fuentes: <strong>exit surveys, telemetr&#237;a de uso pasiva y datos de win/loss</strong>. No dependas de encuestas con muestras peque&#241;as. La telemetr&#237;a no miente.</p><p>Un consejo adicional sobre la triangulaci&#243;n: los datos de win/loss son la pieza que m&#225;s equipos ignoran. Si pierdes deals en la fase final de un ciclo sales-assisted contra competidores que ofrecen "implementaci&#243;n en una semana", est&#225; clara la brecha de expectativas que luego pagar&#225;s como churn. Esa informaci&#243;n existe antes de que el cliente compre; aprender a leerla es aprender a prevenir el mismatch antes de que se materialice.</p><h3>Paso 4: Define el "Model Switch Trigger" Como Protocolo</h3><p>Decide <em>ahora</em>, por escrito, qu&#233; m&#233;trica obliga a reevaluar el motion de forma deliberada. Por ejemplo:</p><p>```</p><p>DISPARADOR: tasa de activaci&#243;n del segmento S por debajo del 35%</p><p>durante dos trimestres consecutivos, con un churn proyectado &gt; 3% mensual.</p><p>ACCI&#211;N: junta de gobernanza trimestral que revisa el motion de ese segmento,</p><p>con data (cohortes por motion) sobre la mesa. Switch puede ser h&#237;brido.</p><p>```</p><p>El switch <strong>no es binario</strong>. Puede ser gradual: un motion h&#237;brido que a&#241;ade onboarding guiado como add-on, un tier de precio con &#233;xito dedicado, un lead magnet que filtra el segmento correcto. No es un volantazo, es un <strong>ajuste de rumbo</strong>.</p><p><strong>La clave del paso 4 es la anticipaci&#243;n.</strong> Si defines el trigger cuando ya est&#225;s en crisis, el miedo a lo desconocido y la presi&#243;n del momento nublan el juicio. Definirlo con calma, con datos sobre la mesa y sin un incendio ardiendo, convierte una decisi&#243;n pol&#237;tica y emocional en un procedimiento operativo est&#225;ndar. La gobernanza por trigger elimina la discusi&#243;n "&#191;es un problema de producto o de ventas?" &#8212; una discusi&#243;n que, en la pr&#225;ctica, casi nunca se resuelve por m&#233;ritos, sino por la influencia pol&#237;tica de los departamentos implicados.</p><p>Para que el proceso funcione, el trigger debe cumplir tres criterios:</p><ul><li><p><strong>Medible sin ambig&#252;edad</strong>: "activaci&#243;n por debajo del 35%" funciona. "El equipo siente que algo va mal" no.</p></li><li><p><strong>Con plazo definido</strong>: un trimestre de datos malos puede ser ruido; dos son una tendencia.</p></li><li><p><strong>Con consecuencias pre-acordadas</strong>: el trigger no solo alerta; dispone una junta de gobernanza con autoridad para cambiar el motion.</p></li></ul><p>---</p><h2><strong>El Silent Downgrade: La Fuga Que Nadie Ve</strong></h2><p>Hay un an&#225;lisis que casi nadie hace: el <strong>silent downgrade</strong>. Separar las cancelaciones reales de las cuentas que bajan de plan o simplemente dejan de expandir.</p><p>La p&#233;rdida silenciosa de expansi&#243;n &#8212; cuentas que se quedan pero no crecen &#8212; suele indicar <strong>mismatch de modelo</strong>: el cliente se queda porque ya pag&#243; el ciclo, pero no encuentra suficiente valor para expandir. La cancelaci&#243;n dura apunta m&#225;s a fallo de producto.</p><p>Dos fugas distintas. Dos diagn&#243;sticos opuestos. <strong>Un solo dashboard de churn las mezcla</strong> y te obliga a adivinar.</p><p><strong>&#191;Por qu&#233; es tan f&#225;cil perder de vista el silent downgrade?</strong> Porque no activa ninguna alerta. El cliente no se va, no abre un ticket, no contesta la exit survey (porque no hay). Simplemente permanece en tu base de ingresos, pagando lo mismo, sin pedir nada. Desde la perspectiva de un dashboard de churn cl&#225;sico, es un cliente sano. Desde la perspectiva del revenue expansion, es una cuenta que se ha apagado emocionalmente y que muy probablemente cancelar&#225; en el pr&#243;ximo ciclo de renovaci&#243;n &#8212; salvo que alguien intervenga antes.</p><p>La se&#241;al m&#225;s temprana del silent downgrade suele ser el comportamiento de uso: sobre todo, la ca&#237;da progresiva de logins activos y la desactivaci&#243;n de funciones clave. Cuando ves ese patr&#243;n en una cuenta que no ha cancelado, tienes delante a un cliente en c&#225;mara lenta. Puedes intervenir con un motion correcto (onboarding asistido, revisi&#243;n trimestral, &#233;xito dedicado) o puedes esperar a que la cancelaci&#243;n llegue al dashboard. <strong>El PMM te da la herramienta para elegir lo primero.</strong></p><p>---</p><h2><strong>Las Objeciones Que Vas a Poner</strong></h2><p>"Cambiar de modelo de crecimiento es demasiado caro."</p><p>Claro que lo es. Pero el framework es <strong>primero un diagn&#243;stico</strong>. Si segmentas por motion y la activaci&#243;n baja de forma uniforme en todas las cohortes, el producto es el culpable &#8212; el framework valida esa conclusi&#243;n si las cohortes est&#225;n segmentadas por motion y no solo por fecha. Si solo falla un motion, <strong>arreglar onboarding es tratar el s&#237;ntoma</strong> mientras el segmento entero se fuga.</p><p>"Las exit surveys est&#225;n sesgadas, solo responden los enfadados."</p><p>Cierto. Por eso el PMM triangula con telemetr&#237;a de uso pasiva y datos de win/loss. En cuentas enterprise con pocos logos, apoyas en an&#225;lisis cualitativo por cuenta y patrones de uso a nivel de account, no en tests estad&#237;sticos de cohortes.</p><p>"Cambiar de motion toca compensaci&#243;n comercial, staffing de onboarding, packaging de precios."</p><p>Exacto. Ese es el motivo exacto por el que las empresas lo evitan: <strong>el switch es pol&#237;tico, no data-driven</strong>. El Protocolo de Motion Mismatch lo convierte en <strong>mecanismo de gobernanza</strong>: la m&#233;trica decide, no el comit&#233;. Dejas de discutir opiniones y discutes datos.</p><h3><strong>La Objeci&#243;n M&#225;s Silenciosa: Ninguna</strong></h3><p>La objeci&#243;n m&#225;s peligrosa a este framework no aparece en las reuniones. Es la de los equipos que escuchan, asienten y luego siguen con su dashboard de churn agregado de toda la vida. No porque no entiendan el argumento, sino porque el cambio requiere reconfigurar pipelines de datos, etiquetar clientes por motion y, sobre todo, aceptar que la m&#233;trica que cre&#237;an entender (churn) no era la m&#233;trica que deb&#237;an vigilar.</p><p>Superar esa inercia no es un problema t&#233;cnico: es un problema de liderazgo. Requiere que alguien con autoridad diga "a partir del pr&#243;ximo trimestre, los cohortes se segmentan por motion en todas las presentaciones de retenci&#243;n". Sin ese momento expl&#237;cito, el framework se queda como una buena lectura de blog y nada m&#225;s.</p><p>---</p><h2><strong>El Churn No Se Arregla. Se Diagnostica.</strong></h2><p>El root-cause analysis solo es &#250;til si el diagn&#243;stico puede cambiar el motion de crecimiento. Si no, cada exit survey confirmar&#225; tu sesgo y cada cohorte confirmar&#225; tu diagn&#243;stico equivocado. Estar&#225;s <strong>analizando cad&#225;veres</strong>: midiendo la salida, nunca la causa.</p><p>Pensemos en la analog&#237;a cl&#237;nica: un m&#233;dico que solo registra la causa de muerte de sus pacientes no est&#225; haciendo medicina preventiva, est&#225; escribiendo historias cl&#237;nicas. De la misma forma, un equipo de producto que solo documenta por qu&#233; se van los clientes &#8212; sin intervenir sobre la causa estructural &#8212; est&#225; redactando autopsias, no construyendo retenci&#243;n.</p><p>La diferencia entre un dashboard de churn y el Protocolo de Motion Mismatch es exactamente esa: uno describe el pasado, el otro anticipa el futuro. Y en el mercado actual, donde el tiempo de respuesta al desajuste estrat&#233;gico es la ventaja competitiva m&#225;s dif&#237;cil de copiar, llegar tarde a ese diagn&#243;stico tiene un coste que ning&#250;n roadmap de producto puede compensar.</p><p>El churn no es tu problema m&#225;s urgente. <strong>Tu rigidez estrat&#233;gica lo es.</strong></p><p>Cuando segmentes por motion, a&#237;sles la capa que fall&#243;, monitorices indicadores adelantados y definas tu model switch trigger como protocolo, dejar&#225;s de preguntarte "&#191;por qu&#233; churnea esta gente?" y empezar&#225;s a preguntar la &#250;nica pregunta que importa: <strong>&#191;estoy vendiendo con el modelo correcto al segmento correcto?</strong></p><p>Y esa pregunta, bien respondida, es la diferencia entre medir m&#233;tricas y <strong>construir un producto que se queda</strong>.</p><h3><strong>Para Llevarte a Casa</strong></h3><ul><li><p>El churn es s&#237;ntoma tard&#237;o, no causa. La rigidez del modelo de crecimiento es la causa.</p></li><li><p>Segmenta cohortes por <strong>motion de adquisici&#243;n</strong>, no solo por fecha.</p></li><li><p>Las exit surveys deben preguntar "&#191;c&#243;mo compraste?" y "&#191;qu&#233; esperabas?".</p></li><li><p>La activaci&#243;n y el time-to-value son m&#233;tricas leading; el churn es lagging.</p></li><li><p>Define tu <strong>model switch trigger</strong> como protocolo escrito, antes de necesitarlo.</p></li><li><p>Separa <strong>silent downgrade</strong> de cancelaci&#243;n dura: son dos diagn&#243;sticos distintos.</p></li></ul><p>El 73% de los SaaS no fracasa por churn alto. Fracasa por no atreverse a cambiar el modelo cuando los datos gritan. Los datos ya est&#225;n en tu dashboard. Solo hay que saber d&#243;nde mirar.</p><p>Y cuando los mires, recuerda una &#250;ltima cosa: el motion con el que empezaste no ten&#237;a por qu&#233; ser el correcto para siempre. Los mercados cambian, los segmentos evolucionan y lo que funcion&#243; para conseguir tus primeros cien clientes puede ser exactamente lo que ahuyente a los siguientes mil. La pregunta no es si tu modelo de crecimiento es bueno: es si sigue siendo el adecuado para el segmento que est&#225;s persiguiendo <em>hoy</em>. Esa es la pregunta que tus dashboards deber&#237;an estar respondiendo &#8212; y la que casi ning&#250;n dashboard est&#225;ndar responde.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/churn-analysis-causa-raiz-saas-cohortes-exit-surveys-20260829?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Multi-Agent Coordination 2026: El 90% de los Sistemas "Multi-Agente" Son el Mismo LLM con Prompts Distintos — y Funciona Peor]]></title><description><![CDATA[Multi-Agent Coordination 2026: el 90% de los sistemas multi-agente son el mismo LLM con prompts distintos. Framework para saber si los tuyos funcionan.]]></description><link>https://newsletter.brianmenagomez.com/p/multi-agent-coordination-2026-el-e97</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/multi-agent-coordination-2026-el-e97</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Fri, 28 Aug 2026 07:00:18 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/18292705-1f94-4d76-b618-a6e68403d93a_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 90% de los Sistemas "Multi-Agente" en Producci&#243;n Son el Mismo LLM con Prompts Distintos</strong></h2><p>Antes de a&#241;adir tu segundo agente, lee esto.</p><p>El 90% de los sistemas "multi-agente" que ves en producci&#243;n no son multi-agente en absoluto. Son un solo LLM instanciado tres veces con prompts distintos. Sin jerarqu&#237;a. Sin contrato de datos compartido. Sin validaci&#243;n cruzada.</p><p><strong>*Y el resultado medible es que 3 agentes mal coordinados funcionan peor que 1 agente bien hecho.</strong> *</p><p>No es una opini&#243;n. Es lo que pasa cuando el acoplamiento entre agentes es fr&#225;gil y cada handoff multiplica errores en lugar de cancelarlos.</p><p>El ecosistema te vende lo contrario. Frameworks, marketplaces y demos empujan la narrativa del "enjambre de agentes": m&#225;s agentes = m&#225;s capacidad. A&#241;ade un agente de investigaci&#243;n, otro de redacci&#243;n, otro de revisi&#243;n, y el resultado deber&#237;a mejorar, &#191;no?</p><p>No. No escala as&#237;. La capacidad no escala con el n&#250;mero de agentes. <strong>Escala el error compuesto</strong> &#8212; y eso va en tu contra.</p><h2><strong>El Problema Real No es el N&#250;mero de Agentes. Es el Acoplamiento Fr&#225;gil</strong></h2><p>La causa ra&#237;z del fallo en sistemas multi-agente no son los agentes. Es el acoplamiento entre ellos.</p><p>Pi&#233;nsalo. En una cadena de N agentes, la salida de cada uno es la entrada del siguiente. Cada handoff es una oportunidad de amplificar una alucinaci&#243;n. Si el agente A produce un formato ligeramente distinto al que el agente B espera, todo se rompe. Si A inventa un dato, B lo toma como verdad y lo embellece, y C lo escribe en la respuesta final.</p><p><strong>Por eso m&#225;s agentes no escalan linealmente.</strong> Cada agente extra a&#241;ade puntos de acoplamiento y rutas de propagaci&#243;n de errores. No es que los agentes sean malos. Es que cada uno multiplica la superficie de fallo.</p><p>Y aqu&#237; viene lo inc&#243;modo: si tu "multi-agente" es el mismo modelo con prompts distintos pasando texto libre entre s&#237;, no tienes N agentes. <strong>Tienes N prompts, N puntos de fallo, y cero capacidad extra.</strong></p><p>El problema es un problema de dise&#241;o de interfaces. Cada subagente debe tratar su entrada y salida como un contrato de API: esquemas tipados, validaci&#243;n, versionado. Si dejas los handoffs como texto libre, est&#225;s definiendo exactamente el acoplamiento fr&#225;gil que mata a estos sistemas.</p><h2><strong>El Test de los 3 Elementos: &#191;Tu Sistema es Real o es Role-Play?</strong></h2><p>Antes de tocar una l&#237;nea de c&#243;digo, audita tu sistema actual contra el test de los 3 elementos. Un sistema multi-agente real tiene los tres:</p><p>1. <strong>Coordinaci&#243;n real</strong>: un planner o state machine que decide qui&#233;n hace qu&#233; y cu&#225;ndo.</p><p>2. <strong>Jerarqu&#237;a</strong>: un orquestador que controla el flujo &#8212; los workers no hablan entre s&#237; directamente.</p><p>3. <strong>Validaci&#243;n cruzada</strong>: un revisor o chequeo determinista que acepta o rechaza la salida de un worker antes de que propague.</p><p>&#10060; <strong>Anti-patr&#243;n (lo que hace el 90%)</strong>: el mismo LLM con prompts distintos. Los agentes se pasan trozos de texto sin schema, sin estado, sin validaci&#243;n. Los errores se compilan a lo largo de la cadena.</p><p>&#9989; <strong>Patr&#243;n real</strong>: un orquestador que planea, despacha con contratos tipados, fusiona resultados, y decide cu&#225;ndo re-ejecutar o rechazar la salida de un worker.</p><p>Si tu sistema no tiene los tres elementos, no tienes agentes. <strong>Tienes role-play con puntos de fallo extra.</strong></p><p>Aqu&#237; tienes el anti-patr&#243;n para que lo reconozcas:</p><p>```python</p><h1>ANTI-PATR&#211;N: el 90% de los "multi-agente" en producci&#243;n</h1><p>def mis_sistema_multiagente(tarea: str) -&gt; str:</p><p>modelo = get_llm()  # el MISMO modelo para todos</p><h1>Agente "investigador" &#8212; solo cambia el system prompt</h1><p>investigacion = modelo.complete(system="Eres un investigador.",</p><p>user=tarea)</p><h1>Agente "redactor" &#8212; recibe texto libre, sin schema</h1><p>borrador = modelo.complete(system="Eres un redactor.",</p><p>user=investigacion)  # acoplamiento fr&#225;gil</p><h1>Agente "revisor" &#8212; valida... contra nada</h1><p>final = modelo.complete(system="Eres un revisor.",</p><p>user=borrador)</p><p>return final</p><h1>3 agentes, 0 jerarqu&#237;a, 0 contrato, 3 sitios para amplificar errores</h1><p>```</p><p>&#191;Ves el problema? Tres calls al mismo modelo. Cero esquemas. Cero validaci&#243;n. Si el "revisor" recibe un formato que no espera, falla silenciosamente. Si el "investigador" alucina, el "redactor" lo embellece y el "revisor" lo aprueba.</p><p><strong>Ese es el acoplamiento fr&#225;gil en su forma pura.</strong></p><h2><strong>&#191;Los Benchmarks Publicados No Muestran que Multi-Agente Gana?</strong></h2><p>S&#237;. Y eso confirma la tesis en lugar de contradecirla.</p><p>Los benchmarks que muestran a sistemas multi-agente ganando a un solo agente vienen de setups meticulosamente orquestados: jerarqu&#237;a, handoffs tipados, validaci&#243;n. Es decir, la coordinaci&#243;n real que los sistemas de producci&#243;n no tienen.</p><p>El benchmark es la prueba. <strong>La calidad del resultado no la determina el n&#250;mero de agentes. La determina la calidad de la orquestaci&#243;n.</strong></p><p>Y si tu equipo pregunta "&#191;diferentes prompts no crean efectivamente agentes distintos?" &#8212; no. La variaci&#243;n de prompts cambia el comportamiento, no la arquitectura. No hay jerarqu&#237;a, no hay contrato de estado compartido, no hay loop de validaci&#243;n. Es un modelo haciendo role-play con puntos de fallo a&#241;adidos.</p><p>La especializaci&#243;n real requiere tres cosas que el role-play no tiene: <strong>herramientas distintas, contexto distinto, e una interfaz expl&#237;cita.</strong></p><h2><strong>El Marco de las 3 Preguntas del Orquestador</strong></h2><p>Cuando el multi-agente gana de verdad, es para subproblemas paralelizables e independientes con un paso de fusi&#243;n &#8212; como investigaci&#243;n en varias fuentes m&#225;s una pasada de revisi&#243;n &#8212; donde un solo agente agotar&#237;a su ventana de contexto.</p><p>Las tareas secuenciales y dependientes son el peor encaje posible: acoplamiento m&#225;ximo, paralelismo cero, y todos los beneficios del patr&#243;n desaparecen.</p><p>Aqu&#237; va el <strong>Marco de las 3 Preguntas del Orquestador</strong>. Antes de a&#241;adir cualquier agente extra, resp&#243;ndelas:</p><p><strong>Pregunta 1 &#8212; &#191;Tengo baseline de un solo agente?</strong></p><p>Construye el agente &#250;nico excelente primero: un modelo, buenas tools, output estructurado. M&#237;dele la tasa de &#233;xito sobre un test set fijo. <strong>Cada afirmaci&#243;n multi-agente de tu sistema debe validarse contra este n&#250;mero.</strong></p><p><strong>Pregunta 2 &#8212; &#191;El subproblema es genuinamente independiente?</strong></p><p>&#191;Puede ejecutarse en paralelo sin depender de la salida del otro? Si la secuencia es estrictamente dependiente, un solo agente con tools hace el trabajo sin los puntos de fallo extra.</p><p><strong>Pregunta 3 &#8212; &#191;Tengo contrato tipado y validaci&#243;n?</strong></p><p>Cada handoff es un schema tipado (Pydantic, JSON Schema, lo que sea). Workers nunca se pasan texto libre. Y un cr&#237;tico &#8212; o chequeos deterministas &#8212; acepta o rechaza contra el plan antes de que propague.</p><p>Este es el patr&#243;n real, con contrato tipado y validaci&#243;n:</p><p>```python</p><p>from pydantic import BaseModel</p><p>from typing import List, Optional</p><p>from enum import Enum</p><p>class Subtarea(BaseModel):</p><p>id: str</p><p>tipo: str                    # "investigacion" | "redaccion"</p><p>instrucciones: str</p><p>estado: str = "pendiente"</p><p>resultado: Optional[str] = None</p><p>validado: bool = False</p><p>class Plan(BaseModel):</p><p>subtareas: List[Subtarea]</p><p>prioridad: List[str]</p><p>merge_rule: str = "concurrente"</p><h1>El orquestador: planea, despacha, fusiona, decide</h1><p>class Orquestador:</p><p>def planificar(self, tarea: str) -&gt; Plan:</p><h1>Un planner DE DETERMINISTA extrae subtareas</h1><h1>No es otro LLM role-play: es l&#243;gica de negocio</h1><p>return self.splitter.extraer_subtareas(tarea)</p><p>def ejecutar(self, plan: Plan) -&gt; dict:</p><p>resultados = {}</p><p>for sub in plan.subtareas:</p><p>worker = self.get_worker(sub.tipo)  # herramienta/esquema propio</p><p>salida = worker.ejecutar(sub.instrucciones, schema=SchemaEsperado)</p><h1>Validaci&#243;n cruzada ANTES de propagar</h1><p>if not self.validador.aprobar(salida, contra=plan):</p><p>salida = worker.reescribir(sub.instrucciones, feedback)</p><p>resultados[sub.id] = salida</p><p>return self.merge(resultados, plan.merge_rule)</p><h1>jerarqu&#237;a (orquestador manda), contrato (schemas), validaci&#243;n (aprobar/rechazar)</h1><p>```</p><p>&#9888;&#65039; <strong>Comparaci&#243;n de tools</strong> (todas v&#225;lidas):</p><ul><li><p><strong>LangGraph</strong>: orquestaci&#243;n basada en grafo con estado expl&#237;cito y edges tipados. El m&#225;s cercano al patr&#243;n jerarqu&#237;a + contrato.</p></li><li><p><strong>CrewAI</strong>: crews por roles con control de proceso integrado. Buen punto de partida si no quieres construir el state machine a mano.</p></li><li><p><strong>AutoGen</strong>: conversacional. M&#225;s f&#225;cil caer en el anti-patr&#243;n de texto libre entre agentes.</p></li><li><p><strong>State machine a mano</strong>: prefieres el control total. El patr&#243;n no depende del framework.</p></li></ul><h2><strong>El Paso M&#225;s Importante: Mide la Regresi&#243;n</strong></h2><p>Aqu&#237; est&#225; la parte que casi nadie hace.</p><p>Construye tu pipeline multi-agente. Ejec&#250;talo sobre el mismo test set fijo que usaste para el baseline de un solo agente. Compara tasas de &#233;xito.</p><p><strong>Si el pipeline multi-agente no supera al baseline, reverte.</strong> Coordinaci&#243;n solo se justifica con ganancia medida.</p><p>Y la predicci&#243;n inc&#243;moda: en muchos casos no la superar&#225;. El multi-agente gana solo cuando hay paralelismo real &#8212; tareas independientes que un solo agente no puede ejecutar sin agotar su ventana de contexto. Investigaci&#243;n multicanal, an&#225;lisis de documentos largos con pasada de revisi&#243;n, generaci&#243;n de contenido con revisi&#243;n independiente.</p><p>Las cadenas secuenciales dependientes &#8212; donde cada agente espera la salida del anterior &#8212; son cargo cult. <strong>El peor encaje posible.</strong></p><p>&#191;"&#191;Pero no hay tareas que genuinamente necesitan m&#225;s de un agente?" S&#237;. El argumento es condicional:</p><ul><li><p>&#9989; <strong>Multi-agente justificado</strong>: subproblemas paralelos e independientes con paso de fusi&#243;n. La coordinaci&#243;n est&#225; dise&#241;ada (contratos, jerarqu&#237;a, validaci&#243;n) y medida contra el baseline.</p></li><li><p>&#10060; <strong>Multi-agente como cargo cult</strong>: cadenas secuenciales dependientes donde los agentes se pasan texto libre. M&#225;ximo acoplamiento, cero paralelismo, error compuesto.</p></li></ul><h2><strong>La Verdad Inc&#243;moda Sobre el 90%</strong></h2><p>Seamos honestos: la cifra del 90% es una tesis de practicante, no un benchmark medido de la industria. Es una afirmaci&#243;n direccional.</p><p>Pero es falsable y barata de testear. Audita tus propios sistemas:</p><p><strong>&#191;Cu&#225;ntos de tus "agentes" comparten el mismo modelo?</strong> &#191;Cu&#225;ntos no tienen paso de validaci&#243;n? &#191;Cu&#225;ntos handoffs son texto libre sin schema?</p><p>Si la mayor&#237;a &#8212; ya sabes la respuesta.</p><p>El camino correcto es el que casi nadie sigue: <strong>construye UN agente excelente con tools antes de a&#241;adir un segundo.</strong> M&#237;delo. Y solo entonces, si el problema es genuinamente paralelo, a&#241;ade trabajadores con contratos tipados y un supervisor que apruebe o rechace.</p><p>La pregunta correcta no es "&#191;cu&#225;ntos agentes?". Es <strong>"&#191;d&#243;nde est&#225; la coordinaci&#243;n?"</strong> &#8212; y la respuesta inc&#243;moda es que la mayor&#237;a de los equipos deber&#237;an construir un agente excelente antes de so&#241;ar con el segundo.</p><p>La coordinaci&#243;n no se a&#241;ade. <strong>Se dise&#241;a. Y se mide. O no existe.</strong></p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/multi-agent-coordination-2026-patrones-orquestacion-20260828?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El 73% de los SaaS No Fracasa por Elegir PLG o Sales-Led: Fracasa por Negarse a Dejar de Serlo]]></title><description><![CDATA[El 73% de los SaaS fracasa por rigidez de modelo, no por elegir mal PLG o Sales-Led. Aprende a auditar con uso, definir triggers y dise&#241;ar un handoff h&#237;brido.]]></description><link>https://newsletter.brianmenagomez.com/p/el-73-de-los-saas-no-fracasa-por</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-73-de-los-saas-no-fracasa-por</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Fri, 28 Aug 2026 07:00:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/57e341bd-6b72-4983-badd-f961fe9c3f78_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 73% de los SaaS No Fracasa por Elegir PLG o Sales-Led: Fracasa por Negarse a Dejar de Serlo</strong></h2><p>Crees que la decisi&#243;n PLG vs Sales-Led es estrat&#233;gica. Que eliges el modelo correcto, compras el marco mental, y te comprometes hasta el final. Que el foco lo es todo.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>El 73% de los SaaS no fracasa por elegir mal el modelo de crecimiento: fracasa por <strong>adherirse r&#237;gidamente a un &#250;nico modelo</strong> cuando el producto y el mercado evolucionan. La rigidez de identidad &#8212; *"somos una empresa PLG"* &#8212; sobrevive a los datos que la justificaron.</p><p>Igual que una feature muerta sobrevive en tu roadmap por haber sido pedida una vez, un modelo de crecimiento caducado sobrevive porque <strong>cambiar de identidad da miedo.</strong></p><p>No es una guerra entre dos filosof&#237;as. Es un problema de enrutamiento.</p><p>---</p><h2><strong>El 73%: Desambiguemos la Cifra Antes de que la Uses Mal</strong></h2><p>El n&#250;mero aparece en el hilo de dos formas que conviene separar.</p><p>Por un lado, el 73% de los SaaS adopta un modelo <em>puro</em> &#8212; PLG <strong>o</strong> Sales-Led. Por otro, el 73% de los SaaS fracasa. Los dos usos se cruzan en un sitio inc&#243;modo: <strong>el modelo puro es, en s&#237; mismo, el modo de fallo.</strong></p><p>No digo que el dato sea una causalidad probada con ensayo controlado. Es correlaci&#243;n. Pero el mecanismo detr&#225;s del n&#250;mero tiene m&#225;s peso que el titular: las empresas se casan con una etiqueta, y la etiqueta sobrevive a la evidencia.</p><p>Pi&#233;nsalo desde la pr&#225;ctica. Cuando hablas con fundadores que han vivido el ciclo completo &#8212; del Product-Led start-up al enterprise con ciclo comercial de meses &#8212; casi todos te cuentan la misma historia en dos actos. En el acto uno, montan un funnel self-serve impecable, con onboarding que se activa solo, y celebran que nadie necesita tocar a un vendedor. En el acto dos, el ACV sube, aparecen los security reviews, los procurement cycles, los m&#250;ltiples stakeholders... y de repente la motion self-serve deja de servir para los deals que pagan la n&#243;mina.</p><p>La mayor&#237;a no reacciona cambiando la motion. Reacciona defendiendo la etiqueta. <em>"Somos PLG, vendemos al desarrollo, el enterprise llegar&#225; solo."</em> Y el enterprise llega... a la competencia.</p><p>&#10060; <strong>El enfoque d&#233;bil:</strong> elegir PLG porque es moda, o porque un inversor lo pide, o porque "todo el mundo lo hace". Basar la identidad en la etiqueta, no en el uso.</p><p>&#9989; <strong>El enfoque fuerte:</strong> mirar los datos de uso de tu producto hoy. Ver qu&#233; motion activa y retiene usuarios de verdad. Y dise&#241;ar el sistema para que la motion cambie cuando los datos lo se&#241;alen.</p><p>La pregunta correcta no es <em>"&#191;PLG o Sales-Led?"</em>. Es <em>"&#191;qu&#233; motion usa cada segmento en cada fase, y qu&#233; trigger me dice cu&#225;ndo cambiar?"</em></p><p>Hay un matiz adicional que conviene capturar: muchos equipos confunden "PLG" con "no hacer sales". Y no es lo mismo. PLG puro significa que el producto es el canal de conversi&#243;n y expansi&#243;n, no que no exista un equipo comercial. Incluso en las empresas PLG m&#225;s can&#243;nicas, el sales aparece &#8212; solo que enroutado al final del embudo, cuando el usuario ya ha visto valor y el deal justifica un ejecutivo. El error no es tener sales. El error es no tener un trigger que decida cu&#225;ndo su aparici&#243;n es productiva y cu&#225;ndo es ruido.</p><p>---</p><h2><strong>La Lecci&#243;n del 90%: las Peticiones Son S&#237;ntomas, en Features Y en Growth Models</strong></h2><p>Tenemos un aprendizaje previo que se transfiere directo a este problema.</p><p>El <strong>90% de los SaaS llena su roadmap con features que un cliente pidi&#243;, no con features que los usuarios usan.</strong> Las peticiones son s&#237;ntomas de problemas m&#225;s profundos, no causas. El resultado son roadmaps llenos de funciones que nadie toca.</p><p>El mecanismo es siempre el mismo y conviene desmontarlo con calma. Un cliente importante env&#237;a un correo pidiendo una feature. El equipo de Customer Success lo eleva porque "un enterprise lo ha pedido". El product manager lo mete en el roadmap porque tiene presi&#243;n de revenue. Se construye, se lanza, y un trimestre despu&#233;s nadie lo usa. Pero nadie lo elimina tampoco, porque eliminarlo implicar&#237;a admitir que el proceso de priorizaci&#243;n funciona mal.</p><p>La se&#241;al fiable no es la petici&#243;n. Es el uso. En features y en growth models.</p><p>Ahora aplica el mismo sesgo a los modelos de crecimiento. Las empresas no eligen PLG porque los datos de uso lo respalden. Lo eligen porque un stakeholder lo pidi&#243;. Porque un board member viene de una empresa PLG y "sabe c&#243;mo funciona". Porque un gur&#250; de LinkedIn lo predica. Porque un competidor lanz&#243; un self-serve y "nos estamos quedando atr&#225;s".</p><p><strong>*Es exactamente el mismo error, un nivel m&#225;s arriba.</strong>*</p><p>Y el error se agrava porque la petici&#243;n no solo influye en la elecci&#243;n inicial: tambi&#233;n congela la evoluci&#243;n. Una vez que la empresa se declara PLG, cada petici&#243;n posterior de intervenci&#243;n comercial (un demo, un call de discovery, un playbook de venta) se rechaza con el mismo argumento: <em>"eso no es PLG"</em>. La identidad se convierte en un escudo contra los datos.</p><p>Mira tu producto hoy. &#191;Qui&#233;nes se activan solos? &#191;Qui&#233;nes necesitan una demo para entender el valor? &#191;Qu&#233; segmento llega al time-to-value sin tocarte, y cu&#225;l se pierde en el onboarding?</p><p>Eso es lo &#250;nico que importa. No lo que pide tu mayor cliente. No lo que hizo un SaaS famoso. <strong>Lo que tus datos de uso dicen.</strong></p><p>---</p><h2><strong>El Valor No Est&#225; en la Etiqueta: la Lecci&#243;n Transferida del SKILL.md</strong></h2><p>Hay un segundo aprendizaje que se transfiere perfecto.</p><p>En los sistemas de agentes, el valor durable de una skill vive en dos sitios: en la <strong>descripci&#243;n</strong> (que funciona como query de un sistema de recuperaci&#243;n) y en los <strong>assets empaquetados</strong> (que convierten instrucciones en capacidad ejecutable). El fichero de etiqueta &#8212; el SKILL.md &#8212; es la parte menos importante del sistema.</p><p>Esto merece un poco m&#225;s de desarrollo, porque la analog&#237;a es m&#225;s profunda de lo que parece a primera vista. En un sistema de agentes bien construido, la descripci&#243;n de una skill no es un titular bonito: es un &#237;ndice de recuperaci&#243;n. Cuando un agente recibe una tarea, consulta las descripciones para decidir qu&#233; skill ejecutar. Si la descripci&#243;n no refleja con precisi&#243;n qu&#233; puede hacer esa skill, el sistema enrouta mal: elige la skill equivocada, o no encuentra la que ten&#237;a capacidad de resolver el problema.</p><p>Un modelo de crecimiento funciona igual. La etiqueta <em>"PLG"</em> o <em>"Sales-Led"</em> es tu descripci&#243;n de recuperaci&#243;n. Si es demasiado vaga o demasiado r&#237;gida, el sistema enrouta mal: aplica una motion self-serve a un deal que necesitaba venta asistida, o mete un playbook comercial en un segmento que se activaba perfectamente solo.</p><p>Un modelo vale por su <strong>mec&#225;nica</strong>: el loop self-serve, los playbooks de handoff, el packaging de la oferta, el tiempo hasta el valor. No vale por llamarse *"PLG"<em> o </em>"Sales-Led"*.</p><p>La etiqueta es, literalmente, la parte menos importante del sistema.</p><p>Cuando dices <em>"somos una empresa PLG"</em>, est&#225;s describiendo la etiqueta, no la mec&#225;nica. Cuando dices <em>"enroutamos el self-serve a la larga cola y la venta asistida a los deals complejos"</em>, est&#225;s describiendo un sistema que funciona.</p><p>Uno es identidad congelada. El otro es <strong>ingenier&#237;a de crecimiento.</strong></p><p>F&#237;jate en el tipo de conversaciones que generan ambas frases. Con la primera, la discusi&#243;n es filos&#243;fica: <em>"&#191;podemos llamarnos PLG si tenemos un sales team?"</em> Con la segunda, la discusi&#243;n es operativa: <em>"&#191;cu&#225;l es el trigger exacto que separa un deal complejo de uno self-serve?"</em> Una te lleva a debates de branding interno. La otra te lleva a m&#233;tricas, playbooks y decisiones ejecutables.</p><p>---</p><h2><strong>El H&#237;brido No Es Hacer las Dos Cosas en Todas Partes: Es una Decisi&#243;n de Enrutamiento</strong></h2><p>Aqui es donde la mayor&#237;a se pierde.</p><p>El h&#237;brido no significa <em>"hacer PLG y Sales-Led a la vez en todos los segmentos"</em>. Eso es confusi&#243;n operativa con nombre bonito. Es la trampa en la que caen los equipos que, hartos del debate binario, deciden hacer "de todo para todos": producto con self-serve perfecto, sales team persiguiendo cada lead, y ning&#250;n criterio que diga qui&#233;n pertenece a cada v&#237;a. El resultado es una organizaci&#243;n que hace dos cosas mal en lugar de una bien.</p><p>El h&#237;brido es una <strong>decisi&#243;n de enrutamiento</strong>, como un sistema de recuperaci&#243;n que sirve el asset correcto seg&#250;n la query. Cada segmento se enruta a la motion que le corresponde:</p><ul><li><p><strong>Self-serve</strong> para la larga cola: usuarios que se activan solos, bajo ACV, time-to-value corto.</p></li><li><p><strong>Asistida</strong> para los deals complejos: m&#250;ltiples stakeholders, integraciones profundas, ciclo largo.</p></li><li><p>Con un <strong>handoff definido</strong> entre ambas y un <strong>trigger medible</strong> que decide cu&#225;ndo saltar.</p></li></ul><p>Hay una analog&#237;a directa con el mundo f&#237;sico que ayuda a entenderlo. Imagina una carretera con dos carriles: uno de peaje y otro gratuito. El peaje no existe para todo el mundo &#8212; existe para los conductores cuyo tiempo vale m&#225;s que el coste del peaje. La carretera no "es de peaje" ni "es gratuita": es un sistema de enrutamiento que decide en cada entrada qu&#233; carril sirve a qu&#233; conductor.</p><p>Tu producto es esa carretera. El sistema de enrutamiento decide en qu&#233; carril entra cada usuario seg&#250;n sus datos de uso, su ACV potencial, su comportamiento de activaci&#243;n. Y puede cambiar de carril en mitad del viaje &#8212; ah&#237; est&#225; el handoff.</p><p>El trigger no es opini&#243;n. Es un dato.</p><p>---</p><h2><strong>El Sistema de Enrutamiento por Uso: El Framework de 5 Pasos para Dejar de Ser Puro</strong></h2><p>Te voy a dejar el marco que uso. Lo llamo el <strong>Sistema de Enrutamiento por Uso</strong> &#8212; un m&#233;todo de cinco pasos para que cada segmento reciba la motion que sus datos de uso justifican.</p><h3><strong>Paso 1: Audita con uso, no con peticiones</strong></h3><p>Mide qu&#233; motion &#8212; self-serve o asistida &#8212; activa y retiene usuarios <em>hoy</em>. No lo que piden. No lo que hiciste el a&#241;o pasado.</p><p>M&#233;tricas que importan: tasa de activaci&#243;n sin tocar a nadie, time-to-value, porcentaje de usuarios que llegan al aha moment solos, comportamiento de expansi&#243;n (qui&#233;n paga m&#225;s y cu&#225;ndo).</p><p>Un ejercicio pr&#225;ctico que funciona bien: segmenta tu base en cuartiles de ACV y calcula la tasa de activaci&#243;n self-serve de cada cuartil. El resultado suele dibujar una curva reveladora. En la mayor&#237;a de los SaaS, el cuartil inferior se activa solo con tasa alta, y el cuartil superior apenas se activa sin intervenci&#243;n. Si tu identidad dice "somos PLG" pero tu cuartil de enterprise no se activa jam&#225;s sin un demo, tienes tu respuesta: el problema no es el mercado, es el enrutamiento.</p><h3><strong>Paso 2: Define el trigger de transici&#243;n expl&#237;cito</strong></h3><p>Se&#241;ales medibles que indiquen cu&#225;ndo a&#241;adir o cambiar de motion. Sin trigger, el cambio es opini&#243;n, no decisi&#243;n.</p><p>Ejemplos: usuarios con determinada tasa de activaci&#243;n se quedan en self-serve. Usuarios con se&#241;ales de expansi&#243;n y ciclo largo migran a asistida. Puntos de fricci&#243;n medibles en el onboarding disparan intervenci&#243;n humana.</p><p>La tentaci&#243;n aqu&#237; es definir triggers vagos ("cuando el deal sea complejo"). Resistela. Un trigger sirve si un humano puede decir hoy, en este momento, por qu&#233; este usuario concreto est&#225; en self-serve y aquel no. Si la respuesta depende del criterio subjetivo de cada Account Executive, no tienes un sistema: tienes suerte variable.</p><h3><strong>Paso 3: Dise&#241;a el handoff h&#237;brido</strong></h3><p>Especifica el punto exacto donde termina el self-serve y empieza la motion asistida. No dejes que sea improvisaci&#243;n del equipo de ventas.</p><p>Define playbooks de handoff: qu&#233; datos ve la persona asistida, qu&#233; contexto del producto recibe, qu&#233; se le cuenta al usuario en el cambio. Los <em>assets empaquetados</em> que convierten instrucciones en capacidad ejecutable.</p><p>En la pr&#225;ctica, el handoff se rompe casi siempre en el mismo sitio: el contexto. Un usuario ha estado usando el producto de forma self-serve durante semanas, y cuando salta a venta asistida, el comercial le pide que explique qu&#233; estaba haciendo. Ese fricci&#243;n es evitable: el dato ya existe en tu producto. El playbook de handoff deber&#237;a empaquetar ese contexto y entreg&#225;rselo al comercial como punto de partida, no como juego de adivinanzas.</p><h3><strong>Paso 4: Versiona el modelo</strong></h3><p>Trata el modelo de crecimiento como un <strong>artefacto iterable</strong>, no como una decisi&#243;n de una sola vez. Se revisa trimestralmente, se versiona, se a/b testea.</p><p>Igual que tu roadmap deber&#237;a tener features muertas eliminadas, tu growth model deber&#237;a tener motions retiradas cuando los datos la contradicen.</p><p>Este es quiz&#225; el cambio cultural m&#225;s dif&#237;cil del framework, porque implica aceptar que tu modelo actual tiene fecha de caducidad. Los equipos que dominan esta pr&#225;ctica funcionan con un calendario de revisi&#243;n fijo: cada trimestre se auditan los triggers, se comparan tasas de activaci&#243;n por segmento, y se versiona el modelo si los datos lo piden. La versi&#243;n anterior no se descarta &#8212; se archiva, como se archiva una feature que fue relevante y dej&#243; de serlo.</p><h3><strong>Paso 5: Desacopla identidad de mec&#225;nica</strong></h3><p>Elimina el framing <em>"somos una empresa PLG"</em>. Sustit&#250;yelo por <em>"usamos motion X cuando los datos dicen Y"</em>.</p><p>La etiqueta es la parte menos importante. <strong>La mec&#225;nica que responde al uso es todo el sistema.</strong></p><p>---</p><h2><strong>Las Objeciones Que Te Van a Poner, y la Respuesta</strong></h2><p><strong>"El foco lo es todo &#8212; un h&#237;brido diluye ambas motions."</strong></p><p>El foco debe estar en el trigger y el handoff, no en la etiqueta. La rigidez, no la falta de foco, es el mecanismo del fracaso del 73%. Un h&#237;brido bien dise&#241;ado no es falta de foco: es un sistema &#250;nico con dos carriles y una l&#243;gica de enrutamiento clara. La diluci&#243;n ocurre cuando la l&#243;gica de enrutamiento no existe y cada motion se improvisa.</p><p><strong>"PLG es para productos y Sales-Led para enterprise &#8212; es obvio, no se solapan."</strong></p><p>El segmento no decide la motion. El uso s&#237;. Hay productos dev-tool con deals enterprise largu&#237;simos, y hay plataformas enterprise con onboarding self-serve impecable. Mide el uso, no el adjetivo del segmento. La etiqueta de segmento es tan poco fiable como la etiqueta de modelo: sigue siendo una identidad congelada aplicada a un mundo que se mueve.</p><p><strong>"El 73% es discutible &#8212; correlaci&#243;n no es causalidad."</strong></p><p>De acuerdo. No uses el titular como veredicto. Usa el mecanismo: decisiones guiadas por peticiones en lugar de uso, y rigidez de identidad que sobrevive a los datos. Eso es lo que mata, y es observable en cualquier SaaS que hayas tocado. No necesitas el titular para validar el mecanismo &#8212; basta con mirar tu propio roadmap y ver cu&#225;ntas features viven en &#233;l sin que nadie las toque.</p><p>---</p><h2><strong>La Etiqueta No Te Salva. El Enrutamiento S&#237;.</strong></h2><p>El 73% de los SaaS no fracasa por elegir mal entre PLG y Sales-Led. Fracasa por negarse a dejar de serlo.</p><p>La falsa dicotom&#237;a es el problema. El modelo puro es el modo de fallo. Y la soluci&#243;n no es un tercer modelo con hype: es un sistema de enrutamiento que responde al uso y un trigger que decide cu&#225;ndo cambiar.</p><p>Cuando construyas tu pr&#243;xima feature, pregunta qu&#233; pide el uso, no qu&#233; pide el cliente. Cuando elijas tu pr&#243;xima motion, pregunta qu&#233; dicen tus datos de activaci&#243;n, no qu&#233; dice tu identidad.</p><p><strong>La ventaja competitiva de un SaaS en 2026 no es elegir bien el modelo. Es no enamorarse de &#233;l.</strong></p><p>Versiona tu modelo como versionas tu c&#243;digo. Un SaaS que se adapta sobrevive. Un SaaS que se casa con su etiqueta, muere con ella. Y la se&#241;al para adaptarse no llega desde el board ni desde el gur&#250; de turno: llega desde tu propio producto, desde la telemetr&#237;a de uso que ya tienes y que decides si escuchar o ignorar.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/plg-vs-sales-led-por-que-ambos-estan-equivocados-20260828?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El Error Silencioso de los AI Agents: Ningún Test Unitario lo Detecta — y tu Harness de 4 Buckets es la Única Salida]]></title><description><![CDATA[Por qu&#233; los AI agents fallan en silencio sin que ning&#250;n test unitario lo detecte. El harness de 4 buckets para medir precisi&#243;n, fiabilidad y coste por tarea. C&#243;mo build AI agents 2026.]]></description><link>https://newsletter.brianmenagomez.com/p/el-error-silencioso-de-los-ai-agents</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-error-silencioso-de-los-ai-agents</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Thu, 27 Aug 2026 07:00:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7nbD!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9dcf7f-ea19-48c6-9eb8-91e45dd4b8eb_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>Tu AI Agent Puede Devolver "&#201;xito" y Haber Fracasado por Completo &#8212; Ning&#250;n Test Unitario lo Ver&#225; Jam&#225;s</strong></h2><p>Tu agent llama a la API. Recibe un HTTP 200. Ejecuta la tool call. Todo parece perfecto.</p><p><strong>*Y la tarea ha fallado por completo.</strong> *</p><p>El agent escribi&#243; en el registro equivocado. La acci&#243;n no tuvo el efecto esperado sobre el estado del sistema. El outcome en el mundo real no coincidi&#243; con lo que el output suger&#237;a.</p><p>Y ning&#250;n test unitario, ning&#250;n try-catch, ning&#250;n framework de testing tradicional va a detectarlo.</p><p>Este es el punto ciego estructural del desarrollo de agents en 2026: la mayor&#237;a se despliegan sin evaluaci&#243;n estructurada, y sus errores son silenciosos, sist&#233;micos e invisibles. La sabidur&#237;a convencional dice que el problema es el modelo &#8212; <em>"cambia de modelo, afina el prompt, a&#241;ade m&#225;s herramientas"</em>. Es exactamente el mismo error categorial que comete el 80% de los SaaS al estructurar sus planes a ciegas: optimizar la cifra en vez de instrumentar el dato.</p><p>No necesitas un mejor modelo. <strong>Necesitas un harness que clasifique los fallos antes de que puedas medirlos, y que los mida antes de que puedas mejorarlos.</strong></p><p>La jerarqu&#237;a es <strong>clasificar &#8594; medir &#8594; optimizar</strong>. Y casi nadie hace los dos primeros pasos.</p><p>---</p><h2><strong>El Punto Ciego Estructural de los Tests Unitarios</strong></h2><p>Un test unitario verifica que el c&#243;digo devuelve el output correcto. Un agent acierta o falla a nivel de outcome en el mundo real.</p><p>Esas dos cosas viven en planos distintos, y ah&#237; reside el problema.</p><p>Mira este ejemplo. Tu agent tiene una tool que registra clientes potenciales en un CRM:</p><p>```python</p><h1>test_unitario.py &#8212; PASA, pero la tarea real FALLA</h1><p>def test_registra_cliente():</p><p>resultado = agent.run(</p><p>herramienta="registrar_prospecto",</p><p>input={"nombre": "Mar&#237;a", "email": "maria@empresa.com"},</p><p>crm="conversoria"</p><p>)</p><h1>El output del c&#243;digo parece correcto</h1><p>assert resultado.http_status == 200</p><p>assert resultado.log == "registro_ok"</p><h1>&#9989; El test unitario PASA</h1><p>```</p><p>Ahora mira lo que pasa en producci&#243;n real:</p><p>```python</p><h1>produccion.py &#8212; el outcome NO es el que esperabas</h1><p>resultado = agent.run(</p><p>herramienta="registrar_prospecto",</p><p>input={"nombre": "Mar&#237;a", "email": "maria@empresa.com"},</p><p>crm="conversoria"</p><p>)</p><h1>HTTP 200 &#9989; | log = "registro_ok" &#9989;</h1><h1>PERO el agent escribi&#243; en "prospectos_backup"</h1><h1>en vez de la tabla "prospectos_activos"</h1><p>consulta = "SELECT COUNT(*) FROM prospectos_activos WHERE email='maria@empresa.com'"</p><h1>&#10060; 0 filas &#8212; la tarea fracas&#243; a nivel de resultado.</h1><p>```</p><p>El test unitario pas&#243; porque verifica el output del c&#243;digo. El agent fall&#243; porque el outcome no ocurri&#243; en el mundo.</p><p><strong>*Esa brecha entre output y outcome es exactamente el espacio que ning&#250;n framework de testing tradicional cubre.</strong> *</p><p>Y los agents que construyes hoy fallan ah&#237; constantemente. No excepcionalmente &#8212; constantemente.</p><p>---</p><h2><strong>Por Qu&#233; el Try-Catch es un Error Categorial</strong></h2><p>Aqu&#237; est&#225; el giro contraintuitivo que cambia todo lo que sabes sobre errores en agents:</p><p>El try-catch modela el fallo como flujo de control excepcional. Pero la clase de fallo dominante en agents no es excepcional.</p><p>El sistema <em>completa</em> la ejecuci&#243;n. No lanza nada. No se interrumpe. Y el error vive en el resultado.</p><p>```python</p><h1>&#10060; Enfoque equivocado: try-catch alrededor de todo</h1><p>def ejecutar_agent(tarea):</p><p>try:</p><p>resultado = agent.ejecutar(tarea)   # ~2 min de ejecuci&#243;n</p><p>return resultado                     # Nunca lanza &#8212; siempre "completa"</p><p>except Exception as e:</p><p>return manejar_error(e)  # ESTE C&#211;DIGO NUNCA SE EJECUTA</p><p>```</p><p>El agent nunca lanza una excepci&#243;n. Devuelve un objeto de resultado "exitoso" que contiene la cat&#225;strofe completa sin que nadie se entere.</p><p>La recuperaci&#243;n de errores en agents no es un try-catch gen&#233;rico. Es una m&#225;quina de estados por fase &#8212; planificar &#8594; ejecutar &#8594; generar &#8212; con un clasificador de errores expl&#237;cito que decide <em>c&#243;mo y cu&#225;ndo</em> recuperarse:</p><p>```python</p><h1>&#9989; Enfoque correcto: clasificador + m&#225;quina de estados por fase</h1><p>class FaseAgent:</p><p>PLANIFICAR = "planificar"</p><p>EJECUTAR = "ejecutar"</p><p>GENERAR = "generar"</p><p>def clasificar_fallo(contexto) -&gt; Bucket:</p><p>"""Clasifica una ejecuci&#243;n en uno de los 4 buckets del harness."""</p><p>if contexto["state_ok"] and not contexto["outcome_ok"]:</p><p>return Bucket.BUCLE_OCULTO      # El agent "complet&#243;" pero el resultado no ocurri&#243;</p><p>if contexto["tool_seleccionada"] != contexto["tool_requerida"]:</p><p>return Bucket.HERRAMIENTA_ERRONEA</p><p>if contexto["razonamiento_no_verificado"]:</p><p>return Bucket.ALUCINACION_ACCION</p><p>return Bucket.CORRECTO</p><p>def recuperar(fase_actual, bucket):</p><p>if bucket == Bucket.HERRAMIENTA_ERRONEA:</p><p>return replanificar(fase_actual)        # Replanificar, no reintentar ciegamente</p><p>if bucket == Bucket.BUCLE_OCULTO:</p><p>return escalar_a_humano(fase_actual)    # Escalar &#8212; reintentar no servir&#225;</p><p>if bucket == Bucket.ALUCINACION_ACCION:</p><p>return verificar_estado_y_retry(fase_actual)</p><p>return abortar(fase_actual)</p><p>```</p><p>La decisi&#243;n de recuperar &#8212; reintentar, replanificar, escalar, abortar &#8212; pertenece a la taxonom&#237;a de evaluaci&#243;n, no al manejador de excepciones.</p><p><strong>Esa distinci&#243;n es la que separa un harness real de un script con try/except.</strong></p><p>---</p><h2><strong>El Framework: El Harness de 4 Buckets para Evaluaci&#243;n de AI Agents</strong></h2><p>No hay atajo. Este es el proceso completo que convierte tu agent de "creo que funciona" a "medido y justificable".</p><h3><strong>Paso 1 &#8212; Dise&#241;a la taxonom&#237;a de fallos espec&#237;fica de tu dominio</strong></h3><p>Los buckets no se copian. Se derivan de los se&#241;ales observables de <em>tu propio</em> agent.</p><p>En un agent de c&#243;digo, el bucket dominante podr&#237;as ser <strong>selecci&#243;n de herramienta incorrecta</strong>. En un agent de soporte, probablemente sea <strong>pol&#237;tica alucinada</strong>. Si copias una taxonom&#237;a gen&#233;rica, obtienes buckets que no clasifican nada de tu realidad.</p><p>Define cada bucket en t&#233;rminos de evidencia concreta en tus logs. No en t&#233;rminos abstractos.</p><p>| Bucket | Se&#241;al observable en tus logs |</p><p>|---|---|</p><p>| &#9989; Correcto | Outcome verificado = esperado |</p><p>| &#128295; Herramienta err&#243;nea | Tool call &#8800; tool requerida para la subtarea |</p><p>| &#128257; Bucle oculto | Estado no cambi&#243; pese a inputs v&#225;lidos |</p><p>| &#127744; Alucinaci&#243;n de acci&#243;n | Raz&#243;n de la acci&#243;n no verificable en el contexto |</p><h3><strong>Paso 2 &#8212; Construye un suite de tareas doradas</strong></h3><p>30 a 50 tareas representativas por tipo de tarea. Cada una con un outcome esperado verificable y criterios de aprobaci&#243;n expl&#237;citos.</p><p>El golden set es el suelo del harness. Sin &#233;l, no hay nada que medir.</p><h3><strong>Paso 3 &#8212; Instrumenta el agent</strong></h3><p>Logs estructurados por fase &#8212; plan, tool calls, outputs &#8212; que hagan cada ejecuci&#243;n reproducible y clasificable a posteriori.</p><p>Sin esto, los buckets no tienen datos que clasificar:</p><p>```python</p><h1>instrumentacion.py &#8212; consumo por tarea</h1><p>def registrar_ejecucion(fase: str, tarea_id: str, tipo_tarea: str, info: dict):</p><p>"""Logging estructurado por fase &#8212; el proxy no monetario del coste."""</p><p>log_estructurado({</p><p>"tarea_id": tarea_id,</p><p>"tipo_tarea": tipo_tarea,</p><p>"fase": fase,                      # planificar / ejecutar / generar</p><p>"tokens_usados": info.get("tokens", 0),</p><p>"tool_calls": info.get("tool_calls", 0),</p><p>"pasos": info.get("pasos", 0),</p><p>"latencia_ms": info.get("latencia_ms", 0),</p><p>"modelo": info.get("modelo"),</p><p>})</p><p>```</p><h3><strong>Paso 4 &#8212; Ejecuta el harness sobre cada candidato</strong></h3><p>Cada vez que cambias de modelo, de prompt o de versi&#243;n de herramientas, ejecutas el harness completo. Calculas precisi&#243;n, fiabilidad y consumo de recursos por tipo de tarea, comparando contra el baseline.</p><h3><strong>Paso 5 &#8212; Convierte el harness en un gate de despliegue</strong></h3><p>Ejecuci&#243;n en cada cambio. Tracking de m&#233;tricas en el tiempo. Rollback autom&#225;tico ante regresiones:</p><p>```python</p><h1>gate_despliegue.py &#8212; bloquea el deploy ante regresiones</h1><p>def gate_de_despliegue(resultados_nuevos, baseline):</p><p>precision = resultados_nuevos["precision_total"]</p><p>fiabilidad = resultados_nuevos["fiabilidad_total"]</p><p>if precision &lt; baseline["precision"] * 0.95:</p><p>abortar_deploy(f"Precisi&#243;n degradada: {precision:.1%} vs baseline {baseline['precision']:.1%}")</p><p>if fiabilidad &lt; baseline["fiabilidad"] * 0.95:</p><p>abortar_deploy(f"Fiabilidad degradada: {fiabilidad:.1%} vs baseline {baseline['fiabilidad']:.1%}")</p><p>if resultados_nuevos["tokens_por_tarea"] &gt; baseline["tokens_por_tarea"] * 1.3:</p><p>abortar_deploy("Consumo de recursos disparado &#8212; revisa la nueva versi&#243;n")</p><p>activar_deploy()</p><p>```</p><p>Esto es lo que convierte "creo que funciona" en una afirmaci&#243;n medida.</p><p>---</p><h2><strong>"&#191;La evaluaci&#243;n con LLM no es subjetiva?"</strong></h2><p>Te escucho. "&#191;Qui&#233;n decide que una ejecuci&#243;n fall&#243;?"</p><p>La respuesta es un enfoque h&#237;brido que no depende de un juez &#250;nico:</p><p>1. <strong>Comprobaciones deterministas de outcome</strong>: aserciones sobre el estado final, verificaci&#243;n de tool calls.</p><p>2. <strong>LLM-as-judge calibrado</strong> contra etiquetas humanas en un subset del golden set.</p><p>Los 4 buckets son una capa de clasificaci&#243;n, no un juez &#250;nico. Las reglas deterministas cazan el 80% de los fallos silenciosos (el ejemplo del registro equivocado). El LLM-as-judge cubre el resto, y se calibra contra personas reales &#8212; no contra otro LLM.</p><p>---</p><h2><strong>"&#191;No es overkill para un prototipo?"</strong></h2><p>El harness arranca con un <strong>smoke suite de 10 tareas</strong> y los 4 buckets. El coste es incremental.</p><p>Se amortiza en la primera regresi&#243;n silenciosa que detecta antes de llegar a producci&#243;n. Y para un agent de prototipo, la pregunta relevante no es "&#191;puede hacer esto?" sino "&#191;puedo <strong>justificar</strong> que haga esto en producci&#243;n?"</p><p>Un agent sin harness no puede justificarse. No puede mejorarse con evidencia. No puede defenderse contra regresiones.</p><p>---</p><h2><strong>La Lecci&#243;n que se Transfiere Completa</strong></h2><p>El paralelismo con el pricing es el argumento profundo de todo esto. El 80% de los SaaS estructura sus planes a ciegas &#8212; optimizan la cifra en vez de instrumentar el uso. Los equipos de agents optimizan el prompt en vez de instrumentar los outcomes.</p><p>Ambos fracasos son <strong>epistemol&#243;gicos, no num&#233;ricos</strong>. Ambos comparten la misma jerarqu&#237;a rota: optimizar antes de medir, medir antes de clasificar.</p><p>Primero se mide. Luego se optimiza. Siempre en ese orden.</p><h2><strong>Lo que te llevas</strong></h2><ul><li><p>Los tests unitarios detectan crashes y violaciones de contrato, no fallos silenciosos de outcome &#8212; son complementarios al harness, no sustitutos.</p></li><li><p>El try-catch es un error categorial: el fallo dominante en agents no es excepcional, vive en el resultado.</p></li><li><p><strong>Los 4 buckets convierten los logs ruidosos en una se&#241;al agregable por tipo de tarea, comparable entre candidatos y trackeable en el tiempo.</strong></p></li><li><p>Medir consumo por tarea (tokens, tool calls, latencia) a&#241;ade la tercera dimensi&#243;n: no basta con que sea correcto, tiene que ser eficiente y fiable en cada tipo de tarea.</p></li><li><p>El harness es el &#250;nico mecanismo que hace seguros los rollbacks y las actualizaciones de modelo.</p></li></ul><p>El futuro de los agents no lo deciden los modelos m&#225;s grandes ni los prompts m&#225;s largos. Lo deciden los equipos que instrumentan sus outcomes, miden por tipo de tarea y convierten cada regresi&#243;n silenciosa en una se&#241;al accionable.</p><p><strong>El harness no es un gasto de ingenier&#237;a. Es la diferencia entre un agent que demuestra valor y un agent que finge tenerlo.</strong></p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/evaluacion-tests-ai-agents-harness-4-buckets-20260827?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El 90% de los SaaS Construye Features Porque un Cliente lo Pidió — No Porque un Usuario las Use. Tu Roadmap es un Cementerio.]]></title><description><![CDATA[El 90% de los SaaS prioriza por petici&#243;n, no por uso. Framework de 3 ejes para decidir qu&#233; construir: impacto, retenci&#243;n y valor estrat&#233;gico.]]></description><link>https://newsletter.brianmenagomez.com/p/el-90-de-los-saas-construye-features</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-90-de-los-saas-construye-features</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Thu, 27 Aug 2026 07:00:13 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b4187b03-0787-4081-81cd-7e91239c936f_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 90% de los SaaS Construye Features Porque un Cliente lo Pidi&#243; &#8212; No Porque un Usuario las Use. Tu Roadmap es un Cementerio.</strong></h2><p>Crees que tu problema es que no sabes qu&#233; construir a continuaci&#243;n. Que si tuvieras m&#225;s feedback, m&#225;s llamadas con clientes, m&#225;s votos en el backlog, tendr&#237;as claridad.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>El 90% de los SaaS construye features porque un cliente lo pidi&#243; &#8212; no porque los usuarios las usen. Y ese es exactamente el motivo por el que tu roadmap es un cementerio de funciones que nadie abre.</p><p>Construyes porque alguien grit&#243;. No porque la telemetr&#237;a lo confirme.</p><p>La sabidur&#237;a convencional dice "escucha a tus clientes" y "construye lo que piden". El mercado asume que el volumen de peticiones es una se&#241;al de demanda.</p><p><strong>*Es falso. Y es caro.</strong>*</p><p>Vamos a desmontarlo, vamos a darte el framework, y vas a dejar de construir funciones fantasma.</p><p>---</p><h2><strong>El Sesgo de la Minor&#237;a Ruidosa: Tu "Roadmap Democr&#225;tico" es una Dictadura de los que M&#225;s Gritan</strong></h2><p>Mira tu inbox. Los clientes que te escriben emails, abren tickets y exigen features no son una muestra representativa.</p><p>Son los m&#225;s vocalizados. Los m&#225;s grandes. Los m&#225;s frustrados.</p><p>Los que se dan de baja en silencio jam&#225;s votan en tu backlog. Simplemente se van. As&#237; que tu feedback es una muestra sesgada por dise&#241;o: <strong>solo escuchas a los que a&#250;n est&#225;n enfadados contigo, no a los que ya se fueron sin decir nada.</strong></p><p>El "roadmap democr&#225;tico" que venden los frameworks de community voting no es democracia. Es captura por parte de los que m&#225;s gritan.</p><p>Y hay una conexi&#243;n directa con el eje de retenci&#243;n: la petici&#243;n ruidosa casi nunca viene de la cohorte que est&#225; en riesgo de churn. Viene de la cohorte que ya est&#225; comprometida. Construyes para contentar a los que se quedan, mientras los que est&#225;n a punto de irse no te dicen ni una palabra.</p><p>Pi&#233;nsalo desde la mec&#225;nica del incentivo. Un cliente que lleva dos a&#241;os contigo, que ya ha invertido tiempo en configurar el producto y que forma parte de tu plan enterprise, tiene <strong>todo el motivo del mundo</strong> para escribirte cuando algo le falta. Est&#225; comprometido, quiere que el producto mejore porque su &#233;xito depende del tuyo. Pero el usuario que prob&#243; tu producto la semana pasada, tropez&#243; con la misma carencia y simplemente cerr&#243; la pesta&#241;a&#8230; ese no te escribe jam&#225;s. Ni te env&#237;a un ticket de soporte. Ni te da un voto en tu portal de feedback. Solo desaparece.</p><p>El resultado es un bucle de retroalimentaci&#243;n corrompido. Cada feature que construyes para el cliente vocalizado no solo te cuesta tiempo y recursos: te aleja a&#250;n m&#225;s de los usuarios que no hablan. Y mientras m&#225;s te alejas, m&#225;s dependes de las mismas voces ruidosas para saber qu&#233; construir. El problema se retroalimenta.</p><p>&#10060; <strong>El enfoque d&#233;bil:</strong> "Este cliente grande pide export a CSV. Lo ponemos en el roadmap."</p><p>&#9989; <strong>El enfoque fuerte:</strong> "&#191;Qu&#233; cohorte est&#225; abandonando en silencio? &#191;Qu&#233; contratan y no usan? Respondamos eso antes de tocar el backlog."</p><p>La diferencia entre ambos enfoques no es sutil. Es la diferencia entre un equipo de producto que reacciona y uno que dirige. El primero acumula deuda para la mayor&#237;a silenciosa a cambio de contentar al 5% que grita. El segundo invierte esa ecuaci&#243;n: la se&#241;al de retenci&#243;n &#8212; qu&#233; cohortes se quedan, qu&#233; cohortes se van, qu&#233; patr&#243;n de uso precede a la baja &#8212; es la br&#250;jula que gu&#237;a el roadmap. Y esa se&#241;al no llega por email. Llega por telemetr&#237;a.</p><p>---</p><h2><strong>S&#237;ntomas vs. Soluciones: El Cliente no Pide el Bot&#243;n. Pide el Resultado.</strong></h2><p>Un cliente que pide "exportar a CSV" no quiere un bot&#243;n.</p><p>Quiere resolver un problema de reporting que probablemente ya intenta resolver con copiar-pegar, con una herramienta externa o con una hoja de c&#225;lculo manual.</p><p>Si construyes el bot&#243;n literal, resuelves el s&#237;ntoma. Listo, una feature m&#225;s que nadie usar&#225; como esperabas.</p><p>Si investigas el job-to-be-done &#8212;<em>"&#191;qu&#233; resultado intentas conseguir?"</em>&#8212; descubres que la soluci&#243;n real puede ser un dashboard mejor, una integraci&#243;n con su herramienta favorita, o un reporte programado con m&#225;s impacto y menos coste de mantenimiento que el bot&#243;n literal.</p><p>Cada petici&#243;n es un s&#237;ntoma de un problema m&#225;s profundo. Rastrearlo antes de aceptarla como orden de trabajo separa a los equipos que construyen producto de los que construyen botones.</p><p>Existe un patr&#243;n cl&#225;sico que se repite en todos los SaaS: el cliente pide la soluci&#243;n literal que ya se le ha ocurrido, no la soluci&#243;n &#243;ptima. Es humano. Es el sesgo de disponibilidad aplicado a la ingenier&#237;a de producto. Cuando alguien est&#225; harto de copiar y pegar datos de tu interfaz a una hoja de c&#225;lculo, su primera idea es "exportar a Excel". No piensa en "reporte programado" ni en "dashboard interactivo". No tiene por qu&#233;: su trabajo es gestionar sus n&#250;meros, no dise&#241;ar tu producto.</p><p>Tu trabajo, sin embargo, s&#237; es entender el resultado final. Y la buena noticia es que la pr&#225;ctica de entrevistar el job-to-be-done tiene una t&#233;cnica concreta: preguntar siempre <strong>la pregunta de rastreo</strong>. Cuando alguien te pide una feature, responde con "&#191;y qu&#233; est&#225;s intentando conseguir con eso exactamente?" &#8212; y cuando te responda, pregunta otra vez "&#191;y eso para qu&#233;?" &#8212; y as&#237; hasta llegar a la capa de resultado. Casi siempre necesitas rascar tres o cuatro capas para descubrir el problema subyacente real. La petici&#243;n original, "necesito un bot&#243;n de export", es lo &#250;ltimo que deber&#237;as tomar literalmente.</p><p>Y este patr&#243;n no es un accidente aislado. Es sist&#233;mico. <strong>El 80% de los SaaS estructura sus planes de precios a ciegas, sin mirar ni un dato.</strong> El mismo s&#237;ndrome de "decidir sin evidencia" que produce planes al azar produce roadmaps por petici&#243;n. Son dos caras de la misma enfermedad cultural: equipos que reaccionan a voces en lugar de leer telemetr&#237;a.</p><p>---</p><h2><strong>El Coste Oculto de las Features Fantasma</strong></h2><p>Cada feature construida para un solo cliente ruidoso tiene un coste que casi nadie calcula.</p><p>No es el sprint. Es el legado.</p><p>Una feature que nadie usa a&#241;ade deuda permanente de mantenimiento. Superficie de bugs. Complejidad de onboarding. Cada bot&#243;n nuevo que no aporta valor confunde al usuario que llega por primera vez. La feature fantasma es un impuesto que todos los usuarios futuros pagan en forma de producto m&#225;s confuso.</p><p>El coste real no es el tiempo de desarrollo. <strong>Es el producto que pudo haber sido.</strong></p><p>Cada feature construida para complacer a una voz es una feature que NO se construye para la mayor&#237;a silenciosa que ya usa el producto. El coste de oportunidad de decir "s&#237;" a un grito es decir "no" a cientos de usuarios que simplemente no te escribieron.</p><p>Vamos a ponerle n&#250;meros concretos a esa deuda, porque el coste se siente abstracto hasta que lo descompones. Cada feature de baja adopci&#243;n implica:</p><ul><li><p><strong>Mantenimiento perpetuo:</strong> Bugs que se descubren y se arreglan aunque nadie use la feature. Cada release que toca c&#243;digo colindante riesgo de romperla.</p></li><li><p><strong>Tests y suites:</strong> Cada feature nueva necesita su cobertura de tests. Tests que ejecutan CI que deber&#237;a ejecutar features que el usuario usa.</p></li><li><p><strong>Densidad cognitiva:</strong> Cada opci&#243;n visible en la interfaz compite por la atenci&#243;n del usuario. Un cliente nuevo que ve siete botones que no entiende abandona el onboarding m&#225;s r&#225;pido que uno que ve tres botones claros.</p></li><li><p><strong>Documentaci&#243;n y soporte:</strong> Art&#237;culos de ayuda, preguntas de Soporte sobre "&#191;c&#243;mo funciona esto?" de features que nadie usa. Recursos que se destinan a explicar algo que deber&#237;a haber sido un dashboard interno.</p></li><li><p><strong>Coste de reversi&#243;n:</strong> Cuando finalmente reconoces que la feature es un lastre y decides retirarla, tienes que gestionar la migraci&#243;n, el versionado, y la queja inevitable del cliente que la pidi&#243; (y que quiz&#225; tampoco la usaba, pero se siente propietario).</p></li></ul><p>Todo eso es un impuesto silencioso que pagas todos los d&#237;as. Y el problema es que se acumula con el tiempo: diez features fantasma construidas en dos a&#241;os pueden a&#241;adir m&#225;s deuda de mantenimiento que todas las features reales juntas.</p><p>---</p><h2><strong>El Marco de los Tres Ejes: Impacto &#215; Retenci&#243;n &#215; Valor Estrat&#233;gico</strong></h2><p>Este es el framework que uso para decidir qu&#233; construir en mis propios productos. Lo llamo <strong>El Marco de los Tres Ejes</strong>. Y la primera regla es no negociable.</p><p><strong>Regla 1: Instrumenta antes de pedir.</strong></p><p>Mide uso por feature y por segmento antes de aceptar cualquier petici&#243;n como hecho. Frecuencia de uso, adopci&#243;n, activaci&#243;n, abandono. Necesitas saber qu&#233; se usa, qu&#233; se ignora y qu&#233; se abandona antes de que alguien te pida nada.</p><p>Cada request se registra como una hip&#243;tesis contrastable contra la telemetr&#237;a existente. No como una orden de trabajo.</p><p>La instrumentaci&#243;n no tiene que ser exhaustiva. Empieza por lo m&#237;nimo: <strong>&#191;qu&#233; features est&#225;n activas en la sesi&#243;n t&#237;pica de cada segmento? &#191;Cu&#225;l es el rate de activaci&#243;n del onboarding? &#191;Qu&#233; flujos terminan en abandono?</strong> Con esas tres m&#233;tricas cubiertas, ya tienes suficiente se&#241;al para contrastar la mayor&#237;a de peticiones. El 80% de las peticiones de features nuevas se pueden evaluar contra "&#191;hay evidencia en la telemetr&#237;a de que una carencia en este flujo est&#225; provocando abandono?"</p><p><strong>Regla 2: Clasifica cada petici&#243;n por su job-to-be-done.</strong></p><p>No preguntes "&#191;qu&#233; bot&#243;n quieres?". Pregunta "&#191;qu&#233; resultado intentas conseguir?". Documenta el problema subyacente y agrupa peticiones distintas que comparten el mismo s&#237;ntoma ra&#237;z.</p><p>```markdown</p><h1>Registro de peticiones</h1><p>Petici&#243;n: "Necesito exportar datos a Excel"</p><p>Job-to-be-done: "Quiero hacer informes mensuales sin copiar-pegar"</p><p>S&#237;ntoma ra&#237;z: Reporting nativo inexistente</p><p>Soluci&#243;n real probable: Dashboard + reporte programado</p><p>Score hip&#243;tesis pendiente de telemetr&#237;a: Confirma rate de workaround primero</p><p>```</p><p>Este registro cumple una funci&#243;n importante que la mayor&#237;a de backlogs no tienen: <strong>agrupar</strong>. Ocho peticiones distintas &#8212; "export a Excel", "necesito filtros avanzados", "quiero programar envios", "me gustar&#237;a un calendario de reportes" &#8212; pueden compartir el mismo s&#237;ntoma ra&#237;z de "reporting nativo pobre". Si las tratas como ocho features separadas, construyes ocho soluciones parciales. Si las agrupas por s&#237;ntoma ra&#237;z, construyes una soluci&#243;n que las resuelve todas a la vez. El registro de peticiones es la herramienta que permite esa agrupaci&#243;n.</p><p><strong>Regla 3: Punt&#250;a cada feature en tres ejes, escala 1-5.</strong></p><ul><li><p><strong>Impacto en cliente:</strong> &#191;A cu&#225;ntos usuarios o segmentos beneficia? No "&#191;qui&#233;n lo pidi&#243;?", sino "&#191;qui&#233;nes lo usar&#237;an?"</p></li><li><p><strong>Riesgo de retenci&#243;n:</strong> &#191;Qu&#233; cohorte est&#225; en riesgo si NO lo construimos? Este eje prioriza a los que se van en silencio, no a los que gritan.</p></li><li><p><strong>Valor estrat&#233;gico:</strong> &#191;Nos acerca a la visi&#243;n de producto o nos desv&#237;a?</p></li></ul><p>Suma las tres puntuaciones. Ordena el backlog. Borra del liderazgo cualquier feature que la telemetr&#237;a no respalde.</p><p><strong>Regla 4: Umbral de corte y re-priorizaci&#243;n trimestral.</strong></p><p>Las peticiones antiguas no ganan prioridad por antig&#252;edad. Ganan por su puntuaci&#243;n actualizada con datos frescos de uso. Re-eval&#250;a el backlog entero cada trimestre y descarta lo que ya no pasa el umbral.</p><p>Este es el punto m&#225;s dif&#237;cil de interiorizar culturalmente, porque choca con la intuici&#243;n de "si llevan pidi&#233;ndolo dos a&#241;os, ser&#225; importante". La antig&#252;edad no es una se&#241;al de demanda. Es una se&#241;al de <strong>ruido persistente</strong>. Una petici&#243;n que lleva dos a&#241;os en el backlog sin que nadie la recuerde suele ser una petici&#243;n que nadie necesita de verdad &#8212; o la necesita muy poca gente, y muy ruidosa. Si fuera realmente cr&#237;tica, la telemetr&#237;a lo demostrar&#237;a en forma de abandono creciente. Si no lo demuestra, lo &#250;nico que la mantiene viva es la inercia. El trimestre es tu ciclo natural de recolecci&#243;n de datos: con tres meses de telemetr&#237;a fresca puedes comparar c&#243;mo han evolucionado los patrones de uso antes de commitear recursos.</p><p><strong>Regla 5: Valida con el slice m&#225;s peque&#241;o.</strong></p><p>Lanza la feature en versi&#243;n m&#237;nima a un segmento. Define de antemano la m&#233;trica objetivo &#8212; retenci&#243;n o activaci&#243;n. Mide el cambio real antes de comprometer recursos completos.</p><p>```javascript</p><p>// Ejemplo de feature gate para validaci&#243;n de una feature nueva</p><p>const shouldShowFeature = (user, feature) =&gt; {</p><p>// solo el 5% de la cohorte de prueba ve la feature</p><p>const inTestSegment = hash(user.id + feature.name) % 20 === 0;</p><p>const metricName = feature.successMetric || "activation";</p><p>return inTestSegment ? track(metricName) : null;</p><p>};</p><p>```</p><p>El patr&#243;n de feature gating que ves en el c&#243;digo es exactamente lo que separa a los equipos que aprenden de los que suponen. El slice m&#225;s peque&#241;o no es un atajo cutre: es la unidad de aprendizaje m&#225;s eficiente que existe en producto. Si la feature tiene el impacto esperado en el 5% de la cohorte, tienes evidencia para escalar. Si no lo tiene, has invertido el 5% del coste que habr&#237;a supuesto construirla entera para descubrir que nadie la usa. El fracaso barato es una herramienta de producto tan valiosa como el &#233;xito.</p><p>Y aqu&#237; la analog&#237;a con la ingenier&#237;a de software a gran escala es esclarecedora. Cuando un proyecto enorme se atasca, no suele ser porque alguien no sepa escribir c&#243;digo. Se atasca en la planificaci&#243;n, el dise&#241;o y la coordinaci&#243;n que rodean al c&#243;digo: entender el sistema existente, decidir qu&#233; construir y en qu&#233; orden, mantener la alineaci&#243;n con el objetivo original. El mismo principio aplica a tu roadmap de features: el problema rara vez es "no sabemos qu&#233; construir". El problema es que el proceso de decidir est&#225; capturado por voces ruidosas en lugar de evidencia de uso.</p><p>---</p><h2><strong>Respondiendo a Tus Objeciones</strong></h2><p><strong>"Los clientes enterprise exigen features concretas para cerrar el deal."</strong></p><p>Distingue entre compromisos contractuales y roadmap discrecional. Lo primero se negocia y se instrumenta igualmente. Lo segundo pasa por el mismo filtro de los tres ejes. Un deal que depende de una feature unica de un solo cliente es un deal que probablemente se cae igualmente en el primer renew.</p><p>Esta objeci&#243;n es la m&#225;s com&#250;n y la m&#225;s leg&#237;tima. Nadie dice que ignores a los enterprise. Lo que dice el framework es que distingas entre lo que se negocia <strong>en el contrato</strong> y lo que entra <strong>en el roadmap</strong>. Si un cliente enterprise quiere una integraci&#243;n con su ERP, eso se negocia, se presupuesta, se instrumenta &#8212; y se entrega con m&#233;tricas de adopci&#243;n definidas. Eso es un proyecto. Pero cuando el mismo cliente enterprise te pide, fuera de contrato, una feature "que su equipo lleva pidiendo meses", esa petici&#243;n entra en el mismo embudo de los tres ejes que cualquier otra. El tama&#241;o del cliente infla el volumen de la voz, pero no la evidencia de uso. Y cuidado con el patr&#243;n perverso: el cliente que te chantajea con el renewal para conseguir features suele ser el mismo que se da de baja igualmente porque su problema real era otro. Construyes el plugin de SAP que pidi&#243;, no lo usa nadie de su equipo, y el renewal se cae igualmente porque el problema era la falta de soporte, no la falta del plugin.</p><p><strong>"Los datos de uso solo te dicen lo que existe, no lo que falta."</strong></p><p>Existen se&#241;ales proxy medibles. Workarounds detectados en sesiones. Tickets de soporte recurrentes. B&#250;squedas fallidas. Rate de abandono en flujos clave. Y los experimentos de feature gating miden demanda real con audiencia peque&#241;a antes de comprometer el roadmap.</p><p>Los datos de uso no te dicen directamente qu&#233; falta, es cierto. Pero te dicen <strong>d&#243;nde buscar</strong>. Un usuario que copia manualmente datos de tu interfaz para pegarlos en otra herramienta es una se&#241;al proxy. Un usuario que escribe "export" en la b&#250;squeda de tu documentaci&#243;n y no encuentra nada es una se&#241;al proxy. Un flujo de onboarding con un 70% de abandono en el tercer paso es una se&#241;al proxy. Todas son medibles con las herramientas que ya tienes. El problema no es que los datos no digan qu&#233; falta &#8212; es que los equipos no los leen con la intenci&#243;n de averiguarlo. La telemetr&#237;a convierte la "falta" en una hip&#243;tesis contrastable, y eso es una ventaja enorme sobre la petici&#243;n literal.</p><p><strong>"No tengo data team ni infraestructura de analytics."</strong></p><p>El framework no exige un data warehouse sofisticado. Evidencia cualitativa estructurada a escala &#8212; clasificar tickets, entrevistas de job-to-be-done, sesiones grabadas &#8212; supera a una sola voz ruidosa. Y la instrumentaci&#243;n m&#237;nima se hace con herramientas de producto est&#225;ndar.</p><p>Este es el mito m&#225;s extendido y el m&#225;s f&#225;cil de desmontar. No necesitas un equipo de data engineering para aplicar el Marco de los Tres Ejes. Necesitas:</p><ul><li><p><strong>Una hoja de c&#225;lculo</strong> donde clasifiques tickets por s&#237;ntoma ra&#237;z &#8212; puedes hacerlo en una tarde y ya tendr&#225;s m&#225;s se&#241;al que la mayor&#237;a de los SaaS.</p></li><li><p><strong>Tres preguntas estructuradas</strong> en tus entrevistas de cliente: "&#191;qu&#233; intentabas conseguir?", "&#191;c&#243;mo lo resuelves hoy?", "&#191;qu&#233; te ha frenado?". Con esas tres preguntas en veinte entrevistas has matado la ambig&#252;edad de mil peticiones.</p></li><li><p><strong>Herramientas de producto est&#225;ndar</strong> para el gating: la mayor&#237;a de plataformas de analytics de producto &#8212; PostHog, Amplitude, Mixpanel &#8212; incluyen feature flags y tracking de eventos con una configuraci&#243;n m&#237;nima. La instrumentaci&#243;n m&#237;nima no es un proyecto: es una tarde de trabajo.</p></li></ul><p>El verdadero coste no es la infraestructura. Es la disciplina de preguntarse "&#191;qu&#233; evidencia tengo?" antes de preguntarse "&#191;qu&#233; me han pedido?".</p><p>---</p><h2><strong>Del Backlog Congelado al Bucle de Aprendizaje</strong></h2><p>Priorizar bien no termina en la decisi&#243;n. Termina en la validaci&#243;n.</p><p>La disciplina de lanzar el slice m&#225;s peque&#241;o con una m&#233;trica objetivo definida convierte la priorizaci&#243;n en un bucle: cada feature lanzada y medida actualiza el score de las siguientes. El backlog mejora con cada iteraci&#243;n en lugar de congelarse en la opini&#243;n del d&#237;a uno.</p><p>F&#237;jate en c&#243;mo funciona el bucle. Lanzas el slice peque&#241;o de la feature A. Mides retenci&#243;n. Los datos dicen que la adopci&#243;n es baja pero la activaci&#243;n sube en el segmento de prueba. Ese resultado actualiza el score de la feature B (que compart&#237;a s&#237;ntoma ra&#237;z con A) y te dice si vale la pena mejorarla. Mientras tanto, la petici&#243;n del cliente C que lleg&#243; la semana pasada se eval&#250;a contra la telemetr&#237;a reci&#233;n generada &#8212; y quiz&#225; se agrupa con A y B en lugar de abrir un frente nuevo. El backlog deja de ser una lista est&#225;tica de deseos y se convierte en un conjunto de hip&#243;tesis vivas que evolucionan con cada dato nuevo.</p><p>Los equipos que sobreviven en SaaS no son los que escuchan mejor. Son los que miden primero y preguntan despu&#233;s. La pr&#243;xima vez que un cliente grite una feature, no abras el c&#243;digo.</p><p>Abre la telemetr&#237;a.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/como-priorizar-features-saas-por-datos-no-por-peticiones-20260827?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Claude Skills no son Plantillas de Prompt. Son Paquetes de Capacidad — y Casi Todos los Escribís Mal]]></title><description><![CDATA[Claude Skills no son prompts de sistema con carpeta. Descubre por qu&#233; la descripci&#243;n, los assets y la distribuci&#243;n son las tres capas donde vive el valor real.]]></description><link>https://newsletter.brianmenagomez.com/p/claude-skills-no-son-plantillas-de</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/claude-skills-no-son-plantillas-de</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Thu, 27 Aug 2026 07:00:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7nbD!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb9dcf7f-ea19-48c6-9eb8-91e45dd4b8eb_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>La L&#237;nea M&#225;s Importante de tu Claude Skill es la Descripci&#243;n de Tres Frases que Casi Nadie Escribe con Cuidado</strong></h2><p>No es documentaci&#243;n. Es la query string de un sistema de recuperaci&#243;n que decide si tu skill se usa alguna vez.</p><p>Claude no carga tu skill porque est&#233; en la carpeta. La carga <strong>solo cuando la descripci&#243;n coincide con la tarea del usuario</strong>. Escribes una descripci&#243;n vaga, y tu skill es un zombi: existe, pesa cero en el contexto, pero jam&#225;s se dispara.</p><p>Y los equipos que copian sus system prompts en un SKILL.md van a ver <strong>cero beneficio</strong> y van a concluir que la feature no funciona.</p><p>Casi nadie lo analiza as&#237;, as&#237; que vamos a destriparlo: <strong>*el fichero SKILL.md es la parte menos importante de la skill</strong>*. El valor real vive en tres capas que nadie menciona.</p><p>---</p><h2><strong>No es un Prompt de Sistema con Carpeta. Es un Sistema de Recuperaci&#243;n</strong></h2><p>El argumento que oyes en cada oficina: "&#191;Para qu&#233; complicarme? Lo hago con un prompt de sistema personalizado."</p><p>Ah&#237; est&#225; el error conceptual.</p><p>Un prompt de sistema <strong>est&#225; siempre en contexto</strong>. Cada instrucci&#243;n que a&#241;ades paga token en cada llamada, compite con la tarea real del modelo y degrada la calidad cuando acumulas contenido. Con 50 system prompts encima, tienes un agente lento, caro y confuso.</p><p>La skill <strong>invierte ese tradeoff</strong>.</p><p>Puedes tener 50 skills para 50 dominios y pagar <strong>coste base cero</strong>, porque solo entra en contexto la que coincide. Eso convierte a las skills en una <strong>primitiva de escalado</strong>, no en un detalle de formateo.</p><p>Es la diferencia entre un bundle de prompts de 200KB y un agente limpio que tira de conocimiento experto <strong>exactamente cuando lo necesita</strong>.</p><p>Mirad el formato real. Una skill es una carpeta con un SKILL.md que tiene frontmatter YAML y un cuerpo en Markdown:</p><p>```markdown</p><p>---</p><p>name: normalizador-csv</p><p>description: &gt;</p><p>Usa cuando el usuario pida fusionar, limpiar, convertir o reformatear</p><p>datos CSV, hojas de c&#225;lculo o ficheros exportados desde Excel o Google</p><p>Sheets. Tambi&#233;n si pega una tabla con columnas inconsistentes o fechas</p><p>en formatos mixtos.</p><p>---</p><h1>Normalizador CSV</h1><p>Normaliza ficheros CSV a un esquema consistente:</p><ul><li><p>Columna `id` siempre primera.</p></li><li><p>Fechas en ISO 8601 (YYYY-MM-DD).</p></li><li><p>Eliminar filas duplicadas.</p></li><li><p>Solo conservar las columnas definidas en `schemas/template.json`.</p></li></ul><p>```</p><p>Fijaos en la descripci&#243;n. <strong>No es un resumen de producto</strong>. Es un &#237;ndice de intenciones de usuario. Dice en qu&#233; situaciones dispararse, qu&#233; frases la activan y qu&#233; tipo de inputs acepta.</p><p>Eso no lo escribe casi nadie. Y es la diferencia entre una skill que funciona y una skill invisible.</p><p>---</p><h2><strong>Las Skills-Versus-MCP: Donde la Arquitectura de Casi Todos se Va al Carajo</strong></h2><p>Desde el anuncio, la reacci&#243;n en dos bandos:</p><p>&#10060; "Es un prompt de sistema con pasos extra"</p><p>&#10060; "Necesito montar un servidor MCP para cada capacidad"</p><p>Ambas est&#225;n mal.</p><p>Los <strong>servidores MCP</strong> son para integraciones con estado, externas, del lado del servidor: bases de datos vivas, APIs de terceros, herramientas que mantienen sesiones.</p><p>Las <strong>skills</strong> son para capacidad *stateless* y autocontenida: transformaci&#243;n de ficheros, formateo espec&#237;fico de dominio, heur&#237;sticas empaquetadas.</p><p>Los ejemplos oficiales de Anthropic &#8212; decodificar un QR y convertir PDF a Markdown &#8212; son problemas de <em>script-en-una-carpeta</em>. Y aun as&#237;, los equipos montan un servidor MCP completo para cada uno, pagando infraestructura y mantenimiento por algo que resuelve una carpeta versionada.</p><p>El test es brutalmente simple: <strong>&#191;la capacidad necesita estado compartido o un server-side runtime?</strong> Si la respuesta es no, es una skill.</p><p>Aqu&#237; est&#225; el patr&#243;n de <em>paquete de capacidad</em>: texto que instruye + asset que ejecuta.</p><p>```markdown</p><p>---</p><p>name: extraer-metadatos-imagen</p><p>description: &gt;</p><p>Usa cuando el usuario pida extraer metadatos de im&#225;genes (EXIF, GPS,</p><p>fecha de captura, c&#225;mara) o ordenar una carpeta de fotos por estos datos.</p><p>---</p><h1>Extracci&#243;n de Metadatos</h1><p>Ejecuta el script incluido con el fichero a analizar:</p><p>```</p><p>python scripts/extract_exif.py &lt;ruta-al-fichero&gt;</p><p>```</p><p>Muestra solo: fecha, c&#225;mara, coordenadas GPS si existen.</p><p>Si no existe el script, p&#237;dele al usuario que lo reinstale.</p><p>```</p><p>Y en la carpeta, junto al SKILL.md:</p><p>```python</p><h1>scripts/extract_exif.py</h1><p>import sys</p><p>from PIL import Image</p><p>from PIL.ExifTags import TAGS, GPSTAGS</p><p>def main(path):</p><p>img = Image.open(path)</p><p>exif = img._getexif() or {}</p><p>data = {}</p><p>for tag_id, value in exif.items():</p><p>tag = TAGS.get(tag_id, tag_id)</p><p>if tag == "GPSInfo":</p><p>data["gps"] = {GPSTAGS.get(k, k): v for k, v in value.items()}</p><p>else:</p><p>data[tag] = value</p><p>print({k: v for k, v in data.items()</p><p>if k in ("DateTime", "Model", "Make", "gps")})</p><p>if __name__ == "__main__":</p><p>main(sys.argv[1])</p><p>```</p><p>Una skill que solo contiene prosa <strong>es una skill a medias</strong>. El asset empaquetado es lo que la convierte en capacidad, no en sugerencia.</p><p>---</p><h2><strong>El Patr&#243;n de las 3 Capas del Paquete de Capacidad</strong></h2><p>Tras construir varias en producci&#243;n, este es el marco que funciona. No es teor&#237;a: es el orden en que escribo <strong>cada</strong> skill nueva.</p><h3><strong>1. Encuentra las 3&#8211;5 tareas que tu equipo repite y que el modelo base hace mal</strong></h3><p>No busques demos impresionantes. Busca el trabajo real repetido a diario: "formatear nuestros partes de incidencias" o "convertir los PDF de proveedores a markdown". Esas, no las demostraciones, son los candidatos reales.</p><h3><strong>2. Crea la estructura de carpeta y escribe la descripci&#243;n AL FINAL</strong></h3><p>Crea `.claude/skills/&lt;nombre-de-skill&gt;/SKILL.md`. Escribe primero el cuerpo. Luego la descripci&#243;n, como una b&#250;squeda: enumera frases disparadoras, intenciones de usuario y tipos de input para que la capa de recuperaci&#243;n pueda hacer match.</p><p><strong>Si la skill nunca se dispara, el bug es la descripci&#243;n.</strong> Si se dispara pero hace algo incorrecto, el bug es el cuerpo. Apunta a ambos por separado.</p><h3><strong>3. Mueve TODO lo ejecutable fuera de la prosa y dentro de assets</strong></h3><p>Cualquier script, lista de regex, plantilla o ejemplo few-shot va como fichero en la carpeta, referenciado desde el cuerpo. Mant&#233;n el cuerpo lo suficientemente corto para que cargue barato.</p><p>Mirad la diferencia entre la v1 y la v2 de la misma skill:</p><p>&#10060; <strong>v1: un ensayo de 400 palabras</strong> de instrucciones sobre c&#243;mo normalizar datos, con ejemplos inline, edge cases enterrados en prosa y reglas que el modelo debe recordar.</p><p>&#9989; <strong>v2: 60 palabras de cuerpo</strong> + un script ejecutable + una plantilla JSON referenciada. El contexto que entra es m&#237;nimo. La l&#243;gica vive en c&#243;digo testable, no en memoria del modelo.</p><h3><strong>4. Testea con tareas reales del paso 1, e itera sobre la descripci&#243;n (no solo las instrucciones)</strong></h3><p>Si la skill no se dispara, reescribe la descripci&#243;n como &#237;ndice de intenci&#243;n de usuario. Tr&#225;tala como SEO y haz A/B tests. <strong>Una skill que nunca se dispara es invisible por muy bueno que sea su cuerpo.</strong></p><h3><strong>5. Empaqueta y distribuye como c&#243;digo</strong></h3><p>Haz commit en un repo de git, a&#241;ade un manifiesto de plugin y trata el SKILL.md como c&#243;digo fuente: <strong>code review los cambios, versiona, haz rollback</strong>.</p><p>As&#237; se ve el empaquetado para distribuci&#243;n:</p><p>```json</p><p>{</p><p>"name": "normalizador-csv",</p><p>"version": "1.2.0",</p><p>"description": "Normaliza CSV y hojas de c&#225;lculo a un esquema consistente.",</p><p>"skills": ["./skills/normalizador-csv"]</p><p>}</p><p>```</p><p>Esa capa de distribuci&#243;n es la <strong>feature dormida</strong> del ecosistema. Convierte la capacidad de un agente en un artefacto de software con versionado, revisi&#243;n y rollback. Es la misma progresi&#243;n que vivi&#243; el mundo de los package managers con las librer&#237;as.</p><p>---</p><h2><strong>Los Assets, no el Prompt, son el Producto</strong></h2><p>Cuando Anthropic lanz&#243; <em>Agent Skills</em> en octubre de 2025, los ejemplos oficiales no eran prosa elegante. Eran un decodificador QR (script basado en OpenCV) y un conversor de PDF a Markdown (script con Amazon Textract).</p><p><strong>*Un skill es un mini-paquete de capacidad: instrucciones + assets ejecutables.</strong> * No una plantilla.</p><p>La consecuencia pr&#225;ctica: el acto de escribir un SKILL.md fuerza a tu equipo a <strong>externalizar conocimiento tribal</strong> que vive en cabezas de seniors y hilos de Slack. "Aqu&#237; est&#225; exactamente c&#243;mo normalizamos los datos de cliente." Ese valor documentado compone antes de que la automatizaci&#243;n sea perfecta.</p><p>Y es revisable, diffable y responsable de una forma que un prompt de sistema de pared de texto jam&#225;s ser&#225;.</p><p>---</p><h2><strong>C&#243;mo Responder a las Objeciones</strong></h2><p><strong>"Es un prompt de sistema en una carpeta."</strong></p><p>Un prompt de sistema est&#225; siempre en contexto y paga token en cada llamada. No puede empaquetar assets ejecutables. No se versiona ni se distribuye limpio. La carga bajo demanda, el empaquetado de assets y el distributable son <strong>el producto real</strong>.</p><p><strong>"Las skills son poco fiables, no disparan la m&#237;a."</strong></p><p>Eso es casi siempre <strong>un fallo de recuperaci&#243;n por la descripci&#243;n</strong>, no del modelo. La soluci&#243;n es reescribir la descripci&#243;n como un &#237;ndice de intenci&#243;n de usuario y testearla. La fiabilidad es disciplina de dise&#241;o, no un regalo.</p><p><strong>"Esto me ata a Claude y Claude Code."</strong></p><p>El formato SKILL.md es Markdown plano + YAML, y los assets son ficheros ordinarios. El artefacto es <strong>portable</strong>; el conocimiento sobrevive aunque cambie el runtime. Lo que se ata es el comportamiento de recuperaci&#243;n, no el contenido. S&#233; honesto: el marketplace y el ecosistema son espec&#237;ficos de Claude, pero el formato no es profundamente propietario.</p><p>---</p><h2><strong>El Futuro del "Prompt Engineering" es Mantenimiento de Software</strong></h2><p>Los equipos que adopten este workflow pronto est&#225;n construyendo <strong>activos organizacionales reutilizables</strong>, no automatizaciones de usar y tirar.</p><p>La diferencia entre escalar con 50 skills bien descritas y versionadas, o ahogarse con un system prompt monol&#237;tico de 200KB, es la misma que separa a un equipo que mantiene librer&#237;as de uno que copia c&#243;digo en Slack. <strong>Construye el activo.</strong> La descripci&#243;n convi&#233;rtela en query string, los assets en c&#243;digo, y la distribuci&#243;n en tu est&#225;ndar de calidad.</p><p>Porque el que trata las skills como prompts de sistema ya est&#225; pagando el impuesto. Solo que todav&#237;a no lo nota.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/claude-skills-paquetes-de-capacidad-20260827?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[Error Recovery en AI Agents 2026: El Try-Catch es la Herramienta Equivocada para un Sistema Estocástico]]></title><description><![CDATA[M&#225;quina de estados de recuperaci&#243;n para AI agents: clasifica el error (transitorio, permanente, ambiguo) antes de decidir si re-planificar, retry o re-prompt. C&#243;digo incluido.]]></description><link>https://newsletter.brianmenagomez.com/p/error-recovery-en-ai-agents-2026-841</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/error-recovery-en-ai-agents-2026-841</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Wed, 26 Aug 2026 07:00:15 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/60a0607d-f2ea-47b9-a3b4-917b9ea651c8_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>El 95% de los AI Agents que Construyes Hoy se Van a Romper en Producci&#243;n</strong></h2><p>No es culpa del modelo. Es culpa de tu try-catch.</p><p>La mayor&#237;a de los desarrolladores tratan los AI agents como software determinista. Escrib&#237;s c&#243;digo que asume que el LLM devolver&#225; JSON v&#225;lido. Que la tool call funcionar&#225;. Que el contexto cabr&#225; en la ventana.</p><p>Y cuando falla, pon&#233;is un try-catch alrededor del loop y llam&#225;is a eso "error handling".</p><p><strong>*El problema no es que los agents fallen. Es que los trat&#225;is como funciones puras cuando son sistemas estoc&#225;sticos.</strong> *</p><p>Y un sistema estoc&#225;stico no lanza excepciones. Produce respuestas plausibles pero incorrectas. Tool calls alucinadas con argumentos perfectamente formados. JSON v&#225;lido que describe la cosa equivocada.</p><p>El try-catch es la herramienta equivocada no porque est&#233; mal implementado. Es porque captura exactamente la categor&#237;a de error que <strong>no</strong> es el problema real.</p><p>---</p><h2><strong>El Problema: El Fallo de un LLM Casi Nunca Llega como Excepci&#243;n</strong></h2><p>En software determinista, una excepci&#243;n tiene sem&#225;ntica definida. Un `TimeoutError` significa que algo tard&#243; demasiado. Un `SchemaError` significa que los datos no encajan. El handler sabe exactamente qu&#233; pas&#243; y qu&#233; hacer.</p><p>Con un LLM, el "error" rara vez llega como excepci&#243;n. Llega como:</p><ul><li><p>Una respuesta sint&#225;cticamente correcta pero sem&#225;nticamente err&#243;nea.</p></li><li><p>Un argumento de tool alucinado que parece plausible.</p></li><li><p>Un JSON malformado que solo descubre el parser, cuando ya es tarde.</p></li></ul><p><strong>El momento en que se dispara tu `except` es el momento en que el sistema estoc&#225;stico ya te minti&#243;.</strong></p><p>Y ojo: el retry con backoff que te ha funcionado toda la vida tambi&#233;n falla aqu&#237;. Los retries solo cubren errores transitorios &#8212; un 429 de rate limit, un timeout temporal. Si el fallo es silencioso (respuesta incorrecta pero v&#225;lida), el retry re-ejecuta el mismo fallo y le llama "recuperaci&#243;n".</p><p>&gt; &#10060; <strong>El error del enfoque cl&#225;sico:</strong></p><p>&gt; - try-catch alrededor del loop &#8594; no captura fallos silenciosos</p><p>&gt; - retry + backoff gen&#233;rico &#8594; repite el mismo fallo en bucle</p><p>&gt; - "m&#225;s contexto" &#8594; no arregla una tool ca&#237;da</p><p>&gt; - "un modelo mejor" &#8594; sigue siendo estoc&#225;stico</p><p>&gt; &#9989; <strong>El enfoque que funciona:</strong></p><p>&gt; - Classificar el error <strong>antes</strong> de decidir la recuperaci&#243;n</p><p>&gt; - Handlers espec&#237;ficos por fase (planificar, ejecutar, responder)</p><p>&gt; - Fallar hacia la seguridad: auto-recuperar solo con confianza alta</p><p>&gt; - Instrumentar cada recuperaci&#243;n para aprender de ella</p><p>La recuperaci&#243;n de verdad no es un bloque de excepciones. Es una <strong>m&#225;quina de estados con handlers espec&#237;ficos por fase</strong>.</p><p>---</p><h2><strong>La Evidencia: Por Qu&#233; los Retries "Funcionan" sin Funcionar</strong></h2><p>Hay una raz&#243;n por la que tantos agentes pasan las demos y se rompen en producci&#243;n. La demo es un camino de felicidad: el modelo devuelve lo esperado, la tool responde, el JSON parsea. En producci&#243;n el espacio de fallos se multiplica &#8212; rate limits de una API de terceros, tools ca&#237;das a las 3 de la madrugada, esquemas que cambian sin avisar, inputs adversariales.</p><p>A quienes les funciona el retry con backoff, les digo una cosa: <strong>funciona porque el fallo es transitorio, no porque tu c&#243;digo de recuperaci&#243;n sea bueno.</strong> Est&#225;s cubriendo el 20% de los fallos y llam&#225;ndolo soluci&#243;n.</p><p>Un clasificador de errores bien construido no sustituye al retry. Le dice al retry <strong>cu&#225;ndo tiene sentido</strong> y cu&#225;ndo est&#225; tirando el dinero.</p><h3><strong>Taxonom&#237;a de errores</strong></h3><p>El primer paso es inventariar los fallos reales de tu agente. Recorre tus logs de producci&#243;n y clasifica cada incidente en una de estas categor&#237;as:</p><p>```python</p><h1>error_taxonomy.py</h1><p>from enum import Enum</p><p>class ErrorCategory(Enum):</p><p>TRANSIENT = "transient"            # rate limit, timeout, API ca&#237;da</p><p>PERMANENT = "permanent"            # schema changed, auth revoked</p><p>AMBIGUOUS = "ambiguous"            # no sabemos qu&#233; pas&#243;</p><p>TOOL_FAILURE = "tool_failure"      # la tool existe pero falla al ejecutar</p><p>MODEL_OUTPUT_INVALID = "output_invalid"  # JSON malformado, arg alucinado</p><h1>Mapping expl&#237;cito de excepciones conocidas y status codes</h1><p>ERROR_MAP = {</p><p>429: ErrorCategory.TRANSIENT,</p><p>503: ErrorCategory.TRANSIENT,</p><p>401: ErrorCategory.PERMANENT,</p><p>400: ErrorCategory.AMBIGUOUS,   # puede ser un arg malformado del modelo</p><p>}</p><p>```</p><p><strong>La clave: el clasificador opera tambi&#233;n sobre outputs sint&#225;cticamente exitosos, no solo sobre excepciones.</strong></p><p>Un JSON que parsea pero devuelve un argumento imposible (una cita fuera de horario en un sistema de reservas) entra en `MODEL_OUTPUT_INVALID`. Ah&#237; no hay excepci&#243;n. Ah&#237; hay <strong>semantic validation</strong>: un validador de resultados, no un parser.</p><p>---</p><h2><strong>La M&#225;quina de 3 Fases: Plan &#8594; Tool &#8594; Respond</strong></h2><p>Recuperarse de una fallo no es un acto. Es un proceso que depende de <strong>en qu&#233; fase del ciclo</strong> est&#233; tu agente cuando falla.</p><p>Retryar una llamada a tool fallida es barato. Pero retryar un plan fallido re-ejecuta trabajo ya hecho y multiplica coste y latencia. Y re-ejecutar sin m&#225;s cuando falla la generaci&#243;n de respuesta es repetir exactamente el mismo fallo.</p><p>Cada fase necesita su propio mecanismo de recuperaci&#243;n:</p><h3><strong>Fase 1: Planificaci&#243;n &#8594; re-plan con feedback</strong></h3><p>Si el plan propuesto lleva a un callej&#243;n sin salida, no repitas el plan. <strong>Re-planifica inyectando el error como feedback</strong> en el contexto del modelo.</p><p>```python</p><p>def replan_with_feedback(agent, plan, error_feedback):</p><p>"""Re-planifica inyectando el error para que el nuevo plan lo evite."""</p><p>prompt = agent.build_plan_prompt(</p><p>previous_plan=plan,</p><p>feedback=f"El plan anterior fall&#243; en el paso 3: {error_feedback}. "</p><p>f"Elimina ese paso o sustit&#250;yelo por una alternativa."</p><p>)</p><p>return agent.generate_plan(prompt)</p><p>```</p><h3><strong>Fase 2: Ejecuci&#243;n &#8594; retry + circuit breaker</strong></h3><p>Para errores transitorios en una tool: retry con <strong>exponential backoff + jitter</strong>. Para fallos repetidos: <strong>circuit breaker</strong> &#8212; corta la tool tras N fallos consecutivos y reanuda desde el &#250;ltimo paso persistido en vez de reiniciar el workflow completo.</p><p>```python</p><h1>circuit_breaker.py</h1><p>class CircuitBreaker:</p><p>def __init__(self, failure_threshold=3, cooldown_seconds=60):</p><p>self.failure_threshold = failure_threshold</p><p>self.cooldown = cooldown_seconds</p><p>self.failures = 0</p><p>self.open_since = None</p><p>def allow_request(self) -&gt; bool:</p><p>if self.open_since and (time.time() - self.open_since) &gt; self.cooldown:</p><p>self.reset()  # half-open: probamos de nuevo</p><p>return True</p><p>return self.failures &lt; self.failure_threshold</p><p>def record_failure(self):</p><p>self.failures += 1</p><p>if self.failures &gt;= self.failure_threshold:</p><p>self.open_since = time.time()</p><p>```</p><h3><strong>Fase 3: Generaci&#243;n &#8594; re-prompt con el error en contexto</strong></h3><p>Cuando el output del modelo es inv&#225;lido, no relances la misma llamada con el mismo prompt. Eso es la definici&#243;n de locura.</p><p>Usa el <strong>semantic retry</strong>: inyecta el mensaje de error en el contexto del modelo para que se autocorrija a nivel de prompt, no de excepci&#243;n.</p><p>```python</p><p>def semantic_retry(model, request, error_message, max_attempts=3):</p><p>"""En vez de relanzar la misma llamada, inyecta el error en contexto."""</p><p>for attempt in range(max_attempts):</p><p>response = model.generate(</p><p>**request,</p><p>system_override=(</p><p>f"Tu respuesta anterior fue rechazada por el validador: {error_message}. "</p><p>f"Corrige el error y responde de nuevo."</p><p>)</p><p>)</p><p>validation = validate_response(response)</p><p>if validation.is_valid:</p><p>return response</p><p>error_message = validation.error  # actualiza con el nuevo error</p><p>raise ManualEscalationError("3 intentos fallidos. Requiere revisi&#243;n humana.")</p><p>```</p><p><strong>El error #1 que comete todo el mundo: mezclar las recuperaciones.</strong> Re-planificar cuando hab&#237;a que hacer retry, o re-prompt cuando hab&#237;a que cortar la tool. Cruzar esos mecanismos produce el cl&#225;sico bucle infinito de "recuperaci&#243;n" que repite el mismo fallo cuatro veces seguidas.</p><p>---</p><h2><strong>El ErrorClassifier H&#237;brido: Reglas Primero, LLM Solo para lo Ambiguo</strong></h2><p>"Vale, &#191;y si uso un LLM para clasificar el error?" no. Un LLM-judge a&#241;ade otro punto de fallo al sistema que est&#225; fallando.</p><p>El clasificador correcto es <strong>h&#237;brido</strong>: reglas deterministas para lo que ya conoces, LLM solo para lo ambiguo, y siempre con un umbral de confianza que escale a humano en vez de auto-recuperar a ciegas.</p><p>```python</p><h1>error_classifier.py</h1><p>class ErrorClassifier:</p><p>"""Reglas deterministas primero. LLM-judge solo para lo ambiguo."""</p><p>def classify(self, exception, context) -&gt; ClassificationResult:</p><h1>1. Reglas deterministas: status codes, excepciones conocidas</h1><p>if isinstance(exception, APITimeoutError):</p><p>return ClassificationResult(ErrorCategory.TRANSIENT, confidence=0.98)</p><p>if isinstance(exception, AuthenticationError):</p><p>return ClassificationResult(ErrorCategory.PERMANENT, confidence=0.99)</p><p>if exception.status_code in ERROR_MAP:</p><p>return ClassificationResult(ERROR_MAP[exception.status_code], confidence=0.95)</p><h1>2. Output inv&#225;lido detectado por el validador (no excepci&#243;n)</h1><p>if context.is_output_semantically_wrong:</p><p>return ClassificationResult(ErrorCategory.MODEL_OUTPUT_INVALID, confidence=0.9)</p><h1>3. Solo lo ambiguo va al LLM-judge</h1><p>if self._is_ambiguous(exception):</p><p>judge = self._llm_judge(exception, context)</p><p>if judge.confidence &gt; 0.85:</p><p>return judge</p><h1>CONFIANCE BAJA =&gt; escala a humano. Nunca auto-recuperar en duda.</h1><p>return ClassificationResult(ErrorCategory.AMBIGUOUS, confidence=0.3)</p><p>return ClassificationResult(ErrorCategory.PERMANENT, confidence=0.5)</p><p>```</p><p><strong>La regla de oro: auto-recuperar mal es peor que parar.</strong></p><p>Un agente de pagos que "corrige" un fallo re-cobrando dos veces causa un desastre mayor que un halt con alerta. El dise&#241;o debe fallar hacia la seguridad: umbral de confianza bajo &#8658; escalado humano, no auto-recuperaci&#243;n temeraria.</p><p>---</p><h2><strong>El Decorator @recover: El Orquestador de la Robustez</strong></h2><p>Esta es la pieza que une todo. Un decorator que envuelve cada paso del agente, intercepta el fallo, lo pasa por el clasificador, elige el handler seg&#250;n la fase y registra la decisi&#243;n.</p><p>```python</p><h1>recover.py</h1><p>def recover(phase: Phase):</p><p>"""Envuelve un paso del agente con clasificaci&#243;n + recuperaci&#243;n por fase."""</p><p>def decorator(fn):</p><p>@functools.wraps(fn)</p><p>def wrapper(<em>args, </em>*kwargs):</p><p>attempts = 0</p><p>for attempt in range(MAX_ATTEMPTS[phase]):</p><p>attempts += 1</p><p>try:</p><p>return fn(<em>args, </em>*kwargs)</p><p>except Exception as exc:</p><h1>1. Clasifica ANTES de decidir c&#243;mo recuperarse</h1><p>classification = classifier.classify(exc, build_context(fn))</p><h1>2. Elige handler seg&#250;n categor&#237;a + fase</h1><p>handler = HANDLER_MAP[(classification.category, phase)]</p><h1>3. &#201;xito o escalado</h1><p>result = handler.handle(exc, classification, <em>args, </em>*kwargs)</p><p>if result.is_resolved:</p><p>log_recovery(phase, classification.category, attempts)</p><p>return result.value</p><p>if classification.should_escalate_human():</p><p>raise ManualEscalationError(classification)</p><p>raise ManualEscalationError(f"{phase} failed after {MAX_ATTEMPTS[phase]} attempts")</p><p>return wrapper</p><p>return decorator</p><p>```</p><p>Este `@recover` no sustituye a la l&#243;gica de negocio. Es la <strong>capa de orquestaci&#243;n de la robustez</strong> &#8212; y aqu&#237; est&#225; el punto que conecta con todo lo que sabemos sobre agentes en 2026: el modelo subyacente es commodity. La ventaja competitiva est&#225; en la capa que decide c&#243;mo clasificar y recuperarse de un fallo.</p><p>El `ErrorClassifier` <strong>es</strong> esa capa para la fiabilidad.</p><p>---</p><h2><strong>Checkpointing: Reanudar, No Reiniciar</strong></h2><p>Para workflows largos &#8212; un agente de investigaci&#243;n que ejecuta 20 tools, un pipeline de ETL con 15 pasos &#8212; el checkpointing no es opcional.</p><p>```python</p><h1>checkpointing.py</h1><p>class WorkflowState:</p><p>"""Persiste el estado entre pasos para reanudar en vez de reiniciar."""</p><p>def __init__(self, store=memory_store):</p><p>self.store = store</p><p>@recover(Phase.TOOL)</p><p>def execute_step(self, step_id: str, run_id: str, fn, *args):</p><p>checkpoint = self.store.get(run_id, step_id)</p><p>if checkpoint:</p><p>return checkpoint.result  # ya lo hicimos, recuperamos el resultado</p><p>result = fn(*args)</p><p>self.store.set(run_id, step_id, result)  # persiste antes de seguir</p><p>return result</p><p>```</p><p>El patr&#243;n es simple: persiste el resultado de cada paso <strong>antes</strong> de pasar al siguiente. Si el workflow muere a mitad de camino, reanudas desde el &#250;ltimo checkpoint, no desde el principio. Coste y latencia multiplicados por el n&#250;mero de pasos que NO necesitas re-ejecutar.</p><p>---</p><h2><strong>Instrumenta Cada Recuperaci&#243;n</strong></h2><p>Un agente que recupera sin registrar qu&#233; recuper&#243;, cu&#225;ntos intentos hizo y qu&#233; ruta tom&#243; es un agente que nunca mejora.</p><p>```python</p><p>def log_recovery(phase, category, attempts, strategy):</p><p>telemetry.record({</p><p>"event": "agent_recovery",</p><p>"phase": phase,           # plan | tool | respond</p><p>"category": category,     # transient | permanent | ...</p><p>"attempts": attempts,</p><p>"strategy": strategy,     # replan | retry | circuit_break | semantic_retry | escalate</p><p>"timestamp": time.time(),</p><p>})</p><p>```</p><p>Con esos datos aprendes cosas que ning&#250;n retry te ense&#241;a:</p><ul><li><p><strong>Qu&#233; tools degradan la fiabilidad</strong> a los pocos d&#237;as de estar en producci&#243;n.</p></li><li><p><strong>D&#243;nde est&#225; el l&#237;mite correcto de tu circuit breaker</strong>.</p></li><li><p><strong>Qu&#233; categor&#237;as de error est&#225;s clasificando como `AMBIGUOUS`</strong> cuando en realidad son fallos de una dependencia que va a vuelta.</p></li></ul><p>Ajustas umbrales con datos, no con intuici&#243;n.</p><p>---</p><h2><strong>&#191;Un Modelo Mejor No Arregla Esto?</strong></h2><p>No. Y es la objeci&#243;n que hay que cerrar ya.</p><p>Un modelo m&#225;s capaz sigue siendo estoc&#225;stico. Produce outputs malformados. Alucina tool args con argumentos plausibles. Y choca con errores de infraestructura &#8212; rate limits, tools ca&#237;das, esquemas que cambian &#8212; que ning&#250;n prompt resuelve.</p><p><strong>La arquitectura de recuperaci&#243;n es ortogonal a la calidad del modelo.</strong> El fallo es estructural, no de capacidad.</p><p>Y el coste de no hacerlo bien es invisible: tu agente no se cae, se queda. Responde de forma convincente con datos equivocados. Genera un ticket de soporte con el campo de cliente vac&#237;o. Confirma una cita para una hora que no existe.</p><p>Eso no aparece en tus dashboards de uptime. Aparece en tu cola de soporte, seis semanas despu&#233;s.</p><p>---</p><h2><strong>La Frase Final</strong></h2><p>Construir agentes que sobrevivan a producci&#243;n no es construir agentes que no fallen. Es construir agentes que <strong>detecten, clasifiquen y se recuperen</strong> de forma distinta seg&#250;n la fase en la que est&#225;n.</p><p>La m&#225;quina de recuperaci&#243;n &#8212; clasificador h&#237;brido, handlers por fase, decorator, checkpointing, telemetr&#237;a &#8212; no es un afterthought. Es el feature de primer orden que separa una demo impresionante de un agente que aguanta el turno de noche de un s&#225;bado.</p><p>Tu modelo es commodity. Tu capa de clasificaci&#243;n y recuperaci&#243;n es tu ventaja.</p><p><strong>*Construye esa capa como si tu agente fuera a fallar en el peor momento posible. Porque lo har&#225;. Y la diferencia entre un incidente y un desastre es lo que pasa en los primeros 300 milisegundos despu&#233;s del fallo.</strong> *</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/error-recovery-ai-agents-2026-recuperacion-autonoma-20260826?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item><item><title><![CDATA[El 80% de los SaaS Monta sus Planes de Precios Sin Mirar ni un Dato — y No es un Problema de Números]]></title><description><![CDATA[El 80% de los SaaS fija sus tiers sin datos reales de uso. Descubre por qu&#233; el pricing no es un problema de n&#250;meros y c&#243;mo instrumentar el producto antes de tocar una cifra.]]></description><link>https://newsletter.brianmenagomez.com/p/el-80-de-los-saas-monta-sus-planes</link><guid isPermaLink="false">https://newsletter.brianmenagomez.com/p/el-80-de-los-saas-monta-sus-planes</guid><dc:creator><![CDATA[Brian Mena Gómez]]></dc:creator><pubDate>Wed, 26 Aug 2026 07:00:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/184a358d-77cd-4312-80a6-4807ce0dafbb_1080x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>El 80% de los SaaS Monta sus Planes de Precios Sin Mirar ni un Dato &#8212; y No es un Problema de N&#250;meros</h2><p>Crees que el pricing de tu SaaS es un problema de n&#250;meros. Que si comparas a la competencia, aplicas un margen razonable y encuentras "el punto de precio correcto", la conversi&#243;n despega.</p><p><strong>*Te has equivocado de diagn&#243;stico.</strong>*</p><p>El 80% de los SaaS estructura sus planes de precios sin datos reales de uso. Y luego se pregunta por qu&#233; no convierte.</p><p>No es un problema matem&#225;tico. Es un problema estructural. La mayor&#237;a de los "errores de pricing" no son malos c&#225;lculos &#8212; son <strong>apuestas a ciegas</strong> disfrazadas de decisi&#243;n financiera. Mientras sigas tratando el problema como una ecuaci&#243;n de m&#225;rgenes y multiplicadores, estar&#225;s puliendo una cifra que nunca tendr&#225; el poder que le atribuyes, porque fue parida sin ninguna conexi&#243;n con la realidad de tu producto.</p><p>---</p><h2>El Precio No Es el Problema. La Falta de Observaci&#243;n S&#237;.</h2><p>Antes de tocar una sola cifra, tu producto ya est&#225; hablando.</p><p>El 80% de las empresas define sus tarifas sin mirar el comportamiento de sus clientes. Sin saber qu&#233; features usan, con qu&#233; intensidad, ni qu&#233; patrones correlacionan con retenci&#243;n. Es el equivalente a un restaurante que fija el men&#250; seg&#250;n el precio de los ingredientes en el mercado, ignorando por completo lo que sus clientes realmente piden. Puede que el cordero est&#233; barato esta temporada, pero si tu clientela viene buscando el pescado, tendr&#225;s un men&#250; impecablemente razonado&#8230; y una sala vac&#237;a.</p><p>La gravedad no es puntual. Es sist&#233;mica. No es que un 20% tenga datos perfectos y otro 20% parciales &#8212; es que <strong>cuatro de cada cinco deciden con cero evidencia</strong>. Cuando ese es el punto de partida, cualquier proceso de optimizaci&#243;n posterior es optimizar sobre ruido. Es como calibrar una balanza que nadie ha comprobado: puedes ajustar los contrapesos todo lo que quieras, pero la medida de base sigue siendo falsa.</p><p>El problema m&#225;s inc&#243;modo: el pricing basado en coste o en competidores es un enfoque <strong>desde arriba</strong>. Proyectas un precio a partir de inputs que ya puedes ver &#8212; tus costes, los precios ajenos &#8212; como si el valor que entregas fuera una constante conocida.</p><p>No lo es. El valor <strong>se descubre desde abajo</strong>, leyendo las se&#241;ales que tus clientes emiten con cada clic, cada feature adoptada, cada upgrade o cancelaci&#243;n. Y para leer esas se&#241;ales necesitas un sistema de observaci&#243;n, no una intuici&#243;n.</p><p>Detente un momento y piensa en esto: tu producto lleva meses, quiz&#225; a&#241;os, funcionando. Cada d&#237;a, decenas o cientos de usuarios interact&#250;an con &#233;l de formas que revelan exactamente qu&#233; valoran y qu&#233; ignoran. Esas se&#241;ales existen. El problema no es que no est&#233;n ah&#237; &#8212; es que <strong>no las est&#225;s registrando</strong>. Los datos est&#225;n emiti&#233;ndose en este mismo instante, y tu equipo no tiene antena para recibirlos.</p><p>---</p><h2>Por Qu&#233; el Enfoque Convencional Te Lleva a la Ruina</h2><p>Mira esto con honestidad:</p><p>&#10060; <strong>Pricing desde arriba (el fracaso convencional):</strong> miras a la competencia, pones un precio parecido, inventas tres tiers con recuentos de features m&#225;s o menos a ojo, y rezas.</p><p>&#9989; <strong>Pricing desde abajo (el enfoque que funciona):</strong> instrumentas el uso, observas qu&#233; features capturan valor real, agrupas clientes por comportamiento y dejas que los l&#237;mites de cada tier se revelen solos.</p><p>La segunda opci&#243;n casi nadie la hace. El 80% parte de cero datos &#8212; as&#237; que <strong>cualquier se&#241;al direccional ya es una mejora sobre el statu quo</strong>. No necesitas un espectacular sistema de anal&#237;tica empresarial. Necesitas veinte minutos de trabajo para instrumentar dos o tres eventos y, a partir de ah&#237;, empezar a ver patrones que tus competidores ni siquiera sospechan que existen.</p><p>Esto es exactamente lo que est&#225; cambiando el panorama de las plataformas tech m&#225;s grandes. Cuando una empresa con el alcance de Meta afirma que los modelos de lenguaje le est&#225;n permitiendo "acelerar el desarrollo de productos" y "entregar mejores resultados para las empresas", lo que est&#225; describiendo &#8212; en el fondo &#8212; es una capacidad de observar el comportamiento de sus usuarios a una escala y velocidad que antes era imposible. Los LLM les permiten entender <em>qu&#233; contenido es realmente</em>, generar mejores datos de entrenamiento y detectar tendencias sin intervenci&#243;n humana. Esa es la misma filosof&#237;a aplicada a escala industrial: <strong>decidir desde la observaci&#243;n, no desde la intuici&#243;n</strong>.</p><p>Pensemos en el anchoring. La sabidur&#237;a convencional dice que el tier intermedio enmarca la percepci&#243;n de los dem&#225;s. Cierto a nivel psicol&#243;gico. Pero aqu&#237; viene el giro: <strong>son los datos los que deciden d&#243;nde cae el ancla</strong>, no tu intuici&#243;n.</p><p>Con datos de uso, puedes colocar el ancla donde se asienta el mayor cluster de power users &#8212; el segmento cuyo comportamiento ya se&#241;ala el mayor valor percibido. El ancla deja de ser una corazonada y se convierte en <strong>un reflejo de la demanda real</strong>. Ya no preguntas "&#191;d&#243;nde deber&#237;a estar el precio psicol&#243;gicamente atractivo?", sino "&#191;d&#243;nde est&#225; el valor que mis clientes ya est&#225;n consumiendo?". La respuesta a la segunda pregunta es infinitamente m&#225;s potente en una conversaci&#243;n comercial.</p><p>---</p><h2>El Feature Gating es Donde los Datos Rinden M&#225;s</h2><p>Aqu&#237; es donde el 80% que no trackea se equivoca de forma m&#225;s dolorosa.</p><p>La decisi&#243;n de qu&#233; features gatear y cu&#225;les dejar abiertas deber&#237;a ser la m&#225;s estrat&#233;gica de tu pricing. Y sin datos, es literalmente un cara o cruz:</p><ul><li><p>Gatear una feature <strong>de higiene</strong> &#8212; la necesaria para la activaci&#243;n b&#225;sica &#8212; genera churn. Si bloqueas lo que el usuario necesita para ver valor en el d&#237;a uno, te marchas. Has construido un producto que exige un compromiso inmediato sin dar nada a cambio en las primeras sesiones, y el resultado es una puerta de salida mucho m&#225;s ancha que la de entrada.</p></li><li><p>Gatear una feature <strong>de valor</strong> &#8212; la que usan intensamente las cuentas m&#225;s comprometidas &#8212; impulsa upgrades. Es la que convierte el free trial en pagador, porque genera el momento de fricci&#243;n deseado: el usuario *siente* el l&#237;mite precisamente porque ya ha experimentado el valor.</p></li></ul><p>Sin tracking de uso es <strong>imposible distinguir ambas</strong>. Solo con datos puedes saber qu&#233; features correlacionan con conversi&#243;n, cu&#225;les con retenci&#243;n y cu&#225;les son aspiracionales pero nunca se usan. Las features aspiracionales son especialmente traicioneras: ocupan espacio en tu tier m&#225;s caro, hacen el plan parecer "completo", pero nadie las toca. Est&#225;s inflando el valor percibido de un plan que nadie necesita y, de paso, empujando a tus usuarios ligeros hacia un abono que jam&#225;s aprovechar&#225;n &#8212; y que tarde o temprano cancelar&#225;n.</p><p>Por eso la secuencia correcta es data-first. Antes de reestructurar tu pricing, antes de mover una cifra, antes de decidir qu&#233; va detr&#225;s de qu&#233; muro:</p><p><strong>El tracking de uso es el Paso 1. Todo lo dem&#225;s es output de ese an&#225;lisis.</strong></p><p>No lo conviertas en un proyecto de tres meses con dashboard de Power BI. Hazlo m&#237;nimo, hazlo ma&#241;ana, hazlo con dos eventos. Lo que importa no es la sofisticaci&#243;n del sistema, sino <strong>empezar a acumular una serie temporal</strong> que puedas consultar cuando llegue la siguiente revisi&#243;n de precios.</p><p>---</p><h2>El Marco Data-First de Pricing: Instrumenta, Mide, Agrupa, Gatea</h2><p>Llamemos a esto el <strong>Marco Data-First de Pricing</strong>. Son cinco pasos, en ese orden, sin saltarte ninguno.</p><p>Ten en cuenta que no est&#225;s construyendo "el pricing perfecto" en una tarde. Est&#225;s construyendo un <strong>sistema de aprendizaje continuo</strong> donde cada iteraci&#243;n de precios se apoya en los datos de la anterior. La primera vez que lo apliques puede que solo tengas un par de meses de telemetr&#237;a &#8212; suficiente para dar un primer paso firme. Para la segunda o tercera revisi&#243;n, tendr&#225;s patrones estacionales, correlaciones de retenci&#243;n y clusters bien definidos.</p><h3>Paso 1: Instrumenta el tracking de uso ANTES de tocar ninguna cifra</h3><p>No hace falta telemetr&#237;a perfecta. Basta con definir tres o cuatro eventos n&#250;cleo que capturen valor real:</p><p>```javascript</p><p>// Eventos n&#250;cleo que definen el valor percibido</p><p>analytics.track('signup_completed', { plan: 'free', source: 'organic' });</p><p>analytics.track('feature_activated', { feature: 'reports', version: '1.4.2' });</p><p>analytics.track('value_milestone', { event: 'first_report_generated', time_to_value: 184 });</p><p>// El evento que correlaciona con retenci&#243;n real</p><p>analytics.track('session_intensity', {</p><p>frequency_days: 7,</p><p>heavy_usage_hours: 3.2,</p><p>core_features_used: ['reports', 'automation', 'export']</p><p>});</p><p>```</p><p>Estos eventos son tu sustrato. Sin ellos, cualquier decisi&#243;n de pricing es especulaci&#243;n. Con ellos, tienes la base para todo lo dem&#225;s.</p><p>F&#237;jate en el detalle del evento `value_milestone`: no trackeas "el usuario hizo clic en el bot&#243;n de exportar", sino "el usuario gener&#243; su primer informe". Son cosas distintas. La primera es una interacci&#243;n; la segunda es un <strong>hito de valor</strong>. Cuando dise&#241;as tus eventos, preg&#250;ntate siempre: &#191;esto mide lo que el usuario *hace<em> o lo que el usuario </em>logra*? Busca lo segundo.</p><p>Y no olvides el contexto. Un usuario que activa la feature `reports` en su primera sesi&#243;n y otro que la activa tras tres semanas de uso est&#225;n viviendo experiencias completamente distintas con tu producto. Tu tracking debe capturar ese contexto si quieres que los clusters revelen algo &#250;til: el <em>tiempo hasta el valor</em> (time-to-value) es uno de los predictores m&#225;s fuertes de retenci&#243;n que vas a encontrar.</p><h3>Paso 2: Define el esquema de datos que necesitas recopilar</h3><p>Preg&#250;ntate qu&#233; quieres saber antes de fijar un precio:</p><ul><li><p>&#191;Qu&#233; features existen y qui&#233;n los usa?</p></li><li><p>&#191;Con qu&#233; intensidad y frecuencia se usan?</p></li><li><p>&#191;Qu&#233; patrones de uso correlacionan con retenci&#243;n a 90 d&#237;as?</p></li><li><p>&#191;Qu&#233; camino recorre un cliente desde activaci&#243;n hasta el momento de valor?</p></li></ul><p>No necesitas todas las respuestas de golpe. Necesitas la infraestructura para <strong>empezar a responderlas en la siguiente revisi&#243;n de precios</strong>.</p><p>Hay una distinci&#243;n importante que conviene trazar aqu&#237; entre tres tipos de se&#241;ales que vas a recopilar:</p><p><strong>Se&#241;ales de activaci&#243;n.</strong> Te dicen si un usuario nuevo est&#225; alcanzando el valor fundamental de tu producto. Son las m&#225;s urgentes de instrumentar, porque sin ellas no puedes distinguir entre "el usuario no ve valor" y "el usuario no encontr&#243; el bot&#243;n".</p><p><strong>Se&#241;ales de intensidad.</strong> Te dicen con qu&#233; profundidad usa tu producto alguien que ya est&#225; activado. Son las que alimentan tus clusters: frecuencia de sesi&#243;n, horas de uso, colaboradores involucrados, automatizaciones ejecutadas.</p><p><strong>Se&#241;ales de retenci&#243;n.</strong> Te dicen qu&#233; comportamientos (o qu&#233; features) predicen que un cliente siga contigo al cabo de tres, seis o doce meses. Son las que convierten tu gating de features en algo estrat&#233;gico: sabes qu&#233; proteger, qu&#233; exponer y qu&#233; sacrificar.</p><h3>Paso 3: Agrupa clientes por uso observado para encontrar los l&#237;mites naturales de cada tier</h3><p>No impongas recuentos arbitrarios de features. Esto es el coraz&#243;n del argumento:</p><p>```python</p><h1>Agrupaci&#243;n por cl&#250;ster de uso (pseudoc&#243;digo real)</h1><p>from sklearn.cluster import KMeans</p><p>usage_features = df[['features_activated', 'intensity_hours', 'collaborators', 'automations_run']]</p><p>clusters = KMeans(n_clusters=3, random_state=42).fit(usage_features)</p><h1>Los clusters te dicen D&#211;NDE caen los l&#237;mites naturales</h1><h1>Cluster 0: activaci&#243;n b&#225;sica, una feature, uso espor&#225;dico</h1><h1>Cluster 1: 3-4 features, uso regular, alg&#250;n caso de uso avanzado</h1><h1>Cluster 2: power users, 6+ features, intensidad alta diaria</h1><p>```</p><p>Esos l&#237;mites <strong>son tus tiers</strong>. No los inventas: los descubres. Los clusters de comportamiento te dicen d&#243;nde termina un plan y empieza el siguiente.</p><p>El criterio de elecci&#243;n del n&#250;mero de clusters no deber&#237;a ser cosm&#233;tico &#8212; "tres tiers se ven bien en la p&#225;gina de precios" &#8212; sino predictivo. Prueba con 2, 3, 4 y 5 clusters, y f&#237;jate cu&#225;l de ellos produce grupos con <strong>homogeneidad interna y diferencias significativas entre s&#237;</strong>. Un cluster que contiene tanto a usuarios diarios como a usuarios de fin de semana no es un cluster &#250;til: es un conjunto de etiquetas sin poder de segmentaci&#243;n.</p><p>Y aqu&#237; va un matiz importante: los clusters no deben fijarse &#250;nicamente por uso bruto, sino <strong>ponderando por retenci&#243;n</strong>. Un cluster con uso &#225;lgido pero churn del 60% a los 90 d&#237;as es un cluster de humo &#8212; no un tier al que debas apuntar. Es el que te dice que algo en tu propuesta de valor para ese segmento est&#225; roto. El pricing, record&#233;moslo, es un sistema de observaci&#243;n, y los clusters son sus term&#243;metros.</p><h3>Paso 4: Elige el tier ancla y aplica feature gating seg&#250;n el valor consumido y medido</h3><p>Con los clusters identificados, gatea <strong>las features de valor</strong> &#8212; las que usan intensamente los segmentos m&#225;s comprometidos &#8212; no las que m&#225;s te cuestan servir. Hay una trampa cl&#225;sica aqu&#237;, y conviene llamarla por su nombre: el feature gating basado en coste de infraestructura. Gateas lo que te resulta caro *a ti<em> servir, porque as&#237; "proteges margen". Es un comportamiento comprensible, pero est&#225;s protegiendo el margen equivocado: el coste que importa no es el tuyo, sino el valor percibido por el cliente</em>*. Un servidor que consume 0,02 c&#233;ntimos por petici&#243;n puede ser el coraz&#243;n del caso de uso de tus power users; si lo gateas mal, pierdes a todos.</p><p>El tier intermedio se convierte en tu ancla. Y con datos, su posici&#243;n ya no es una corazonada: es donde se sienta tu mayor cluster de usuarios que pagan y usan con intensidad. Esa es la definici&#243;n operativa del ancla perfecta: un segmento real, observable, medible &#8212; no un n&#250;mero redondo que te gusta.</p><h3>Paso 5: Trata la reestructuraci&#243;n como un experimento continuo, no una edici&#243;n anual</h3><p>Tras el lanzamiento, mide conversi&#243;n, adopci&#243;n de features y movimientos upgrade/downgrade. El pricing deja de ser una decisi&#243;n anual de finanzas y se convierte en <strong>un bucle de producto permanente</strong>.</p><p>Aqu&#237; es donde el marco conecta con lo que est&#225; ocurriendo en el ecosistema tech en general. La velocidad de iteraci&#243;n que permiten las nuevas herramientas &#8212; impulsadas por modelos de lenguaje que aceleran el desarrollo de producto, como describe Meta en su propia estrategia &#8212; significa que el pricing debe tener la misma agilidad que el producto al que sirve. Si tu producto puede evolucionar en semanas gracias a la IA, y tu pricing solo se revisa una vez al a&#241;o "porque es lo que se hace", tienes un desajuste estructural: est&#225;s fijando el precio de algo que ni siquiera es el mismo producto que tendr&#225;s dentro de seis meses.</p><p>Cada cambio futuro de precios deber&#237;a ir precedido de una revisi&#243;n de datos. El pricing pasa a ser un experimento en marcha, no una hoja de c&#225;lculo cerrada. Y como en todo experimento, hay que predefinir cu&#225;les ser&#225;n los criterios de &#233;xito y fracaso <em>antes</em> de lanzarlo: "si la conversi&#243;n free&#8594;paid no sube un 2% en 60 d&#237;as, revertimos". Eso te protege de la tentaci&#243;n de justificar resultados mediocres con narrativas post-hoc.</p><p>---</p><h2>Las Objeciones Que Te Est&#225;s Haciendo Ahora Mismo</h2><p><strong>"Somos cuatro, no tenemos infraestructura de anal&#237;tica."</strong> No hace falta. Trackea dos o tres eventos n&#250;cleo antes de la siguiente revisi&#243;n de precios. Dado que el 80% parte de cero datos, cualquier se&#241;al direccional ya te coloca por delante de la mayor&#237;a. Adem&#225;s, el coste de oportunidad de esta objeci&#243;n es enorme: cada semana sin tracking es una semana de decisiones tomadas a ciegas. Si tu producto tiene un m&#237;nimo de tracci&#243;n, los datos que est&#225;s ignorando valen m&#225;s que cualquier consultor de pricing que puedas contratar.</p><p><strong>"Anclarme en competidores es m&#225;s seguro."</strong> Anclarse en competidores asume que tu perfil de uso y tu entrega de valor coinciden con los suyos. Eso rara vez es cierto. Tu producto tiene features propias, flujos de activaci&#243;n distintos y un p&#250;blico que lo usa de maneras que el competidor ni imagina. Los datos de uso te dan la licencia para desviarte <strong>con fundamento</strong>, y para defender esa desviaci&#243;n en cada conversaci&#243;n comercial con evidencia observada, no con sensaciones. "Nuestros clientes de mayor retenci&#243;n usan la automatizaci&#243;n cuatro veces por semana" pesa infinitamente m&#225;s que "nuestro competidor cobra 49 &#8364;".</p><p><strong>"Reestructurar tiers va a enfadar a los clientes existentes."</strong> Se resuelve con grandfathering y rutas de migraci&#243;n. Y sobre todo: los datos de uso te permiten identificar qu&#233; clientes existentes <strong>consumen de m&#225;s o de menos</strong> antes de forzar ning&#250;n movimiento. Un cambio basado en datos es infinitamente m&#225;s f&#225;cil de comunicar, justificar y defender ante el cliente que uno salido de una intuici&#243;n. El cliente puede no estar de acuerdo con el nuevo precio, pero le hablas con evidencia: "hemos visto que tu cuenta consume el equivalente a tres planes Enterprise; te ofrecemos esta ruta de migraci&#243;n". Eso es otra conversaci&#243;n.</p><p>---</p><h2>La Inversi&#243;n Real del Pricing</h2><p>La pregunta correcta nunca ha sido "&#191;cu&#225;nto cobramos?". Es <strong>"&#191;qu&#233; sabemos de c&#243;mo usan esto nuestros clientes?"</strong>.</p><p>Porque el pricing no es una decisi&#243;n de entrada tomada en una hoja de c&#225;lculo. Es un output de la anal&#237;tica de uso. Y la estructura de tus tiers no se impone desde arriba con multiplicadores &#8212; <strong>se descubre desde abajo con se&#241;ales observables</strong>.</p><p>Lo mismo que est&#225; pasando en el desarrollo de producto &#8212; donde las empresas que observan el comportamiento de sus usuarios y dejan que los datos gu&#237;en la iteraci&#243;n est&#225;n ganando la partida a las que construyen desde la intuici&#243;n &#8212; est&#225; pasando en el pricing. Es el mismo desplazamiento de mentalidad, aplicado a una funci&#243;n que hist&#243;ricamente se ha tratado como un problema de finanzas en lugar de un problema de producto.</p><p>Mientras el 80% pregunta cu&#225;nto cobrar, el 20% que instrumenta, mide y observa acumula una ventaja que ninguna hoja de c&#225;lculo puede replicar.</p><p>El pricing no es un n&#250;mero. Es un sistema de observaci&#243;n que a&#250;n no has construido.</p><p>Empieza por ah&#237;. Antes de tocar una sola cifra.</p><div><hr></div><p>Lee el art&#237;culo completo en <a href="https://brianmenagomez.com/blog/pricing-saas-sin-datos-fracasa-estructura-tiers-20260826?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>M&#225;s sobre mis servicios en <a href="https://www.brianmenagomez.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=crosslink">brianmenagomez.com</a></p><p>Herramientas: <a href="https://conversoriaecnae.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Conversor IAE CNAE</a> &#183; <a href="https://gestoriascercademi.com?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Gestorias cerca de ti</a> &#183; <a href="https://modulosirpf.es?utm_source=brianmenagomez&amp;utm_medium=substack&amp;utm_campaign=ecosystem">Calculadora IRPF</a></p>]]></content:encoded></item></channel></rss>