El checkout, la pantalla donde el cliente paga, cobraba el mismo envío para una dirección a 1.4 km y para otra a 16 km. Era la tarifa más democrática de Lima: el que vive cerca invitaba el viaje del que vive lejos. Nadie en el equipo podía decir cuánto nos costaba llegar a cada dirección, porque la tarifa salió de un acuerdo viejo con el motorizado y nunca la comparamos contra un costo medido.
Un pedido local sale de la tienda con el motorizado y vuelve. El costo de ese viaje depende de la distancia y de la hora, porque el tráfico de Lima cambia durante el día, pero el cliente siempre veía el mismo número en el carrito. En la caja tampoco salta: el delivery entra como ingreso del pedido y el motorizado como gasto fijo del mes, dos líneas que nunca se cruzan.
Cobrar plano es como un micro que cobra el mismo pasaje por una cuadra que por toda la ruta: parece justo hasta que miras el taxímetro del taxi de al lado y ves desde qué paradero el negocio empezó a pagar el viaje. Mi primera teoría fue que el problema se limitaba a tres o cuatro distritos del borde. Me equivoqué.
13 de 18 distritos en rojo
Medimos 18 distritos desde la puerta de la tienda. En 13 la tarifa plana regular no cubre el costo del viaje, y los 5 que quedan en verde están todos en el radio corto. La pérdida crece casi en línea recta con la distancia: el equilibrio aparece alrededor de los 4 km, y en el distrito más caro la pérdida por entrega es dos veces y media el promedio de esos 13. La tarifa express, que cobra más por entregar el mismo día, estaba bien puesta en todos los distritos menos el más lejano.
Yo, que dije tres o cuatro distritos
No hay API de delivery, hay un app de taxi
En el país no existe una API pública de delivery, o sea un punto oficial para preguntarle a un sistema cuánto cuesta ir de un lugar a otro. Comparamos con la tarifa de un app de taxi, la referencia que cualquiera ve desde el celular: un servicio nuestro consulta el precio del viaje hacia cada dirección de entrega.
Mantenerlo en pie costó más que escribirlo. La consulta necesita una sesión activa, así que un cron, una tarea programada, la renueva cada 12 horas para que no caduque. Abrir un navegador desde cero en cada consulta es lento, así que un microservicio aparte mantiene el navegador abierto y guarda cada cotización 90 segundos en caché.
Los 9 segundos no eran nuestros
Medimos la misma cotización por los tres caminos: 9.2 s con el navegador en frío, 9.6 s con el navegador ya caliente y 0.002 s cuando la respuesta sale del caché. Esos 9 segundos los gasta el proveedor calculando su tarifa, al otro lado de la conexión. Dejamos el navegador caliente porque ya estaba hecho y no gastamos un minuto más ahí. La velocidad la compró el caché corto, y la cotización se pide en segundo plano mientras la persona termina de escribir la dirección, así que el formulario nunca queda bloqueado esperando al proveedor.
La misma ruta cambió 33% en el mismo día
Repetimos mediciones sobre una misma ruta y el precio llegó a variar 33% dentro del mismo día, porque la hora punta y la demanda del momento mueven la tarifa del app. El número de la mañana no sirve para la tarde, así que la cotización se captura al registrar la entrega y no se recalcula después.
Los precios los decidimos a mano
Pensamos en poner una fórmula por kilómetro y dejar que el checkout cobre lo que salga del cálculo. No lo hicimos: hay distritos donde conviene perder en el envío para ganar al cliente, y eso no lo decide un script. Entregamos la tabla de los 18 distritos, la brecha de cada uno y el punto de equilibrio.
Quedan dos límites: 18 distritos son una muestra y no el mapa completo de Lima, y la tarifa de un app de taxi es una referencia prestada del costo con motorizado propio. Alcanza para ver el orden de magnitud y dónde se cruza la línea.
Cotizar antes de prometer
El sistema cotiza el destino antes de que prometamos un precio plano. Medimos antes de volver a optimizar: creímos que el navegador caliente bajaría los 9 segundos y terminó 0.4 s más lento que el frío. La dirección a 16 km ya no viaja invitada, se registra con su costo de referencia al lado.
