Reveni Labs

Reveni Labs · una de nuestras apps

Tu clienta arma su lista de regalos. Sus invitados compran de ella sin crear una cuenta.

Reveni - Lista de regalos es una app de lista de regalos para tiendas Shopify. La organizadora elige productos de la tienda, comparte un enlace, y quien quiere regalarle algo lo compra por el paso a caja normal de la tienda. Sin registro, sin app aparte, sin cuenta de invitado.

Está terminada y en revisión. Abajo: cómo se ve, cómo se comporta cuando un pedido se mueve, siete afirmaciones comprobables y los documentos completos.

1app terminada
3en camino, sin fecha
0permisos de ficha de cliente
Ningunocasos que enseñarle, todavía

La salida del programa

Esto es lo que ve su mejor clienta

Una lista de regalos no es un testimonio ni una métrica: es la salida del propio programa, y una demo es honesta. Datos de ejemplo de una tienda de prueba, con las filas como se ven un martes cualquiera.

apps/registry/app/routes/apps.proxy.l.$code._index.tsxdatos de ejemplo · tienda de prueba

Boda

Ana y Julián

Sábado 14 de marzo, en Lima

Gracias por venir. Si quieren regalarnos algo, aquí está lo que nos falta para la casa nueva. Y si no, con que vengan estamos completos.Ana, en el mensaje de la lista

4 de 11 regalos ya tienen dueño

  • Juego de sábanas de algodón lavado, queen

    1 de 1

    Disponible
  • Copas de vino sopladas a boca

    1 de 2

    Reservado en parte
  • Olla de hierro esmaltado, 5 litros

    1 de 1

    Ya regalado
    Para que cocinen juntos y discutan poco. Los queremos.Tía Rosa · dedicatoria publicada con su permiso

Se ven tres de las once filas. La dedicatoria aparece porque quien la escribió pidió publicarla y la organizadora la aprobó: sin las dos cosas, no.

Lo que de verdad se rompe

Cómo se mueve un contador

Una lista de regalos es fácil hasta que el pedido se mueve. Cinco cosas que le pasan a un pedido de verdad, lo que Shopify dice de cada una y lo que queda en la lista.

Lo que le pasa al pedidoQué dice ShopifyQué queda en la lista
Se pagafinancial_status: paidLa unidad cuenta como regalada. La organizadora recibe el aviso.
Se autoriza y todavía no se cobrafinancial_status: authorizedReservada, no regalada. Nadie más la vuelve a comprar, y si el cobro falla se suelta.
Se cancelacancelledAt con fecha, y las cantidades intactasLa unidad vuelve a estar disponible. Shopify no baja las cantidades al cancelar: sin una regla propia, un pedido cancelado contaría como regalo para siempre.
Se reembolsa una línearefunds[].refundLineItems[]Baja la cantidad viva, y si llega a cero la unidad vuelve a la lista.
Se edita el pedido y se quita la líneacurrentQuantity baja, quantity se quedaSe anota como retirada y la unidad vuelve a la lista.

La fila resaltada es la razón de que esa decisión viva en una columna generada de la base de datos y no en una rama de código.

Dentro de la tienda

Y esto es lo que ve en la ficha de producto

El bloque se instala desde el editor del tema y hereda su tipografía. Tiene tres estados, según lo que la clienta ya tenga. Los conmutadores son un grupo de radios: se recorren con el tabulador y las flechas, sin una línea de JavaScript detrás.

apps/registry/storefront/registry-theme/rv-registry.jsdatos de ejemplo · tienda de prueba
Estado del bloque

Olla de hierro esmaltado, 5 litros

Disponible · 5 en almacén

Crear mi lista de regalos

La lleva a crear la lista con este producto ya dentro. No pierde el producto por el camino.

Olla de hierro esmaltado, 5 litros

Disponible · 5 en almacén

Añadir a mi lista

Abre un cajón con sus listas y la cantidad. Si tiene una sola, la añade de una vez.

Olla de hierro esmaltado, 5 litros

Disponible · 5 en almacén

Ver en mi lista

Que esta variante ya está en una lista suya se recuerda en su propio dispositivo, en sessionStorage, durante una hora. No sale de su navegador.

Reglas de la casa

Las seis maneras en que puede estar una fila

Arriba salen las tres que se ven. Aquí están las seis, con lo que significa cada una.

EstadoQué significa
DisponibleNadie la ha tomado.
Reservado en parteAlguien pagó una de dos unidades.
Retenido 20 minutosHay un carrito abierto con ella.
Ya regaladoCobrado, con dedicatoria si la escribieron.
Dedicatoria en revisiónEscrita y aún no aprobada por la organizadora. No se ve en público.
Lista cerradaPasó el evento. Ya no acepta compras.

Los seis a la vez no le pasan nunca a una lista de verdad. Están juntos porque así se revisan de un tirón, no porque así se vean.

Nada depende de nuestro servidor

La lista y el bloque de la ficha viven dentro del tema. Si nuestro servidor se cae, la tienda sigue vendiendo.

Lo público y lo privado van por separado

El correo de avisos y la dirección de entrega van cifrados y nunca entran en la proyección pública. Son dos volcados distintos, no dos permisos sobre el mismo.

La organizadora tiene la última palabra

Una dedicatoria se publica si quien la escribe lo pide y ella la aprueba. Si no, se queda guardada.

Sin autopromoción en la tienda

No hay marca nuestra en el escaparate, ni enlace a nosotros, ni aviso de cortesía. Su tienda es suya.

Comprobable, no prometido

Siete afirmaciones y dónde mirar

Cada una se comprueba abriendo un fichero del repositorio de la app. Todas están citadas también en la política de privacidad.

  1. La app no puede ver la ficha de cliente de nadie.

    Los permisos están en apps/registry/shopify.app.toml. read_customers no aparece, ni entre los obligatorios ni entre los opcionales.

  2. La consulta de pedidos no puede pedir el correo, el teléfono ni la dirección del comprador.

    app/lib/attribution/order-query.test.ts busca esos campos en la consulta y rompe la compilación si alguien añade uno.

  3. De quien hace un regalo no se guarda nombre real, correo ni teléfono.

    Las únicas columnas que existen, en apps/registry/db/schema.ts, son gifter_display_name, gifter_message y gifter_consent_public. No hay dónde guardar lo demás.

  4. La dirección IP nunca se guarda en claro.

    hashIp(), en app/lib/search.server.ts, devuelve sha256(dominio || ip) recortado, y es lo único que se escribe. La huella depende de la tienda.

  5. Lo que alguien teclea en el buscador se guarda hasheado, no en texto.

    Se hashea con el dominio de la tienda antes de registrarse, en el mismo fichero, y en los registros de servidor sale como [redacted].

  6. Un pedido cancelado devuelve la unidad a la lista, siempre.

    counts_as es una columna generada de Postgres, en apps/registry/db/schema.ts: si cancelled_at no es nulo, vale none. No es código que pueda olvidarse de correr.

  7. La app no instala cookies propias ni píxeles de seguimiento.

    Lo único que deja en el navegador, en storefront/registry-theme/rv-registry.js, es una entrada de sessionStorage que caduca a la hora.

Lo que no hay

No tenemos cifras que enseñarte

Ni conversión, ni ticket medio, ni cuántas tiendas la usan. No es prudencia: la app está terminada y todavía no la ha usado nadie en una tienda con clientas de verdad. Cualquier número de aquí saldría de una tienda de prueba nuestra, y no diría nada de la suya. Lo que sí hay es la app entera, sus documentos y siete afirmaciones que se comprueban en el código.

Si prefieres esperar a que alguien más la use primero, es una decisión razonable.

Los documentos

La política de privacidad, en su propia voz

Los dos primeros capítulos, tal como están escritos. El documento completo está en su página, con índice y enlace permanente por capítulo.

Política de privacidad de Reveni - Lista de regalosCapítulos 1 y 2 · extracto

Está en español y evita el lenguaje de abogado a propósito. Los marcadores en amarillo son datos sin rellenar, y se dejan a la vista.

Leer el extracto

1. Quién responde por sus datos

Hay dos situaciones distintas y conviene no mezclarlas.

Cuando la app trata datos de las clientas de una tienda, el comerciante es el responsable del tratamiento (el titular del banco de datos) y nosotros somos el encargado: tratamos esos datos por cuenta suya y siguiendo sus instrucciones. Las condiciones de ese encargo están en el acuerdo de tratamiento de datos. Si usted creó una lista de regalos en una tienda y quiere ejercer sus derechos, puede dirigirse a esa tienda o a nosotros: en el capítulo 10 explicamos las dos vías.

Cuando tratamos los datos de la cuenta del comerciante (el dominio de su tienda, su correo de contacto, su plan y el uso que hace de la app), el responsable somos nosotros.

Shopify es una empresa independiente con su propia política de privacidad. Nosotros accedemos a los datos de una tienda solo con los permisos que el comerciante concede al instalar la app.

2. Qué datos tratamos

2.1 Lo que la organizadora escribe dentro de la app

Es la mayor parte de lo que guardamos, y todo lo teclea ella:

DatoObligatorio
Título de la lista
Tipo de evento y fechaSí el tipo; la fecha se muestra solo si ella lo elige
Nombres de los homenajeadosNo
Mensaje para los invitadosNo
Correo electrónico para recibir avisosNo, pero sin él no hay avisos por correo
Dirección de entrega o sucursal de retiroNo, salvo que quiera que los regalos lleguen a un sitio concreto
Productos, cantidades y orden
Si la lista aparece o no en el buscadorSí, y viene apagado por defecto

Nunca pedimos a Shopify el nombre, el correo, el teléfono ni la dirección de la organizadora. Ella escribe su correo y su dirección dentro de la app. Lo explicamos con detalle en el capítulo 3.

Leer la política completa

También están los términos de servicio y el acuerdo de tratamiento de datos, con sus cuatro anexos.

Un cabo suelto, a la vista

Todavía no hay por dónde escribirnos

Pendiente

[CANAL DE CONTACTO]

No hay correo ni número porque todavía no hay nadie al otro lado que responda en un plazo que valga la pena prometer. Preferimos el hueco declarado a una dirección que tarde una semana. Cuando exista, aparece en esta caja y en el capítulo 14 de la política.

Lo que sí funciona hoy es lo que Shopify obliga a atender: las peticiones de acceso y borrado llegan por sus avisos de cumplimiento y se atienden en plazo, como explica el capítulo 9 de la política.

Instrument Serif, Geist y Geist Mono, por Google Fonts. Sin cookies y sin medición en esta página: ni analítica, ni píxeles, ni etiquetas de terceros. Lo único que se queda en su navegador es el tema que elija.