La app propia de la tienda: canales protegidos para que el cliente siempre pueda contactar
Una tienda que vende con un bot de mensajería y una web depende de que ambos sigan accesibles para cada cliente. La app propia de la tienda reúne el catálogo, el pedido y la conversación en un solo sitio y encuentra sola el camino hasta la tienda.
El reto
La tienda ya vendía con un bot de Telegram, una mini app y una web, con un vendedor de IA y gestores que responden desde un mismo panel. Todo dependía de dos cosas que la tienda no controla: la aplicación de mensajería y una única ruta entre el móvil del cliente y el servidor. Cuando una de las dos deja de funcionar para una parte de los clientes, esos clientes ya no pueden abrir el catálogo, preguntar ni terminar un pedido, y la tienda ni siquiera ve lo que está perdiendo.
Hacía falta un canal propio: una app que el cliente instala una vez y que mantiene juntos el catálogo, el pedido y la conversación con la tienda, más una capa de conexión que siempre encuentra un camino que funciona y que el propietario ve y gestiona desde el panel.
Catálogo y compra en la app
La pestaña Catálogo es el escaparate de la propia tienda, el mismo de la web y de la mini app, abierto dentro de la aplicación. Búsqueda, filtros, fichas de producto y carrito funcionan como en la web, y un producto nuevo no exige tocar la app.
Al pagar, la página entrega el carrito a la app mediante un pequeño puente integrado. La app lo valida - como mucho 100 líneas, cantidades positivas y solo desde las páginas de la tienda, lo envía al servidor y el pedido sigue el mismo circuito que uno de la mini app, con los precios recalculados en el servidor. La página siempre recibe el resultado: si todo va bien, el carrito se vacía y la app pasa al chat, donde llega la confirmación; si hay un error, el cliente ve el motivo y el carrito se conserva.
Un chat que llega al mismo panel
La pestaña Chat es un chat nativo con la tienda. Para la tienda es un segundo canal de clientes junto a Telegram: la conversación aparece en el mismo panel, marcada como procedente de la app, y la atienden el mismo asistente de IA y los mismos gestores.
El cliente escribe, envía fotos de la galería o de la cámara - que se reducen en el propio móvil, graba notas de voz y comparte su ubicación, que sirve para encontrar el punto de recogida más cercano. Igual que en Telegram, los mensajes de la tienda pueden llevar botones para pedir la ubicación o abrir una página del catálogo. Si un gestor edita o borra un mensaje, también se ve en la app.
Los avisos no necesitan un servicio push aparte. Con el chat abierto, la app busca mensajes cada cinco segundos; en segundo plano, una comprobación programada cada 15 minutos muestra un aviso con las respuestas de la tienda sin leer.
Una cuenta sin contraseñas
Al abrirse por primera vez, la app crea una clave privada en el hardware seguro del teléfono, de donde no se puede copiar. Cada petición a la tienda va firmada con ella, y el servidor rechaza las que llegan sin firmar, alteradas o repetidas, así que nadie puede escribir a la tienda en nombre de un cliente.
No hay usuario ni contraseña. Registrarse es decisión del cliente en la pantalla de bienvenida: empezar una conversación nueva, traer la que tenía en otro móvil o ver primero el catálogo. Cada cuenta nueva recibe un código de recuperación, que se muestra una vez y queda guardado en los ajustes. Con él, la conversación y los pedidos pasan a un móvil nuevo y el antiguo pierde el acceso.
La app encuentra sola un canal que funciona
El cliente nunca elige un servidor. Antes de la primera petición, la app busca una ruta que responda, siempre en el mismo orden:
- el punto de entrada que funcionó la última vez;
- los puntos que la tienda asignó a ese móvil;
- los puntos de la última lista de canales firmada;
- una copia nueva de esa lista desde los espejos;
- una pasarela de reserva;
- un código que un gestor envía por otra vía y que se introduce a mano en los ajustes.
Cada candidato pasa una comprobación breve y se usa el primero que responde hasta que deja de funcionar. Si la búsqueda completa falla, la app indica que no hay conexión en lugar de hacer esperar al cliente y lo vuelve a intentar poco después. Todo viaja cifrado de extremo a extremo entre la app y la tienda: un punto de entrada solo reenvía los datos, no puede leerlos y no guarda nada.
Puntos de entrada intercambiables desde el panel
Los puntos de entrada son servidores pequeños e intercambiables que el propietario gestiona en la pantalla de red de los ajustes del panel. Hay tres grupos: puntos compartidos que conocen todas las instalaciones, puntos personales (tres por móvil, a partir del primer pedido pagado) y una pasarela de reserva que se prueba en último lugar. Ninguna instalación conoce la lista completa.
Añadir un punto es una fila en el panel; retirarlo lo saca de todas las listas a la vez. El panel también puede poner en marcha un punto nuevo por su cuenta a través de la API de una cuenta de hosting y mantener cada grupo entre un mínimo y un máximo, con un tope de seis servidores nuevos al día. Cada cambio en los puntos compartidos vuelve a publicar la lista de canales.
Una lista de canales firmada en varios espejos
Para el momento en que ninguna dirección conocida responde, la tienda publica una pequeña lista de canales en varios almacenamientos de archivos independientes. La lista va firmada con la clave de la tienda y la app comprueba la firma con la clave que lleva integrada: una lista alterada, caducada o más antigua que la que ya tiene se rechaza, de modo que un espejo puede servir la lista, pero nunca modificarla.
Los espejos se añaden desde el panel. En cada publicación, el servidor sube el archivo a cada espejo, lo vuelve a descargar y compara los bytes, y el resultado aparece junto a cada espejo. La lista de espejos viaja dentro del archivo firmado, así que un espejo nuevo llega a todas las apps instaladas con la siguiente actualización de la lista, sin publicar otra versión de la app.
Disponibilidad por red
Cada instalación informa a la tienda de qué puntos de entrada le han funcionado y cuáles no, junto con el nombre de su red móvil. Un punto solo se considera inaccesible cuando varios móviles distintos lo notifican en pocas horas y son menos los que lo ven funcionar, así que un problema en una red no lo retira para todos. Además, el servidor comprueba cada punto una vez por minuto.
La vista Red lo reúne todo en una pantalla: una tarjeta por punto de entrada con los móviles conectados a él, contadores de instalaciones en línea, en segundo plano y desconectadas con su curva de 30 días, un mapa de qué móvil pasa por qué punto y la lista de instalaciones con red, versión de la app y último contacto. Cada punto o instalación se abre en un panel lateral con todo lo que se sabe de él.
Stack tecnológico
- App: Kotlin, Jetpack Compose (Material 3), Android 8.0+
- Red y tareas en segundo plano: OkHttp, WorkManager
- Seguridad: Android Keystore (firmas P-256), Tink (verificación Ed25519 de la lista)
- Escaparate: web en Astro dentro de un WebView con puente de compra
- Backend y panel: Laravel 13, React + Inertia
- Espejos de la lista de canales: cualquier almacenamiento compatible con S3Resultado
La tienda tiene un canal que es suyo: los clientes ven el catálogo, compran y hablan con la tienda en una sola app, y sus mensajes llegan al mismo panel, a la misma IA y a los mismos gestores que el bot de Telegram. La app encuentra sola el camino hasta la tienda, el propietario añade y sustituye puntos de entrada desde el panel, la lista firmada en varios espejos hace que las rutas nuevas lleguen a todas las instalaciones y la vista de red muestra desde dónde se conectan los clientes y qué les funciona.
Estado: la app y la parte de servidor están desarrolladas y probadas en un emulador contra servidores de prueba locales, con pruebas instrumentadas en un móvil; todavía no se han desplegado ni publicado para los clientes.




