Caso de estudio · Producto en producción

Pekke: la lista de nacimiento multi-tienda y sin comisiones

Pekke es una plataforma española de listas de nacimiento, gratuita y sin comisiones, en producción en pekke.es. La construye y la mantiene Giflow Lab con Astro renderizado en servidor sobre Vercel, islas de Vue para lo interactivo y PostgreSQL sobre Supabase. Los padres reúnen regalos de cualquier tienda online y los invitados los reservan sin crear cuenta.

pekke.es/gonzalo
La lista de nacimiento de Gonzalo en pekke.es vista en escritorio: cabecera con el nombre del bebé y el mensaje de los padres, barra de filtros con 21 regalos —5 disponibles y 16 ya regalados— y una fila de tarjetas de producto de bugaboo.com, minicoton.com y lemur.baby, cada una con su precio y su botón de Regalar.
La misma lista abierta en un móvil: el nombre del bebé, el mensaje de los padres con la opción de leer más, un buscador con filtros y las tarjetas de regalo en dos columnas.
La misma página en escritorio y en móvil: pekke.es/gonzalo, capturas del 15 de agosto de 2026. Los 21 regalos, sus tiendas y sus precios llegan dentro del HTML que devuelve el servidor, antes de que el navegador ejecute nada.
Estado
En producción
Producto
Propio de Giflow Lab
Frontend
Astro SSR + islas de Vue
Datos
PostgreSQL con RLS
Infraestructura
Vercel + Edge Functions en Deno
Acceso
Abierto, sin registro

¿Qué problema resuelve Pekke?

Las plataformas de lista de nacimiento que operan en España repiten el mismo patrón: la lista vive dentro del catálogo de una tienda concreta y hay una comisión de por medio sobre el dinero que ponen los invitados. Las dos cosas van juntas, porque la comisión es lo que sostiene el catálogo cerrado.

Para la familia eso significa dos renuncias. La primera es que solo puede pedir lo que esa tienda vende, al precio que esa tienda pone, aunque la cuna que quiere esté en otro sitio. La segunda es que parte de lo que aportan sus invitados no llega en forma de regalo: cuando alguien pone 300 € para el carrito, un porcentaje se queda por el camino.

Pekke ataca las dos a la vez, y por eso son la misma decisión de producto: es multi-tienda(el regalo se añade pegando la URL del producto, esté donde esté), es gratuita para la familia y no procesa pagos. El invitado reserva en la lista y compra en la tienda oficial con sus métodos de siempre. Al no tocar el dinero, no hay comisión que descontar; el proyecto se financia con enlaces de afiliado que paga la tienda de su propio margen, sin encarecer el precio de quien compra.

Esa renuncia (no cobrar comisión ni intermediar el pago) es lo que convierte el reto en un problema de ingeniería y no de negocio: si el invitado no se registra y no paga dentro de la plataforma, todo lo que normalmente se resuelve con una cuenta de usuario y una pasarela hay que resolverlo de otra manera. El resto de esta página es cómo.

Arquitectura

Cinco decisiones y por qué se tomaron así

Ninguna de estas decisiones es una preferencia de estilo: cada una responde a un problema concreto que aparece al montar un producto público donde el usuario que más lo toca no tiene cuenta. Están contadas con el problema delante, que es la única forma de juzgar si la solución es buena.

Decisión 01

¿Por qué la lista pública se renderiza en el servidor y el panel no?

Una lista de nacimiento se comparte por WhatsApp y se abre desde el móvil de gente que nunca ha oído hablar de Pekke. Eso obliga a que el HTML llegue montado desde el servidor: si los regalos los pintara el navegador después de descargar y ejecutar JavaScript, ni el buscador vería el contenido al indexar, ni WhatsApp podría componer la tarjeta con título e imagen al pegar el enlace, porque el robot que la genera no ejecuta JavaScript. La tarjeta no es un detalle estético: es lo primero que ve la familia a la que le llega el enlace.

El panel de los padres es el caso contrario. Está detrás de un login, no hay nada que indexar y todo su valor está en la interacción. Se monta como isla client:only: el servidor no lo renderiza siquiera. Renderizarlo también en servidor solo añadiría latencia y el descuadre clásico entre lo que pinta el servidor y lo que pinta el cliente en una vista que depende de la sesión.

Astro permite tomar esa decisión página a página en lugar de para toda la aplicación, y ese es exactamente el motivo de haberlo elegido: la parte pública va renderizada en servidor y la privada va en el navegador, dentro del mismo proyecto y con el mismo código de dominio. Las piezas interactivas de la lista —los filtros, el diálogo de reserva— son islas de Vue que se hidratan sobre un HTML que ya es correcto sin ellas.

Compruébalo Abre el código fuente de pekke.es/gonzalo, una lista real: los 21 regalos, con su nombre, su tienda y su precio, están en el HTML de la primera respuesta.

Decisión 02

¿Cómo se reserva un regalo sin tener cuenta?

El invitado entra por un enlace, no tiene cuenta y no va a crearla. La operación «este regalo lo llevo yo» tiene que poder ejecutarla alguien anónimo, y ahí aparece el problema: si para eso le das permiso de escritura sobre la tabla de regalos, le has dado permiso para todo lo demás que se puede hacer con esa tabla —liberar la reserva de otro, cambiar un precio, tocar la lista de una familia distinta—.

Por eso la reserva no es un UPDATE lanzado desde el cliente. Todas las tablas tienen RLS (seguridad a nivel de fila) activa, que por defecto no deja escribir nada. Encima hay una única función SECURITY DEFINER: se ejecuta con los privilegios de su propietario, comprueba que el regalo existe y sigue disponible, y hace exactamente esa transición y ninguna otra. Lo que queda expuesto al público no es una tabla, es una operación con sus reglas dentro. Ampliar lo que puede hacer un invitado obliga a escribir otra función, no a aflojar un permiso.

Después, la reserva se confirma por correo. El invitado deja su email, recibe un enlace con un token y hasta que no lo abre la reserva no es definitiva: eso prueba que la dirección es suya y evita que alguien bloquee media lista con correos inventados. Si no confirma en 48 horas, la reserva caduca y el regalo vuelve a estar disponible. Sin esa caducidad, cada reserva abandonada dejaría un regalo bloqueado para siempre, que es la forma más silenciosa que tiene una lista de nacimiento de quedarse inservible.

Decisión 03

¿Cómo se importa un producto de cualquier tienda sin abrir un agujero?

Lo que hace multi-tienda a Pekke es que el usuario pega la URL de un producto y el servidor va a buscarla y extrae nombre, precio e imagen. Un servidor que descarga URLs dictadas por un desconocido es la definición de un SSRF: si no se controla, cualquiera puede pedirle que se conecte a direcciones internas —127.0.0.1, el rango privado de la red, el endpoint de metadatos del proveedor de nube— y usarlo como proxy hacia dentro de la infraestructura.

La comprobación intuitiva es mirar el nombre de dominio y rechazar los sospechosos. No sirve, porque quien controla el dominio controla también su DNS: el nombre pasa el filtro y, cuando el cliente HTTP lo resuelve otra vez para conectarse, esa segunda resolución devuelve 127.0.0.1. Entre la comprobación y la conexión ha cambiado la respuesta. Eso es DNS rebinding, y contra él una validación estática del hostname no hace nada.

Pekke resuelve el DNS primero, valida las direcciones IP obtenidas contra los rangos de loopback, privados y de enlace local, y lanza la petición contra la dirección ya validada. Se comprueba y se conecta sobre la misma resolución, así que no queda hueco entre una cosa y la otra.

Decisión 04

¿Cómo se frena el abuso si los usuarios no están identificados?

Importar productos y reservar regalos son operaciones abiertas, así que el límite hay que ponerlo por IP. Y la IP hay que sacarla de la cabecera x-forwarded-for, que es una lista y tiene una trampa conocida: el navegador puede enviarla ya rellena, y cada proxy por el que pasa la petición añade al final la IP real de quien se conectó a él. Los primeros valores los ha escrito el cliente y puede inventárselos; el último lo ha escrito nuestra propia infraestructura. Un limitador que lea el primero se desactiva solo: basta con mandar una IP falsa distinta en cada petición para no alcanzar nunca el límite. Pekke lee el último segmento.

Los limitadores fallan abiertos, y es una decisión consciente con su contrapartida escrita: si el almacén que lleva la cuenta no responde, la petición pasa en lugar de bloquearse. Un limitador está para encarecer el abuso, no para convertirse en un punto único de fallo. Preferimos absorber un pico de peticiones raras antes que dejar a una familia entera sin poder reservar porque un contador está caído.

Decisión 05

¿Qué corre fuera del servidor web y por qué?

Hay trabajo que no debe vivir en el proceso que sirve las páginas: mandar correos, ir a buscar los datos de una tienda, reaccionar a un cambio en la base de datos. En Pekke eso son Edge Functions escritas en Deno y desplegadas junto a la base de datos. Deno exige permisos explícitos de red y de entorno, las claves de servicio se quedan ahí y nunca se acercan al navegador, y una tarea lenta —una tienda que tarda en responder— no ocupa un hueco del servidor que atiende a los visitantes.

Algunas de esas funciones las dispara la propia base de datos: cuando cambia una fila, un webhook llama a la función que corresponde. Ese endpoint está publicado en internet como cualquier otro, así que cada llamada llega con una cabecera secreta que la función verifica antes de hacer nada. Sin esa comprobación, quien diera con la URL podría fabricar eventos que la base de datos nunca emitió y provocar, por ejemplo, una tanda de correos de confirmación a gente que no ha reservado nada.

¿Qué resultados se pueden comprobar?

En esta página no hay cifras de usuarios ni de listas creadas. Un número de uso que el lector no puede verificar vale exactamente lo que valga la palabra de quien lo escribe, y en una web de una empresa de software eso es poco. Cuando haya datos de tracción que se puedan auditar, estarán aquí con su fuente.

Lo que sí es comprobable es esto, y se tarda cinco minutos en hacerlo:

Está en producción y abierto

No hay demo grabada ni capturas de pantalla: pekke.es/demo es una lista real y completa, navegable sin registro, con los filtros y el flujo de reserva funcionando.

El HTML llega renderizado

En el código fuente de pekke.es/gonzalo están los 21 regalos con su nombre, su tienda y su precio. No es un esqueleto que después pide los datos: es la respuesta del servidor.

Tiempos medidos, no prometidos

Medido con curl desde España el 15 de agosto de 2026: la lista de ejemplo responde entre 0,22 s y 0,28 s hasta el primer byte, y una lista real con 21 regalos entre 0,78 s y 1,2 s, porque se renderiza contra la base de datos en cada visita. En ambos casos el HTML llega entero: no hay una segunda petición para traer los regalos.

Multi-tienda de verdad

En una lista real conviven productos de bugaboo.com, minicoton.com y lemur.baby, además de los de Amazon o El Corte Inglés. Que aparezcan tiendas pequeñas es justo lo que ningún catálogo cerrado puede ofrecer.

Sin comisión y sin pagos

El dinero no pasa por Pekke en ningún momento: el invitado compra en la tienda y el regalo llega entero. Está explicado, con el modelo de ingresos incluido, en la página «Sobre Pekke».

Lo mantiene quien lo construyó

Pekke es un producto de Giflow Lab (nombre comercial de Giflow Systems, S.L., NIF B26789784), que lo desarrolla, lo opera y contesta el soporte.

¿Qué dice esto si estás pensando en encargar software?

Pekke es un producto propio, no un encargo de cliente, y por eso podemos contarlo entero: el código, las decisiones y también las contrapartidas que asumimos. Es el mismo trabajo que hacemos por encargo, con la diferencia de que aquí puedes abrir el resultado y juzgarlo tú.

Un producto en producción con reservas anónimas, importación desde tiendas de terceros y correo transaccional tiene la misma forma que la mayoría del software de gestión que construimos para empresas: usuarios con permisos distintos, datos que entran de fuera y no son de fiar, y operaciones que no pueden ejecutarse dos veces. Las decisiones que acabas de leer son las que tomamos también cuando el producto es el tuyo.

El producto, abierto

No hace falta que nos creas: entra, crea una lista y mira cómo reserva un invitado. Está abierto y es gratis.

Sesión de viabilidad

Cuéntanos qué necesita
tu empresa y te decimos si compensa

Cuéntanos qué necesita tu empresa. Te decimos si tiene sentido construirlo, qué costaría y en cuánto tiempo.

Solicitud de sesión · Giflow Lab

Respondemos en menos de 24h con disponibilidad de agenda