Optimización de procesos · Lima, Perú

El proceso que te cuesta dinero no falla.
Se hace a mano.

Encuentro el trámite manual que frena tu operación —cotizar, dar seguimiento, controlar precios— y construyo la herramienta que lo reemplaza. No vendo software: vendo el diagnóstico de dónde se te está yendo el tiempo, y después lo arreglo.

Diagnóstico con tus datos · Se ve funcionando antes de pagar infraestructura · 2026
«Nadie ve el proceso que cuesta dinero, porque parece trabajo.»
Doce personas ocupadas no son doce personas produciendo.

Un caso: la tienda que vendía sin carrito

Un fabricante peruano de envases para restaurantes y cafeterías. Ya tenían tienda en línea y llevaban años vendiendo. El encargo era «mejorar la tienda».

El diagnóstico fue que la tienda no era el problema. Al revisar su catálogo real aparecieron 498 variantes de precio, y la mitad eran producto personalizado: con el logo del cliente impreso. El sobreprecio por esa impresión no era un porcentaje fijo — iba de +9 % a +163 %, con mediana de +28 %, según producto y cantidad.

Cada venta real era un cálculo de producto × tamaño × cantidad × con o sin impresión × descuento × flete al destino. Un carrito no resuelve eso. Por eso todo terminaba cotizándose a mano, por WhatsApp, una por una.

La evidencia del costo no la puse yo. Estaba en su propio chat con un cliente:

«Todo bien con eso, pero te desapareces cuando te consulto algo y no hay respuestas.»

Lo que encontré y ellos no sabían

  • Sus precios ya incluían IGV, y lo decían sus propios Términos y Condiciones. El cálculo inicial lo sumaba encima: de no detectarse, cada cotización habría salido 18 % más cara que su propia web.
  • Una variante estaba publicada en S/ 0.00 en su tienda. Llevaba ahí sin que nadie lo notara.
  • Su vendedor no podía saber si el cliente que iba a facturar seguía activo y habido en SUNAT sin salir a buscarlo a mano.

Qué se construyó

Un cotizador que recorre las 498 variantes y calcula por millar, con o sin logo, con descuento por línea y global, flete e IGV desagregado. Con roles —el vendedor cotiza pero no ve costos ni toca precios base—, PDF formal con su identidad, historial de cada cambio de precio con fecha y responsable, y embudo de cotizaciones con su tasa de cierre.

Y el autocompletado por RUC: escribes once dígitos y salen razón social y ciudad, con aviso si la empresa está de baja o no habida. Detrás hay 2,9 millones de empresas en un archivo de ancho fijo, resueltas con búsqueda binaria en disco: 22 saltos, 0 MB de memoria, sin base de datos. Instantáneo en una laptop cualquiera.

La decisión que más importó, y no es técnica

La primera versión corre en local. Sin nube, sin servidores, sin cuota mensual. El motivo: que lo vean funcionando con sus datos reales antes de gastar un sol en infraestructura. Si convence, se sube; si no, no se gastó nada.

El caso va sin nombre a propósito. Los números son los reales; la identidad del cliente es suya y no mía para publicarla.

La bitácora

Cada entrada tiene el síntoma, la causa y la regla que queda. Pulsa para abrir.

Antes de descomprimir un archivo subido por alguien de fuera, escribí una comprobación contra el ataque clásico: una entrada llamada ../../algo que escribe fuera de la carpeta de destino.

if unzip -l paquete.zip | grep -E '\.\./'; then
  echo "PELIGRO"; exit 1
fi
echo "rutas limpias"

Salió «rutas limpias». Y era mentira: unzip no estaba instalado en ese servidor. El comando falló, no escribió nada, grep no encontró nada, y la guardia concluyó que todo estaba bien.

Lo peor es la cara que pone: una comprobación que aprueba porque está rota parece diligencia. Nadie sospecha de algo que acaba de decirte que está todo en orden.

La regla

Una comprobación de seguridad tiene que fallar ruidosamente si su herramienta no está. Valida primero que la herramienta existe; solo entonces confía en lo que te diga.

La idea era simple: no lanzar una tarea pesada si ya hay otra corriendo.

pgrep -f 'procesar.js'   # encuentra "algo" aunque no corra nada

El problema es que pgrep -f busca en la línea de órdenes completa, y el propio shell que lanza la búsqueda lleva el texto buscado en la suya. Se encuentra a sí mismo. Si va dentro de una conexión remota o de una llamada desde código, el envoltorio también la lleva.

Costó tres tropiezos la misma noche: un vigilante bloqueado eternamente, comprobaciones manuales que juraban que un proceso muerto seguía vivo, y una guardia que abortó por un proceso inexistente.

pgrep -f '[p]rocesar\.js'   # casa con el nombre, no consigo mismo
La regla

Los corchetes rompen la autorreferencia: [p]rocesar encuentra «procesar», pero el texto literal no se encuentra a sí mismo. Y de nuevo: la guardia que se bloquea parece que protege.

Una página de captación, publicada y con campaña activa. El formulario hacía exactamente esto:

alert('¡Gracias! Te contactaremos pronto');

Y nada más. Ni una petición, ni un guardado, ni un correo. La persona rellenaba sus datos, leía que la iban a llamar, y ese contacto no existía en ningún sitio.

No hubo ningún error en consola. No hubo alerta. La campaña gastaba con normalidad y las métricas de la plataforma de anuncios mostraban clics felices. Desde fuera, todo funcionaba.

La regla

Un formulario no está probado hasta que ves la fila en la base de datos. «Se ve bien» y «salió el mensaje de gracias» no son pruebas: son el síntoma exacto de este fallo.

«Ese dominio ya no lo uso», dijo el dueño. Se le añadió un registro apuntando al servidor nuevo y el panel se quejó: duplicate record.

No era un capricho del panel. El dominio seguía sirviendo un sitio real, y ahora tenía dos direcciones. Cuando un nombre resuelve a dos IP, el navegador elige una al azar: la mitad de las visitas veían la web y la otra mitad un 404.

$ nslookup ejemplo.tld
Addresses:  216.198.79.1      <- el sitio de verdad
            157.180.116.214   <- el servidor nuevo, sin nada

Y una segunda capa: al comprobarlo, el resolutor público seguía devolviendo el registro viejo por caché. La verdad estaba en los servidores autoritativos, no en la respuesta rápida.

La regla

Antes de apuntar un dominio a un servidor, mira qué contesta hoy: un nslookup y un curl de diez segundos. Y para decisiones que no admiten reintento, pregunta al servidor autoritativo, no a la caché.

Un asistente conectado a datos de negocio consultaba las cifras mediante llamadas a funciones. Al cambiar de proveedor de modelo, el nuevo no soportaba esa capacidad.

No dio error. No avisó. Simplemente dejó de consultar y empezó a responder de memoria: cifras plausibles, bien redactadas, con el tono de siempre. Delante de un cliente.

Es el fallo más difícil de detectar de toda esta lista, porque el resultado parece mejor que un error: sale rápido y suena seguro.

La regla

Si una integración depende de una capacidad concreta del modelo, esa capacidad se declara y se verifica explícitamente. Nunca se deja que el sistema «elija». Un modelo adivinado no falla: miente.

Una base de contactos de empresas, construida durante semanas. La cobertura parecía excelente: la mayoría tenía teléfono.

Un verificador que solo cruzaba los datos consigo mismos, sin salir a internet, encontró esto en segundos:

9.262 empresas "con teléfono"
  4.055  tienen alguno propio          <- 44%
  2.530  solo números compartidos por 20+ empresas
  1.305  compartidos por 50+ empresas
el más repetido aparece en 142 empresas distintas

Eran centralitas de directorios, números de la agencia que les hizo la web, plantillas copiadas. Un contacto repetido entre cien empresas no es de ninguna.

La regla

Un porcentaje de cobertura no se valida solo. Hay que mirar el conjunto, no la fila. «Tiene teléfono» y «tiene su teléfono» son dos métricas distintas, y solo una sirve.

Un botón de una página pública redirigía usando el origen de la petición. En desarrollo funcionaba perfecto. En producción llevaba a una página muerta.

req.nextUrl.origin
// en local:       https://midominio.com   ✓
// tras un proxy:  http://localhost:3000   ✗

El servidor web recibe la petición en el puerto interno, así que eso es lo que el framework ve. La dirección pública viaja en una cabecera aparte que nadie miró.

Se descubrió después de que el enlace ya estuviera en correos enviados. El arreglo fue trivial; encontrarlo, no.

La regla

Lo que funciona en local no dice nada de cómo se comporta detrás de un proxy. Las rutas públicas se prueban contra producción, no con pruebas unitarias.

Dos archivos a medio escribir, olvidados en el directorio del servidor, daban errores de tipos al compilar. Como el despliegue compila el directorio de trabajo y no solo lo que viene del repositorio, cada despliegue fallaba y revertía.

Nadie se enteró. El repositorio estaba correcto, los comandos terminaban, y la comprobación de después miraba el identificador del último cambio — que durante el despliegue ya apunta al nuevo, y solo vuelve atrás al revertir.

La regla

Comprobar un despliegue mirando solo la versión no vale: hay que confirmar que el proceso se reinició y está sirviendo lo nuevo. Y los archivos sueltos no viven en el directorio que se compila.

Dos veces en un mismo día di por buena una comprobación que no probaba nada:

Una: busqué un fragmento de código en el buscador de la plataforma. Cero resultados. Conclusión: «no está subido a ningún sitio». La realidad: ese buscador no indexa repositorios privados. Lo correcto era listar el árbol por la interfaz de programación.

Dos: vi un contenedor marcado como Exited y anuncié que un servicio llevaba cinco días caído. Exited (0) es una salida limpia: estaba apagado a propósito, esperando una decisión.

Las dos veces se cayó al validar la herramienta, no al repetir la consulta.

La regla

Antes de concluir «no existe», pregúntate si la herramienta podía haberlo visto. El vacío tiene dos causas posibles: que no haya nada, o que no estés mirando donde crees.

Había respaldo diario, verificado, con rotación. Todo el mundo dormía tranquilo. Respaldaba la base de datos — y nada más.

Pero buena parte del trabajo no vivía en la base: eran archivos acumulados durante semanas en una carpeta del servidor. Si ese disco fallaba, se perdían enteros, y buena parte no se podía volver a generar.

El mismo agujero apareció tres veces con tres cosas distintas. Siempre igual: alguien monta un respaldo excelente para lo que tenía en mente ese día, y lo que llega después cae fuera sin que nadie lo revise.

La regla

Un respaldo cubre lo que le dijeron, no «los datos». Cada vez que aparece una fuente nueva, la pregunta es: ¿esto entra en alguna copia? Y el respaldo verifica que el archivo se puede abrir: uno que nadie ha abierto nunca no es un respaldo.

El método que queda

Diez fallos distintos, tres costumbres que los habrían pillado a casi todos.

Valida la herramienta antes que el resultado

Media lista son comprobaciones que aprobaron porque estaban rotas. Comprueba que el comando existe, que el buscador ve lo que buscas, que la consulta no está truncada.

Prueba contra producción

Proxies, dominios, certificados y formularios se comportan distinto fuera de tu máquina. Las pruebas locales no son mentira, pero tampoco son evidencia.

Escribe el fallo, no solo el arreglo

Con síntoma, causa y regla. Los errores que no se nombran se repiten: tres de esta lista son la misma forma con otra cara, y eso solo se ve al leerlos juntos.

Pregúntale al asistente

Hay un asistente abajo a la derecha que conoce estas notas. Pregúntale por un caso, por una regla, o descríbele un fallo tuyo a ver si se parece a alguno.

Si algo de esto te sonó

La señal suele ser una de estas tres: alguien de tu equipo hace todos los días una tarea repetitiva que nadie ha medido; un dato importante vive en la cabeza de una sola persona; o tienes una herramienta contratada que no se usa porque no encaja con cómo trabajan de verdad.

Lo primero no cuesta nada y no es una llamada de ventas: me cuentas cómo funciona hoy ese proceso y te digo si veo algo. Si no lo veo, te lo digo igual y no perdimos tiempo.

Escríbeme y cuéntame el proceso. Con dos o tres frases basta para saber si hay algo que mirar.

WhatsApp · +51 967 083 954

italojcruzsilva@gmail.com

🤖
AsistenteConoce las 10 notas
Hola. Conozco los diez casos de esta bitácora. Pregúntame por cualquiera, o cuéntame un fallo tuyo y te digo a cuál se parece.