Qué es y qué no es
- Es código tuyo, servido desde tu dominio, que se carga en las páginas públicas de la tienda: inicio, catálogo, ficha de producto, carrito, búsqueda, páginas y contacto.
- No es una forma de tocar el checkout. Nunca cargamos scripts de apps en el checkout ni en la confirmación de la compra, en «Mi cuenta», en el login ni el registro, en la recuperación de clave, en el botón de arrepentimiento, ni en la vista previa del editor de la tienda. Ver «Rutas excluidas».
- No es una API: no recibís datos de clientes ni podés escribir en Commercy desde la tienda. Lo que sabe tu script es lo que ve el visitante, más el contexto de
window.Commercy(más abajo). - En esta versión sólo se aceptan scripts necesarios para la función que el comercio instaló. Ver la sección «Qué cuenta como necesario».
Las tres llaves
Un script se carga en una tienda sólo si se cumplen las tres a la vez:- Commercy habilitó los scripts en tu app. La capacidad la prende el equipo de Commercy al aprobar tu app, y la puede apagar en cualquier momento.
- El comercio concedió el scope
storefront_scriptsal instalar tu app (ver Scopes y permisos). El comercio ve un aviso destacado: «Agregar código a tu tienda online». - La declaración está aprobada. Si tu app ya está publicada, lo que cambiás pasa por revisión y mientras tanto sigue corriendo la versión aprobada.
storefront_scripts, cada comercio tiene que volver a autorizarla: hasta que lo haga no cargamos nada en su tienda.
Cómo declarar un script
En el portal, abrí tu app y andá a la pestaña Scripts. Cada fila tiene:
También podés declararlos por API, con el
PATCH /api/v1/developers/apps/:id que usa el portal:
storefront_scripts en la pestaña Scopes: sin él, no podés enviar la app a revisión.
Los límites:
El tamaño no lo bloqueamos al guardar, pero el portal te avisa y la revisión lo mira.
Dónde puede vivir el archivo
- Tiene que ser
https. - Tiene que estar en el mismo dominio que la URL de tu app (
appUrl):cdn.tuapp.comsirve si tu app está enapp.tuapp.com. Si tuappUrlno tiene un dominio propio, no podemos validar el script. - No puede ser un dominio de Commercy ni el dominio de una tienda.
- No puede llevar usuario ni contraseña en la URL, ni usar un puerto menor a 1024, ni apuntar a una IP privada.
appUrl y un script queda en otro dominio, deja de cargarse.
Hash SRI
Cada script lleva el hashsha384 de su contenido. El navegador de cada visitante lo verifica antes de ejecutar el archivo: si alguien lo cambia, no corre. En el portal, el botón Calcular hash lo hace por vos. Desde una terminal:
sha384- seguido de 64 caracteres.
El archivo se sirve así
Para que el navegador pueda verificar el hash, tu servidor tiene que cumplir tres cosas:- Sin redirects. Una respuesta
301o302rompe la verificación y es una forma de cambiar el contenido sin que nos enteremos. Lasrctiene que responder200directo. - Con CORS. La respuesta lleva
Access-Control-Allow-Origin: *. Sin ese header, el navegador no ejecuta el script (cargamos concrossorigin="anonymous"). - Con
Content-Type: text/javascript.
widget.v3.js) cuyo contenido no cambia nunca.
Cómo actualizar sin romper
Como el hash está atado al contenido, no pises el archivo en la misma URL: todas las tiendas dejarían de cargarlo hasta que apruebe la revisión.- Publicá el archivo nuevo en una URL nueva (
widget.v4.js). - Dejá vivo el archivo viejo (
widget.v3.js): las tiendas siguen cargándolo hasta que se apruebe el cambio. - Calculá el hash del nuevo, y cambiá
srceintegrityen el portal. Si tu app está publicada, el cambio pasa por revisión y se aplica al aprobarlo. - Cuando el cambio esté aprobado y pasaron unos minutos, ya podés retirar el archivo viejo.
Cuándo se carga
Cargamos el script conasync, así que nunca bloquea la página.
interaction(por defecto): después de la primera interacción del visitante (un toque, una tecla, un scroll o un movimiento de la rueda). Si el visitante no interactúa, el script no se carga. Es lo mejor para el rendimiento de la tienda.idle: cuando termina de cargar la página y el navegador está libre. Se puede usar, pero la revisión te va a pedir que justifiques por qué no alcanza coninteraction.
[Commercy] No se pudo cargar el script "<handle>" de <tu app>. Revisá el hash SRI y que el archivo se sirva con CORS y sin redirects.
Qué cuenta como necesario
En esta versión sólo aceptamosconsent: "necessary". Un script es necesario cuando sin él no anda la función que el comercio instaló y no hace perfilado del visitante: un chat, un botón de WhatsApp, un banner de cuotas, un popup que configuró el comercio.
No es necesario, y por lo tanto todavía no se puede declarar: la medición de audiencia, los mapas de calor, la grabación de sesiones, los píxeles publicitarios, el remarketing y el envío de eventos a plataformas de anuncios. Esos casos llegan más adelante, con el consentimiento del visitante.
Si declarás analytics o marketing, la API responde con el motivo consent_unsupported.
window.Commercy
Antes de cargar el primer script definimos window.Commercy: un objeto congelado (no lo podés modificar ni reemplazar) y sin datos personales. No incluye email, nombre, teléfono, dirección, documentos ni ids de clientes, ni tokens.
Cada llamada a un
get devuelve una foto nueva, congelada. No se puede emitir eventos desde un script: sólo escuchar.
Eventos
Son cuatro. Todos los payloads están congelados.
Como tu script se carga tarde,
page_viewed y product_viewed se reenvían al suscribirte: recibís el último de la página actual. Los otros dos no se repiten. Si un callback tira un error, lo atrapamos y no afecta a los demás.
Un on() con un evento desconocido, o con algo que no es una función, se ignora y deja un aviso en la consola. Hay un tope de 50 listeners por evento.
Ejemplo
Rutas excluidas
Estas rutas nunca llevan scripts de apps, ywindow.Commercy no existe en ellas:
/checkout (incluye la confirmación de la compra), /cuenta, /login, /registro, /auth, /forgot-password, /reset-password, /arrepentimiento, /preview y las rutas del Hub de pago (/confirm, /hub) y las rutas internas de desarrollo del editor.
Si el visitante navega desde una página con tu script hacia una ruta excluida, recargamos el documento para que tu script no siga vivo ahí. Tampoco cargamos nada en la vista previa del editor ni en el borrador de la tienda.
Política de comportamiento
Con un script en la tienda tenés acceso a datos sensibles del visitante. Por eso:- Prohibido leer campos de formularios, y leer o escribir el
localStorageo las cookies de Commercy (auth-storage,cart-id). - Prohibido leer o modificar el DOM de las rutas excluidas.
- Prohibido pedir credenciales o datos de pago.
- Obligatorio envolver tu código en un closure (como en el ejemplo), no depender de jQuery ni del JavaScript del tema de la tienda, y no usar
document.write. - Cargá lo mínimo: la revisión mide el Lighthouse mobile de una tienda y tu script no puede empeorarlo en más de 10 puntos.
Cómo probar
Mientras tu app está en borrador, los scripts sólo corren en tu tienda de desarrollo y en tus tiendas demo.- Declará el script y pedí el scope
storefront_scripts. - Pedile a soporte que habilite los scripts en tu app, para poder probarlos en borrador. Pasale el id de tu app.
- Instalá la app en tu tienda de desarrollo aceptando el scope.
- Abrí la tienda, interactuá con la página (un scroll alcanza) y mirá la consola.
src en http://localhost (también 127.0.0.1 y ::1), que no necesita estar en el dominio de tu app. Para enviar la app a revisión el src tiene que ser https y público.
Después del envío, la revisión mira que el hash coincida, que el archivo se sirva sin redirects y con CORS desde una URL versionada, que la carga sea diferida, que sea un script necesario y que no empeore el rendimiento. Ver Revisión y publicación.
Errores de validación
Cuando algo de la declaración no es válido, la API responde400 y details trae un item por cada problema, con { field, reason }. El field indica qué script (por ejemplo storefrontScripts[0].src).
Ejemplos
Dos scripts de ejemplo, listos para copiar y adaptar:whatsapp-widget-script: un widget de WhatsApp para la tienda.installments-banner-script: un banner de cuotas para la tienda.