Qué resuelve
Quien revende necesita responder dos preguntas antes de comprar: dónde está más barato de verdad —contando envío, tiempo y riesgo— y a cuánto tiene que vender para ganar lo que quiere ganar.
Las dos parecen aritmética y ninguna lo es. La primera exige decidir si dos publicaciones de plataformas distintas son el mismo producto. La segunda exige despejar un precio del que dependen las comisiones que se le restan.
Nueve fuentes, un formato
Cada plataforma responde distinto. Un adaptador por plataforma, con su propio traductor probado.
El mismo producto
Código de barras exacto primero; parecido de nombre después. Y nunca se fusiona sin que alguien confirme.
Puntaje y explicación
Cuatro componentes ponderados, y una explicación por reglas que además dice la contra.
El precio despejado
Fórmula cerrada para el precio que logra el margen deseado, con el caso imposible detectado.
Nueve plataformas, un formato
Cada plataforma tiene su propia API, su propio nombre para cada campo y su propia idea de qué es un precio. Buscar en todas a la vez exige que todas terminen hablando igual.
La búsqueda golpea todas las plataformas en paralelo, sobre APIs externas que fallan, tardan y limitan peticiones. Por eso el sistema tiene cola de trabajos, limitación de tasa y caché de búsqueda como piezas propias, no como parches: la lentitud de un tercero no puede ser la lentitud del producto.
Las credenciales de cada conexión se guardan cifradas, y el acceso a la cuenta admite segundo factor con códigos de recuperación.
Cuándo dos ofertas son lo mismo
Comparar precios exige antes decidir qué se está comparando. Es el problema difícil del sistema y se resuelve en dos pasos, de más fuerte a más débil.
Una coincidencia detectada no fusiona nada: se crea en estado sugerida, para revisión humana.
Fusionar automáticamente por parecido de nombre haría que dos productos distintos —dos capacidades del mismo modelo, dos colores con precios muy separados— aparecieran como uno solo, y el comparador recomendaría el barato creyendo que es el mismo. El error no se vería: se vería como una oferta muy buena.
Un detalle de implementación que evita un problema real: el par se ordena antes de guardarse, para que la coincidencia entre A y B no se guarde dos veces como (A,B) y (B,A). La restricción de unicidad de la tabla solo funciona si el par tiene un orden canónico.
El puntaje
Una vez agrupadas las ofertas equivalentes, hay que ordenarlas. El puntaje es de 0 a 100 y se compone de cuatro señales ponderadas.
| Componente | Cómo se calcula | Por qué así |
|---|---|---|
| Precio | Normalización invertida sobre el costo total: precio + envío | Comparar solo el precio premia al que cobra el envío aparte |
| Entrega | Normalización invertida sobre los días de entrega | Para quien revende, llegar tarde tiene costo |
| Reputación | Calificación llevada a escala 0-100; sin calificación, 50 | Un vendedor sin historial no es malo ni bueno: es desconocido |
| Riesgo | Puntaje compuesto por señales, entre ellas la entrega muy lenta | Hay costos que no aparecen en el precio |
La normalización es relativa al grupo, no absoluta. Un precio no es «bueno» en el vacío: es bueno comparado con las otras ofertas del mismo producto en ese momento. Por eso el mejor del grupo obtiene el máximo aunque en términos absolutos sea caro — que es exactamente la información que quien compara necesita.
Sin calificación se asigna 50, no 0. Poner cero castigaría al vendedor nuevo como si tuviera mala reputación, cuando lo que tiene es ninguna. Poner cien lo premiaría igual que al mejor. El valor neutro es la única lectura honesta de la ausencia de dato.
Las entradas se validan antes de puntuar: un costo de envío o unos días de entrega que no sean números finitos y no negativos detienen el cálculo con un error que dice qué oferta y qué campo, en vez de propagar un valor inválido hasta un puntaje que parecerá correcto.
La recomendación explicada
El comparador no devuelve solo un ganador: devuelve por qué. Y esa explicación se genera por reglas, no con un modelo de lenguaje.
Un modelo redactaría explicaciones más fluidas, y de vez en cuando afirmaría una cifra que no sale de los datos. Aquí cada razón es una comparación entre dos números que el sistema ya calculó: la explicación no puede decir algo que el puntaje no diga.
Y la contra es deliberada. Un comparador que solo enumera virtudes de su recomendación deja de ser un comparador y pasa a ser publicidad. Reconocer una desventaja frente a la alternativa es lo que hace que el usuario pueda decidir en contra con criterio.
Las etiquetas automáticas del comparador se asignan con una función pura que no muta la entrada: devuelve copias en el mismo orden. Es lo que permite recalcularlas en cualquier momento sin que el resultado dependa de cuántas veces se pidió.
El precio que alcanza el margen
La pregunta del revendedor no es «cuánto gano si vendo a este precio», sino «a cuánto vendo para ganar esto». Y esa es más difícil, porque las comisiones dependen del precio que se busca.
El despeje
Se busca el precio P tal que la utilidad neta sea el margen deseado sobre ese mismo precio. Con f las comisiones porcentuales, t la tasa de impuesto, d el margen deseado, C el costo unitario más publicidad y F la comisión fija:
Si el denominador es cero o negativo, las comisiones, los impuestos y el margen deseado consumen el 100 % o más del precio: no existe ningún precio que lo logre. El cálculo no devuelve un número enorme ni infinito — lanza un error que lo dice.
Es el caso que un revendedor necesita ver: no es que tenga que subir el precio, es que ese margen no se puede alcanzar con esas comisiones.
Una excepción documentada
El retorno sobre la inversión no está definido cuando la inversión por unidad es cero. En vez de lanzar, devuelve cero por decisión explícita: la interfaz recalcula en vivo mientras el usuario teclea, y no puede romperse en el instante en que el campo de costo está vacío.
El precio sugerido se redondea hacia arriba a la centena: hacia abajo daría un precio que no alcanza el margen pedido, que es justo lo que se estaba calculando.
Arquitectura y verificación
Organizado por módulos de dominio: veinticuatro, cada uno con su lógica, sus consultas y sus acciones.
Dónde están las pruebas
Las 37 suites no están repartidas por igual, y esa concentración es deliberada:
| Zona | Qué se prueba |
|---|---|
| Los nueve traductores | Que cada plataforma se convierta bien al formato común. Es donde entra lo que no controlamos |
| Comparador | Puntaje, etiquetas y explicación |
| Rentabilidad | El despeje y sus casos límite |
| Facturación | Planes y emisión |
| Seguridad | Cifrado y códigos de recuperación |
Dos trabajadores en segundo plano completan el sistema: uno sincroniza los catálogos conectados y otro evalúa las alertas de precio. Sacarlos del ciclo de petición es lo que permite que una búsqueda no espere a que nueve plataformas contesten.