# GetOptical Docs — full documentation > Documentación de Optical Form, la app de Shopify de GetOptical que añade a la ficha de producto un configurador de lentes multipaso para vender gafas graduadas y lentes de contacto. Documentation for Optical Form, the Shopify app by GetOptical. Optical Form es una app pública del Shopify App Store, publicada por la marca GetOptical: https://apps.shopify.com/optical-form Qué hace: en la ficha de producto, el comprador elige tipo de gafas, lente y tratamientos, introduce su graduación y añade accesorios; todo entra en el carrito de Shopify. - Instalación: bloque de tema (app embed). Funciona en cualquier tema, sin desarrollador. - Diez tipos de paso: single_select, multi_select, text_input, graduation, graduation_summary, file_upload, accessories, reading_rx, contact_lens, variant_select. - Lentillas y subida de receta incluidas en el plan base, no en un nivel superior. - Precio: un solo plan, Pro, 49 USD/mes o 490 USD/año, prueba gratis de 14 días, 0% de comisión. Todos los cargos se facturan en USD. - Idiomas: español e inglés, tanto en la app como en esta documentación. - Privacidad: la receta no sale del navegador — viaja a las propiedades de línea del pedido de Shopify, no a servidores de GetOptical. - Soporte: support@getoptical.app English summary: Optical Form is a public Shopify app by GetOptical. It adds a multi-step lens configurator to the product page: the shopper picks frame type, lens and treatments, enters their prescription and adds accessories, and it all goes into the Shopify cart. It installs as a theme block (app embed) and works on any theme, no developer needed. Ten step types are available (single_select, multi_select, text_input, graduation, graduation_summary, file_upload, accessories, reading_rx, contact_lens, variant_select). Contact lenses and prescription upload are included in the base plan. One plan, Pro: $49/month or $490/year, 14-day free trial, 0% commission, all charges billed in USD. Spanish and English. The prescription never leaves the browser: it travels to the Shopify order line item properties, not to GetOptical servers. Support: support@getoptical.app This file contains every page of https://docs.getoptical.app in full: first the Spanish pages served at the site root, then the English pages served under /en/. The two trees are translations of each other, not different content. Each page below starts with its title, its description and the URL it is served from. --- # Documentación de GetOptical > Vende gafas graduadas y lentes en Shopify — 0% de comisión, en cualquier tema. Source: https://docs.getoptical.app/ Language: es ### Empezar Lee primero **Antes de empezar**: cuatro decisiones y una lista de productos que evitan rehacer el trabajo. Después instala la incrustación de la app, crea tu formulario y asígnalo a un producto. [Antes de empezar](https://docs.getoptical.app/empezar/antes-de-empezar/) · [Guía de instalación](https://docs.getoptical.app/empezar/instalacion/) · [Conceptos clave](https://docs.getoptical.app/empezar/conceptos/) ### Crear un formulario Los 10 tipos de paso, la anatomía de una opción y la ramificación por respuesta. En qué productos aparece, qué pasa con la montura sin lentes, y cómo se publica, se copia y se lleva a otra tienda. [Crear un formulario](https://docs.getoptical.app/guias/crear-formulario/) · [Productos y colecciones](https://docs.getoptical.app/guias/productos-y-colecciones/) · [Cómo se compra cada montura](https://docs.getoptical.app/guias/evitar-compras-sin-configurar/) · [Sincronización y copias](https://docs.getoptical.app/guias/sincronizacion/) · [Copiar a otra tienda](https://docs.getoptical.app/guias/copiar-formulario/) ### Graduación y receta Captura SPH, CYL, AX, ADD y DP por ojo, o una rejilla de lectura; o deja que el cliente suba su receta como imagen o PDF. También hay pasos de lentillas, incluidos en Pro. [Graduación](https://docs.getoptical.app/guias/graduacion/) · [Subida de archivo](https://docs.getoptical.app/guias/subir-receta/) ### Addons, precios e iconos Vende lentes, tratamientos y cross-sell facturados como líneas separadas; de dónde sale cada euro del total; y un pack de 28 iconos para tus opciones. [Complementos y accesorios](https://docs.getoptical.app/guias/accesorios-y-addons/) · [Precios y cobro](https://docs.getoptical.app/guias/precios-y-cobro/) · [Iconos](https://docs.getoptical.app/guias/iconos/) ### Diseño, tema y carrito Colores, tipografía, comportamiento y qué datos se muestran en el carrito; el botón del producto; los ajustes que viven en tu tema y los temas que hemos probado; y de dónde sale cada texto que ve tu cliente. [Diseño y carrito](https://docs.getoptical.app/guias/diseno-y-carrito/) · [El botón del producto](https://docs.getoptical.app/guias/boton-del-producto/) · [Ajustes del tema](https://docs.getoptical.app/guias/ajustes-del-tema/) · [Temas probados](https://docs.getoptical.app/guias/temas-probados/) · [Idiomas y textos](https://docs.getoptical.app/guias/traducciones/) ### Planes y facturación Bienvenida de 14 días, prueba gratis de 14 días, 0 % de comisión, y qué cambia al elegir plan. [Planes y facturación](https://docs.getoptical.app/facturacion/planes/) ### Cuando algo no funciona Busca tu síntoma, sigue las comprobaciones en orden y para en cuanto una falle. Qué significa cada cifra de Analítica y qué tocar en el paso que pierde clientes. Y las dudas más comunes, respondidas. [Cuando algo no funciona](https://docs.getoptical.app/guias/cuando-algo-no-funciona/) · [Leer la analítica](https://docs.getoptical.app/guias/analitica/) · [Preguntas frecuentes](https://docs.getoptical.app/faq/) ### Para desarrolladores Instalación agnóstica al tema, hooks y agrupación de carrito; y si montas la tienda de una óptica para un cliente, Pro gratis en tu tienda de desarrollo. [Integración](https://docs.getoptical.app/desarrolladores/integracion/) · [Qué hacer con cada evento](https://docs.getoptical.app/desarrolladores/eventos/) · [Botón y carrito](https://docs.getoptical.app/desarrolladores/boton-y-carrito/) · [Agencias y tiendas de desarrollo](https://docs.getoptical.app/desarrolladores/tiendas-de-desarrollo/) --- # Antes de empezar > Cuatro decisiones y una lista de productos que conviene tener resueltas antes de tocar la app. Media hora aquí te ahorra rehacer el trabajo. Source: https://docs.getoptical.app/empezar/antes-de-empezar/ Language: es Puedes instalar la app y ponerte a construir. Pero hay cuatro cosas que, decididas antes, evitan tener que rehacer formularios y productos a mitad de camino. Nada de esto se hace dentro de Optical Form: es preparación en tu propia tienda. ## 1. Qué monturas se venden con formulario No suelen ser todas. | Se venden **con** formulario | Se venden **normal** | |---|---| | Monturas graduadas | Estuches, líquidos, paños | | Gafas de sol (con tinte, polarizadas o graduadas) | Accesorios y regalos | | Gafas de lectura a medida y lentes de recambio | Monturas que vendes sueltas, sin lentes | Esta lista decide dos cosas más adelante: a qué productos asignas el formulario y qué plantilla de producto usan. Escríbela antes de empezar. **El caso mixto** ¿La misma montura se vende con y sin graduación? **No hace falta duplicarla.** Un solo producto puede llevar los dos botones: el de tu tema, que añade la montura sola, y el de Optical Form, que abre el configurador. Es una decisión de negocio tuya, no un límite de la app — solo hay que ponerle a cada botón un nombre que diga lo que hace. Crea dos productos únicamente si quieres precios, fotos o textos distintos para cada versión. Las dos vías, con sus pasos, en [Controlar cómo se compra cada montura](https://docs.getoptical.app/guias/evitar-compras-sin-configurar/). ## 2. Los productos de tus extras Aquí está el grueso del trabajo previo, y lo que más gente se salta. Todo lo que quieras **cobrar aparte** —el tipo de lente, un tratamiento, el montaje— tiene que existir como **producto de Shopify**. No son etiquetas dentro de la app: son productos reales, porque es Shopify quien los factura, los mete en el pedido y los envía a tu laboratorio. Prepara una lista parecida a esta: ``` Lente monofocal estándar 1.50 ...... 0,00 € (incluida en el precio de la montura) Lente monofocal fina 1.60 ......... 15,00 € Lente monofocal ultrafina 1.74 .... 50,00 € Antirreflejante premium ........... 30,00 € Filtro de luz azul ................ 17,00 € Fotocromático ..................... 40,00 € Montaje ........................... 12,00 € ``` Dos cosas que decidirás con esa lista en la mano y que explicamos en [Precios y cobro](https://docs.getoptical.app/guias/precios-y-cobro/): - **El precio es el suplemento, no el total.** La montura ya tiene el suyo. - **Lo que va incluido se crea igual, a 0 €.** Así el cliente ve "Incluido" en vez de un hueco. **Créalos con el estado «No listado»** Estos productos no son para navegar: nadie debería encontrar "Antirreflejante premium" en tu colección de gafas. Shopify tiene un estado de producto pensado justo para esto: **No listado** (*Unlisted*, en la página del producto, junto a Activo y Borrador). Un producto no listado **no sale en las colecciones, en el buscador de la tienda, en las recomendaciones, en Google ni en el mapa del sitio**, pero **se puede añadir al carrito y comprar** con normalidad: en el carrito, el checkout y el pedido se comporta como un producto activo. No los dejes **sin publicar** en el canal Tienda online ni en Borrador: un producto que no está publicado en el canal **no se puede añadir al carrito**, y Shopify rechazaría el añadido entero — tu cliente se quedaría sin la montura también. Activo pero escondido en una colección que no enlazas también funciona, pero sigue saliendo en el buscador. ### Cómo poner un producto en el canal Tienda online Si un producto ya existe y le falta el canal, añádeselo desde su página de producto: 1. En tu admin de Shopify, ve a **Productos** y haz clic en el nombre del producto. 2. En la sección **Publicación**, haz clic en el icono que hay junto al título. 3. En el cuadro de diálogo, marca **Tienda online** y haz clic en **Listo**. 4. Haz clic en **Guardar**. Repítelo con cada producto de tus extras. Si no quieres que salga en colecciones ni en el buscador, ponlo en estado **No listado** en esa misma página de producto. ## 3. Cómo vas a asignar el formulario Dos formas, y conviene elegir antes: | | Cuándo usarla | |---|---| | **Por producto** | Pocas monturas, o cada una con su formulario | | **Por colección** | Catálogo amplio con un formulario común | La colección tiene una ventaja que suele decidir: **es viva**. Añades una montura nueva a la colección y ya muestra el formulario, sin volver a la app. Si vas a crecer en catálogo, empieza por ahí. Crea esa colección ahora si no existe — por ejemplo *Gafas graduadas*. ## 4. Decide cómo se compra cada montura Tu tema mantiene **sus propios botones de compra**, así que por defecto un cliente puede llevarse la montura sin lentes. Puede que eso te venga bien —hay ópticas que venden monturas sueltas a propósito— o puede que no lo quieras en absoluto. Es tuya la decisión, y conviene tomarla ahora y no cuando ya esté entrando gente. Las dos vías, con sus pasos: **[Controlar cómo se compra cada montura](https://docs.getoptical.app/guias/evitar-compras-sin-configurar/)**. Si aún estás eligiendo tema y ya sabes que quieres cerrar la compra directa, ten en cuenta que necesitarás poder **quitar el bloque de botones de compra** y **desactivar la barra fija** en una plantilla de producto propia. Casi todos los temas modernos lo permiten. ## Lista de comprobación Antes de crear tu primer formulario: - [ ] Sé qué productos se venden con formulario y cuáles no - [ ] Los productos de mis extras están creados, con precio de **suplemento** - [ ] Los que van incluidos existen a **0 €** - [ ] Están en estado **No listado** (no en borrador ni sin publicar) - [ ] La colección de monturas graduadas existe (si voy por colección) - [ ] He decidido si mis monturas se pueden comprar sin configurar, y he aplicado esa decisión Con eso hecho, montar el formulario es media hora. Sin eso, es media hora y volver atrás tres veces. ## Siguiente paso [Instalar Optical Form](https://docs.getoptical.app/empezar/instalacion/) y después [Crear un formulario](https://docs.getoptical.app/guias/crear-formulario/). --- # Instalar Optical Form > Instala la app, activa la incrustación de la app y deja tu primer formulario listo en Shopify. Source: https://docs.getoptical.app/empezar/instalacion/ Language: es Optical Form se instala mediante una **incrustación de la app** en el tema — sin tocar código. La app incluye una **Guía de configuración** que te acompaña por estos pasos. ## 1. Instala la app Instala **[Optical Form desde el Shopify App Store](https://apps.shopify.com/optical-form)**. Al abrirla por primera vez, la guía de configuración aparece en el Home. **No hace falta elegir plan para empezar** Desde el momento en que instalas tienes **14 días de bienvenida** con la app completa: puedes hacer todos los pasos de esta guía y publicar en tu tienda sin aprobar ningún cargo. Los **14 días de prueba** son otra cosa y empiezan cuando eliges plan. La cronología entera, en [Planes y facturación](https://docs.getoptical.app/facturacion/planes/#qué-pasa-desde-que-instalas). ## 2. Activa la incrustación de la app 1. En tu admin de Shopify: **Tienda online → Temas → Personalizar**. 2. Abre **Incrustaciones de aplicaciones** en el panel izquierdo. 3. Activa **Optical Form Drawer** y pulsa **Guardar**. **Atajo** La tarjeta **Activar la app** del Home abre el editor de temas directamente en la incrustación. Muestra **Publicada** cuando el panel está activo en tu tema publicado. ## 3. Añade el bloque a la página de producto Este paso es el que hace aparecer el botón, y es distinto del anterior: | | Qué hace | Dónde va | |---|---|---| | **Incrustación de la app** (paso 2) | Carga la app en la tienda | Toda la tienda, una vez | | **Bloque "Optical Form"** (este paso) | **Dibuja el botón** | Dentro de la plantilla de producto | Si activas solo la incrustación, el formulario existe pero **la página de producto no muestra nada**. 1. En el editor de temas, arriba, cambia la vista a **Producto** (plantilla de producto). 2. En la sección principal, pulsa **Añadir bloque** → elige **Optical Form**. 3. Colócalo donde quieras (normalmente junto al botón de añadir al carrito) y pulsa **Guardar**. **Atajo** El paso *"Añade el bloque a tu página de producto"* de la Guía de configuración abre el editor ya en la plantilla de producto y con el bloque preparado. **Ojo al tema publicado** La guía comprueba el **tema publicado**. Si añades el bloque a un borrador de tema, el paso seguirá marcado como pendiente hasta que publiques ese tema. ## 4. Ya tienes cuatro formularios de ejemplo No empiezas de cero. Al instalar, la app deja **cuatro formularios en borrador** hechos y en el idioma de tu tienda: - **Gafas graduadas a pantalla completa** — con colores de tratamiento de muestra. - **Gafas graduadas** en panel lateral — con las ramas de monofocal, progresiva, lectura y sin graduar. - **Gafas de sol** en modo oscuro. - **Lentillas** — tipo de lentilla, graduación por ojo y complementos. Están en **borrador**, así que no aparecen en ninguna página de producto hasta que tú los actives. Ábrelos, recórrelos y quédate con el que se parezca a lo que vendes: casi siempre sale más rápido que empezar en blanco. Si prefieres partir de otra cosa, **Crear formulario** te ofrece cinco plantillas. Ver [Crear un formulario](https://docs.getoptical.app/guias/crear-formulario/). ## 5. Crea los productos de los complementos Los tipos de lente, tratamientos y servicios se facturan como **productos reales de Shopify**. Créalos con el estado **No listado** —se pueden comprar pero no salen en colecciones ni en el buscador, ver [Antes de empezar](https://docs.getoptical.app/empezar/antes-de-empezar/#2-los-productos-de-tus-extras)— y luego vincúlalos a las opciones como [complementos](https://docs.getoptical.app/guias/accesorios-y-addons/). ## 6. Asigna el formulario a productos En la pestaña **Productos** del formulario, elige en qué productos debe aparecer. En esas páginas el cliente verá el botón **"Configura tus lentes"** y seguirá el flujo multipaso. Puedes elegir productos sueltos o **colecciones enteras**: con una colección, todos sus productos —también los que entren después— muestran el formulario, y da igual cuántos sean. Las reglas, en [Productos y colecciones](https://docs.getoptical.app/guias/productos-y-colecciones/). ## 7. Activa y sincroniza Pon el formulario en estado **Activo** y pulsa **Sincronizar** para publicarlo en Shopify. Un formulario solo aparece en la tienda si está **Activo + Sincronizado**. Ver [Sincronización](https://docs.getoptical.app/guias/sincronizacion/). ## 8. Decide cómo se compra cada montura Queda una decisión, y es de negocio: tu tema conserva **sus propios botones de compra**, así que hoy un cliente puede llevarse la montura **sin lentes**. Si vendes también monturas sueltas, eso es justo lo que quieres. Si no, ese pedido entra pagado y sin graduación, y lo descubres en el taller. Tómala ahora, no después: [Controlar cómo se compra cada montura](https://docs.getoptical.app/guias/evitar-compras-sin-configurar/). ## Siguiente paso Repasa los [Conceptos clave](https://docs.getoptical.app/empezar/conceptos/) o pasa directo a [Crear un formulario](https://docs.getoptical.app/guias/crear-formulario/). ¿Algo no sale como esperabas? [Cuando algo no funciona](https://docs.getoptical.app/guias/cuando-algo-no-funciona/). --- # Conceptos clave > El vocabulario de Optical Form — formulario, paso, opción, complemento, accesorio y bundle. Source: https://docs.getoptical.app/empezar/conceptos/ Language: es Antes de construir, conviene conocer las piezas que usa Optical Form. Todas aparecen con estos nombres en el panel de la app. ## Formulario Un **flujo multipaso** que el cliente completa en la página de producto. Tiene un **nombre**, un **estado** (Borrador / Activo / Archivado) y una lista de **pasos**. Se asigna a uno o más productos y se publica en Shopify mediante sincronización. ## Paso Cada **paso** hace una pregunta al cliente (tipo de lente, material, graduación, accesorios…). Tiene un **Tipo de entrada** que decide cómo se muestra. Ver [Crear un formulario](https://docs.getoptical.app/guias/crear-formulario/) para la lista completa de tipos. ## Opción Dentro de un paso de selección, cada **opción** es una tarjeta elegible (ej. "Progresivo", "Antirreflejante"). Una opción puede llevar: una **etiqueta**, una **imagen**, un **distintivo informativo** (solo visual), incompatibilidades con otras opciones, un **salto** a otro paso y uno o varios **complementos**. ## Complemento Un **producto de Shopify vinculado a una opción** que se factura como **línea separada** en el carrito cuando el cliente elige esa opción (ej. el propio tipo de lente, un tratamiento, un servicio de montaje). Se agrupan bajo el producto principal como un bundle. ## Colores seleccionables Una **fila de muestras de color** dentro de una opción (tintes, polarizadas, fotocromáticas). El cliente elige un color y **solo ese** se cobra: cada color es una variante de un producto tuyo, y varios productos forman grupos con título (Classic, Fashion, Gradient…). Ver [Colores seleccionables](https://docs.getoptical.app/guias/accesorios-y-addons/#colores-seleccionables-por-opción). ## Plantilla de diseño Un aspecto completo del panel en un clic — **Clásica**, **Moderna** u **Oscura** — desde la pestaña Diseño. Distinta de la plantilla de **formulario** (los pasos con los que nace un formulario nuevo) y de la plantilla de **producto** de tu tema. Ver [Diseño y carrito](https://docs.getoptical.app/guias/diseno-y-carrito/#plantilla-de-diseño). ## Accesorio (cross-sell) Un paso de tipo **Accesorios** ofrece productos extra opcionales (estuches, limpiadores, cordones…) que el cliente puede añadir o saltar. A diferencia de los complementos, viven en su propio paso y no dependen de una opción concreta. ## Bundle El **conjunto** producto principal + complementos + accesorios que se añade al carrito en un clic. Shopify los enlaza de forma nativa con `parent_id`, así que se borran en cascada y se leen juntos en el checkout y en los emails de pedido. Ver [Diseño y carrito](https://docs.getoptical.app/guias/diseno-y-carrito/). ## Graduación (Rx) Los datos de la receta del cliente: esfera (SPH/PWR), cilindro (CYL), eje (AX), adición (ADD) y distancia interpupilar (DP), por cada ojo (OD / OI). Ver [Graduación y receta](https://docs.getoptical.app/guias/graduacion/). ## Metaobject / Sincronización Cada formulario se **publica en Shopify como un metaobject**. Guardar en la app no basta: hay que **Sincronizar** para que los cambios lleguen a la tienda. Ver [Sincronización](https://docs.getoptical.app/guias/sincronizacion/). --- # Crear un formulario > Configura los pasos de tu configurador de graduación y asígnalo a un producto. Source: https://docs.getoptical.app/guias/crear-formulario/ Language: es Un formulario de Optical Form es un **flujo multipaso** que el cliente completa en la página de producto. **Antes de empezar** Si aún no has creado los productos de tus tratamientos y tipos de lente, hazlo primero: los necesitas para vincular los complementos. Ver [Antes de empezar](https://docs.getoptical.app/empezar/antes-de-empezar/). ## Los cuatro formularios que ya tienes Al instalar te dejamos **cuatro formularios de ejemplo ya montados**, todos en **Borrador**: **gafas graduadas a pantalla completa** (con colores de tratamiento de muestra), **gafas graduadas** en panel lateral, **gafas de sol en modo oscuro** y **lentillas**. No están asignados a ningún producto, así que no se ven en tu tienda hasta que tú quieras. **Empieza por uno de ellos, no por uno en blanco.** Traen los pasos, los textos y el diseño ya hechos, y se editan enteros — es mucho más rápido que armar el tuyo desde cero. ## Pasarlo a Activo Un formulario en **Borrador** no lo ve nadie. Para publicarlo: 1. **Formularios** → entra en el que quieras usar. 2. En la pestaña **Ajustes**, cambia **Estado** de **Borrador** a **Activo**. 3. **Guarda** y luego **Sincroniza** — ver [Sincronización](https://docs.getoptical.app/guias/sincronizacion/). Para que aparezca de verdad hacen falta las cuatro cosas a la vez: **Activo**, **Sincronizado**, **asignado a un producto** y la [incrustación de la app](https://docs.getoptical.app/empezar/instalacion/) activada en tu tema. ## Crear el formulario 1. En la app: **Formularios → Crear formulario**. 2. Elige una **plantilla** de inicio o empieza en blanco: - **Gafas graduadas** — tipo de lente → material → tratamiento → graduación → resumen. - **Gafas graduadas · Pantalla completa** — el mismo flujo a pantalla partida y con colores seleccionables en los tratamientos. - **Lentillas** — pack, graduación por ojo tomada del catálogo de fabricación del producto y líquidos de mantenimiento. - **Gafas de sol · Oscuro** — solo sol o graduadas → graduación → tinte → polarización → accesorios. Nace con la plantilla de diseño **Oscura** (fondo carbón, acento bermellón) y con iconos dibujados para fondo oscuro: un configurador que parece parte del producto. Pensada para gafas de sol y monturas premium. - **Formulario en blanco** — un paso vacío para construir desde cero. 3. Ponle nombre, elige el estado (Borrador / Activo) y crea. ## Tipos de paso En la pestaña **Pasos**, cada paso tiene un **Tipo de entrada** que define cómo se muestra: | Tipo de entrada | Para qué sirve | |---|---| | **Selección única** | Elegir una opción (tipo de lente, tratamiento). | | **Selección múltiple** | Elegir varias (filtros o tratamientos combinables). Para que el cliente vea que puede seguir añadiendo, eliges entre una casilla en cada opción o un aviso sobre el botón de continuar. | | **Graduación (Rx)** | Captura por ojo (OD/OI): SPH, CYL, AX, ADD y DP. Ver [Graduación](https://docs.getoptical.app/guias/graduacion/). | | **Receta de lectura (rejilla)** | Rejilla de ampliación para lentes de lectura. | | **Subida de archivo** | El cliente sube su receta (imagen o PDF). Ver [Subida de archivo](https://docs.getoptical.app/guias/subir-receta/). | | **Campo de texto** | Nota libre del cliente. | | **Accesorios (cross-sell)** | Añadir productos extra al pedido. Ver [Complementos y accesorios](https://docs.getoptical.app/guias/accesorios-y-addons/). | | **Resumen de graduación** | Muestra la graduación introducida antes de finalizar. | | **Lentillas** | Pack por ojo, graduación leída del catálogo de fabricación del producto y referencia exacta del fabricante en el pedido. | | **Variantes del producto** | Deja elegir la variante dentro del formulario. Se oculta solo si el producto tiene una única variante. | ## Ajustes de un paso Cada paso tiene: **ID interno** (no visible al cliente), **Título**, **Descripción**, **Tipo de entrada** y varios interruptores: - **Obligatorio** — el cliente debe completar el paso para avanzar. - **Ocultar del resumen** — no muestra la selección en el resumen ni en las etiquetas del pie (útil para pasos que solo dirigen al cliente). - **Mostrar 0 en vez de "Incluido"** — muestra `€0,00` en las opciones sin coste, en lugar de la etiqueta "Incluido". - **Precio que se muestra en las opciones** — qué importe enseña cada tarjeta del paso: solo el coste añadido («+25 €», por defecto), un precio de partida, el precio total o solo el precio de la opción. Cada opción puede llevar el suyo con **Precio que se muestra en esta opción**. Los cuatro modos, con un ejemplo, en [Precios y cobro](https://docs.getoptical.app/guias/precios-y-cobro/#el-precio-de-cada-tarjeta-cuatro-modos). - **Si este paso solo tiene una opción, elegirla y saltar el paso** — desactivada por defecto, solo en pasos de elección única. Activada, cuando a un producto le queda una sola opción en ese paso (un único pack, un único tratamiento posible), la app la elige por el cliente, la lleva al pedido con su etiqueta y pasa directamente al siguiente paso: nadie ve una pantalla con una sola tarjeta. No salta si la opción lleva colores seleccionables o una acción externa, ni si el salto terminaría el formulario. Desactivada, un paso de una sola opción se muestra tal cual — a veces esa pantalla está a propósito. ## Anatomía de una opción En los pasos de selección, cada **opción** puede llevar: - **Etiqueta**, **descripción** e **imagen** (de tus Shopify Files o por URL). - **Ventajas** — hasta cuatro etiquetas cortas bajo la descripción ("Menos reflejos", "Para pantallas") que dicen qué gana el cliente eligiendo esa opción. No cambian el precio ni llegan al pedido. Las del catálogo se traducen solas al idioma del cliente; las que escribas tú las traduces como cualquier otro campo. - **Texto de ayuda** — opcional. Si lo rellenas, aparece un «?» junto al título de la opción que el cliente abre para leer una explicación más larga (al pasar el ratón o pulsándolo), así la descripción puede quedarse corta. Se traduce como cualquier otro campo; su aspecto se ajusta en [Diseño › Ayuda emergente](https://docs.getoptical.app/guias/diseno-y-carrito/). - **Distintivo informativo** — texto visual (ej. `+250`) que **no** afecta al total. Si pones ahí un precio y no vinculas un complemento, el cliente lo ve pero **no lo paga**: ver [Precios y cobro](https://docs.getoptical.app/guias/precios-y-cobro/). Solo se ve en opciones que no suman nada al precio: en una opción con complemento manda el modo de precio que hayas elegido. Para etiquetas como «Mejor precio» usa la **Etiqueta de la opción** (abajo); si ya tenías escrito algo como «Mejor precio • 59 €» en una opción que cuesta 59 €, la app lo muestra como etiqueta sin que hagas nada. - **Etiqueta de la opción** — una etiqueta junto al título de la opción: «Recomendada», «Mejor precio», «Más popular»… Pulsa **Elegir etiqueta** y elige una prediseñada (se traduce sola al idioma del cliente y tiene su color) o escribe la tuya y elígele el color. Una por opción, en cualquier paso de opciones. No la elige por el cliente ni cambia el orden: si quieres que salga primera, arrástrala. El texto de «Recomendada» se cambia en [Diseño › Textos](https://docs.getoptical.app/guias/diseno-y-carrito/). - **Incompatible con** — impide combinarla con otras opciones. - **Siguiente paso (al hacer clic)** — secuencial, saltar a un paso concreto, o **Enviar (fin)**. - **Complementos** — productos de Shopify que se facturan como líneas separadas al elegir la opción. - **Colores seleccionables** — una fila de muestras (tintes, polarizadas, fotocromáticas): el cliente elige un color y **solo ese** se cobra. Cada color es una variante de un producto tuyo; varios productos forman grupos con título. Ver [Colores seleccionables](https://docs.getoptical.app/guias/accesorios-y-addons/#colores-seleccionables-por-opción). - **Acción externa** — sustituye el "añadir al carrito" por un mensaje + botón (cita, WhatsApp, solo en tienda). Ver [Complementos, accesorios y acciones externas](https://docs.getoptical.app/guias/accesorios-y-addons/). ## Ramificación condicional El campo **Siguiente paso** de cada opción define a qué paso salta el flujo — así "Gafas graduadas" y "Gafas de lectura" pueden llevar por caminos distintos desde el mismo primer paso. El diagrama de flujo del editor visualiza todos los saltos. ## Asignar y diseñar - **Productos** — asigna el formulario a productos sueltos o a colecciones enteras. Qué gana cuando se solapan y qué pasa con colecciones grandes: [Productos y colecciones](https://docs.getoptical.app/guias/productos-y-colecciones/). - **Diseño** — colores, tipografía y qué datos se muestran en el carrito. Ver [Diseño y carrito](https://docs.getoptical.app/guias/diseno-y-carrito/). - **Sincronizar** — publica los cambios en la tienda. Ver [Sincronización](https://docs.getoptical.app/guias/sincronizacion/). **Un producto, un formulario** Un formulario puede llevar tantos productos como quieras, pero **cada producto admite un solo formulario**. Si asignas aquí un producto que ya estaba en otro, **se lo lleva este** — sin avisarte y sin preguntar: el formulario anterior lo pierde en silencio. Antes de mover productos entre formularios, comprueba en cuál están. Y si lo que quieres es que la montura se venda también **sin** configurar, no hace falta otro formulario ni otro producto: el botón de tu tema sigue ahí ([Controlar cómo se compra cada montura](https://docs.getoptical.app/guias/evitar-compras-sin-configurar/)). Solo dos **formularios** distintos sobre la misma montura exigen dos productos. --- # Productos y colecciones > Las dos formas de decir en qué productos aparece un formulario, qué gana cuando se solapan y qué pasa con colecciones de muchos productos. Source: https://docs.getoptical.app/guias/productos-y-colecciones/ Language: es Un formulario aparece en una página de producto solo si se lo has asignado. Hay **dos formas** de hacerlo, y conviven: producto a producto, o por colección. Las dos viven en la pestaña **Productos** del formulario. ## Producto a producto Pulsa **Añadir productos**, elige en el selector de Shopify los que quieras y listo. Cada producto elegido queda vinculado a este formulario, y la lista de la tarjeta **Productos asignados** te enseña exactamente cuáles son. - **Cada producto admite un solo formulario.** Si eliges uno que ya estaba en otro formulario, se lo lleva este, sin preguntar. Antes de mover productos, comprueba en cuál están. - **Cada producto tarda unos segundos**, y se procesan uno detrás de otro: la app tiene que escribir en Shopify por cada uno. Diez productos son cosa de un minuto; cien, unos diez minutos con la pestaña abierta. Si vas a asignar muchos, hazlo por colección. ## Por colección Pulsa **Añadir colección** y elige una. A partir de ese momento **todos los productos de esa colección muestran el formulario**, incluidos los que entren en la colección más adelante, ya sea porque los añades a mano o porque una colección automática los capta por sus reglas. Esto funciona porque la app no toca los productos: apunta el formulario **en la colección**, y la página de producto mira en qué colecciones está cuando se carga. Por eso: - **Da igual cuántos productos tenga la colección.** Asignar una colección de 5 productos y una de 5.000 cuesta lo mismo y tarda lo mismo: un par de segundos. - **Quitar la colección** deshace la asignación de golpe para todos sus productos, en la siguiente carga de cada página de producto. - La tarjeta **Productos asignados** no lista los productos que llegan por colección: solo los que asignaste uno a uno. El contador de la pestaña te dice cuántas colecciones tiene el formulario. **La colección tiene que estar publicada en Tienda online** La página de producto solo ve las colecciones disponibles en el canal **Tienda online**. Una colección sin publicar en ese canal no muestra el formulario a sus productos aunque la hayas asignado. Si un producto de una colección asignada no enseña el botón, mira eso primero. ## Qué gana cuando se solapan Un producto puede estar asignado directamente y, además, pertenecer a una o varias colecciones asignadas. La regla es fija: 1. **La asignación directa del producto gana siempre.** Si un producto está en una colección asignada al formulario A pero tú lo asignaste a mano al formulario B, muestra B. 2. Si no tiene asignación directa, muestra el formulario de **la primera de sus colecciones asignadas**. Cuando un producto está en dos colecciones asignadas a formularios distintos, ese orden lo decide Shopify, no la app, así que no cuentes con él. En la práctica: usa las colecciones para el grueso del catálogo, y la asignación directa para las excepciones — la montura que necesita otro formulario, o el producto que quieres sacar de la regla general. ## Lo que no cambia - El formulario tiene que estar **Activo y sincronizado** para aparecer, se asigne como se asigne. Al asignar una colección, la app sincroniza el formulario si hacía falta. - Los productos sin asignación no muestran el botón, pero tu tema conserva **sus propios botones de compra**. Cómo tratar eso es una decisión tuya: [Controlar cómo se compra cada montura](https://docs.getoptical.app/guias/evitar-compras-sin-configurar/). - Si borras un formulario, sus asignaciones —productos y colecciones— se limpian con él. --- # Controlar cómo se compra cada montura > Tu tema trae sus propios botones de compra. Decide si esa montura se puede llevar sin lentes, y aplica tu decisión en la página de producto, en la barra fija y en los listados. Source: https://docs.getoptical.app/guias/evitar-compras-sin-configurar/ Language: es Antes de tocar nada, una decisión que es tuya: **esa montura, ¿se puede comprar sin lentes?** Las dos respuestas son válidas, y hay ópticas funcionando con cada una. La app no tiene opinión sobre esto: te deja las dos vías abiertas y eliges tú, producto a producto. | | Cuándo tiene sentido | |---|---| | **Solo configurada** | Lo más habitual. La montura se vende con su graduación y nunca suelta | | **Las dos cosas, a la vez** | Vendes también monturas sueltas, a otros profesionales o a clientes que se pondrán las lentes en su óptica de siempre | Lo único que no conviene es no haberlo decidido, porque entonces lo decide tu tema por ti. Esta página te enseña a ver qué hace hoy tu página de producto, y a dejarla como tú quieras. ## Los dos caminos de compra Optical Form añade **su** botón a la página de producto. Los botones de tu tema **siguen ahí**, y hacen algo distinto: | | Qué hace | |---|---| | **Botón de Optical Form** | Abre el formulario, recoge la graduación, añade montura + lentes + tratamientos | | **Botón de tu tema** | Añade la montura y ya está | La app **no borra los botones de tu tema**, y es a propósito. En tu catálogo casi seguro hay productos que se venden tal cual —estuches, líquidos, accesorios, gafas de sol sin graduar— y esos **necesitan** su botón de siempre. Quitarlo por nuestra cuenta rompería media tienda. ## La prueba de 30 segundos Sirve para las dos decisiones, porque no supone nada: solo te dice qué hace hoy tu página de producto. 1. Abre una página de producto que use formulario, **como si fueras un cliente**. 2. **No toques** el botón de Optical Form. 3. Intenta comprar la montura por cualquier otra vía. - **Si lo consigues y querías que se pudiera** — ya está, tienes los dos caminos abiertos. Salta a [Si quieres los dos botones](#si-quieres-los-dos-botones), que hay un detalle de claridad que sí conviene cuidar. - **Si lo consigues y no querías** — sigue leyendo. Hay tres sitios por donde se entra, y normalmente solo se cierra el primero. **Si tu decisión es «solo configurada», tómala antes de abrir** Un pedido que entra por el botón del tema **parece perfectamente normal**: se paga, aparece en tu panel, el cliente recibe su confirmación. Que le falta la receta se descubre en el taller, días después, con el dinero ya cobrado y el cliente esperando sus gafas. No es que se rompa nada — es que ese pedido no lleva lo que hace falta para fabricar. Por eso conviene hacer esta prueba **antes** de abrir la tienda al público, y no cuando ya está entrando gente. ## Dónde están los botones de compra directa Son tres, y vienen activos por defecto en la mayoría de temas modernos. Conviene saber dónde están, hayas decidido lo que hayas decidido: **1. El botón de compra de la página de producto** El "Añadir al carrito" de toda la vida, junto al precio y al selector de variantes. **2. La barra que aparece al bajar** El más fácil de pasar por alto, porque **no se ve al cargar la página**. Baja del todo en la página de producto: en muchos temas aparece una barra fija abajo con la foto, el precio y un botón de compra. En **Horizon viene activada por defecto**. **3. La compra rápida de los listados** En las páginas de colección, muchas tarjetas de producto traen un botón para añadir sin entrar en la página de producto. Ahí el cliente ni llega a ver tu formulario. **Los tres son puertas distintas** Cerrar solo el primero es lo que suele pasar. Si tu decisión es que la montura no se venda suelta, los otros dos la siguen vendiendo. ## Si quieres que esa montura solo se venda configurada La idea es sencilla: **una plantilla de producto aparte**, sin botones nativos, que uses únicamente en los productos que llevan formulario. El resto de tu catálogo se queda como está. ### Paso 1 — Crea la plantilla 1. **Tienda online → Temas → Personalizar**. 2. Arriba, en el selector de plantilla, elige **Producto**. 3. Despliega el selector y pulsa **Crear plantilla**. 4. Ponle un nombre reconocible, por ejemplo `graduadas`. Créala **a partir de** la plantilla de producto que ya usas. ### Paso 2 — Quita las vías de compra directa Con la plantilla nueva abierta: - Selecciona el bloque de **botones de compra** y **quítalo** (o desactívalo con el icono del ojo). - En los **ajustes de la sección** de producto, busca la opción de **barra de compra fija** (en Horizon, *Sticky add to cart*) y **desactívala**. - Deja el bloque de **Optical Form**, que es el que ahora lleva toda la venta. Guarda. ### Paso 3 — Asigna la plantilla a tus monturas En **Productos**, abre cada montura que use formulario y, en la barra lateral derecha, en **Plantilla de tema**, elige `graduadas`. Guarda. Puedes hacerlo en lote: selecciona varios productos → **Acciones** → cambiar plantilla. ### Paso 4 — La compra rápida de los listados Esta vive en las **colecciones**, no en la página de producto. En el editor, ve a la plantilla de colección y **desactiva el botón de compra rápida** de las tarjetas. Si tu tema no deja desactivarlo solo para algunos productos, tendrás que desactivarlo entero, y eso afecta también a los productos que sí se venden sueltos. Es el punto donde más merece la pena parar a valorar: cuánto te aporta ese atajo, frente a cuántas monturas sin graduar se colarían por ahí. ### Paso 5 — Repite la prueba de 30 segundos Vuelve a intentar comprar sin abrir el formulario. Ahora no deberías poder — ni en la página de producto, ni al bajar, ni desde la colección. ### Compruébalo antes de abrir al público - [ ] La plantilla nueva no tiene botón de compra en la página de producto - [ ] La barra fija al bajar está desactivada - [ ] Las tarjetas de colección no permiten compra rápida - [ ] Todas las monturas con formulario usan esa plantilla - [ ] Has intentado comprar sin configurar **y no has podido** - [ ] Un pedido de prueba llega con la graduación en las propiedades de la línea Cuando las seis estén marcadas, esa montura solo se vende configurada. ## Si quieres los dos botones No hay que hacer nada especial: es el estado por defecto. El botón de tu tema y el de Optical Form conviven en la misma página de producto, y el cliente elige. Lo único que pide esto es **que se entienda cuál hace qué**. Dos botones seguidos que ponen los dos "Añadir al carrito" son una trampa: el cliente pulsa el primero que ve y se lleva una montura pelada creyendo que ha comprado gafas. Eso acaba en devolución, y la devolución es tuya. - **Ponle nombre al de Optical Form.** En **Tienda online → Temas → Personalizar**, pulsa el bloque **Optical Form** y escribe en *Texto del botón* algo que diga lo que hace: «Configurar con mi graduación», «Añadir lentes graduadas». Ver [El botón del producto](https://docs.getoptical.app/guias/boton-del-producto/). - **Ponle nombre también al de tu tema**, desde los ajustes de tu tema: «Comprar solo la montura». - **Que destaque el que quieres que gane.** Si tu venta principal es la graduada, que ese sea el botón de color y el otro más discreto. **Si vendes en varios idiomas** Si escribes un texto propio en *Texto del botón*, **ese texto sale igual en todos los idiomas**: deja de traducirse solo. Con una tienda en un idioma da igual; con varios, o lo traduces tú desde el editor de cada idioma, o dejas el campo vacío y usas el texto de la app. Ver [Idiomas y textos](https://docs.getoptical.app/guias/traducciones/). Y aun con los dos botones, plantéate quitar la **compra rápida de los listados**: ahí el cliente no ve los dos botones ni la diferencia entre ellos, así que la elección que le ofreces no llega a existir. ## Cómo hago… **…si vendo las mismas monturas con y sin graduación** Tienes dos formas, y la buena depende de cómo quieras que se vea: - **Un solo producto con los dos botones** — lo de la sección de arriba. El cliente ve una página de producto y elige ahí mismo. Es lo más directo y lo que menos catálogo te crea. - **Dos productos distintos** — uno con la plantilla `graduadas` y formulario, otro normal. Es más trabajo, pero te deja poner precios, fotos y textos distintos, y salen por separado en las colecciones y en el buscador. **…si mi tema no me deja quitar el botón de compra** Algunos temas no permiten eliminar ese bloque. Entonces la vía es el campo **Custom CSS** de la incrustación de la app, ocultándolo solo en esa plantilla. Escríbenos y te pasamos la regla para tu tema. **…si quiero comprobarlo sin publicar** Duplica el tema, haz los cambios en la copia y previsualízala. Recuerda que la Guía de configuración de la app mira **el tema publicado**, así que los pasos de la incrustación y del bloque seguirán marcados sobre el que tengas en vivo. --- # Graduación y receta > Qué significa cada valor de una receta, cómo se captura por ojo y cómo llega al pedido para tu laboratorio. Source: https://docs.getoptical.app/guias/graduacion/ Language: es Si vienes de Shopify y no de la óptica, empieza por el glosario. Configurar bien este paso es mucho más fácil cuando sabes qué le estás pidiendo al cliente. ## Glosario: qué es cada valor Una receta de gafas es una lista de números, uno por cada ojo. Esto es lo que significan: | Abreviatura | Nombre | Para qué sirve | |---|---|---| | **OD** | Ojo derecho | Del latín *oculus dexter*. Es el derecho en cualquier país | | **OI** / **OS** | Ojo izquierdo | En español **OI**; en inglés se escribe **OS** (*oculus sinister*) | | **ESF** / **SPH** | Esfera | La corrección principal. **Negativa** para miopía (ve mal de lejos), **positiva** para hipermetropía (ve mal de cerca) | | **CIL** / **CYL** | Cilindro | Corrige el astigmatismo: la córnea no es del todo redonda y la imagen sale deformada. Suele ser negativo, y puede ser 0 | | **EJE** / **AX** | Eje | En qué ángulo va colocado ese cilindro, de 0 a 180 grados. Solo tiene sentido si hay cilindro | | **ADD** | Adición | Potencia extra para ver de cerca. Aparece en progresivas y bifocales, a partir de los cuarenta y pico. Siempre positiva | | **DIP** / **PD** | Distancia interpupilar | Los milímetros entre el centro de una pupila y la otra. Sirve para centrar las lentes delante de los ojos. En adultos suele estar entre 54 y 74 mm | Las dioptrías se miden de 0,25 en 0,25. Por eso los desplegables saltan así: `-1.00`, `-1.25`, `-1.50`… **Por qué importa que el cliente lo copie bien** Estos números se fabrican tal cual. Un cliente que se equivoca de signo, o que cambia el ojo derecho por el izquierdo, recibe unas gafas con las que no ve. Por eso conviene incluir un paso de resumen para que confirme antes de pagar. ## Los dos tipos de paso - **Graduación (Rx)** — receta completa, con todos los valores de arriba. Para gafas graduadas de verdad. - **Receta de lectura (rejilla)** — solo una ampliación (`+1.00`, `+1.50`…). Para gafas de lectura premontadas, las que se venden ya hechas y no llevan receta. ## Paso Graduación (Rx) Captura los valores de cada ojo: **OD** (derecho) y **OI** (izquierdo). ### Rangos de cada campo Cada campo tiene **Mín**, **Máx** y **Paso** configurables. Ajústalos a lo que tu laboratorio pueda fabricar: si no trabajas graduaciones por debajo de -8, ponlo de mínimo y el cliente no podrá pedirlas. - **Mostrar campo ADD** — actívalo solo si vendes progresivas o bifocales. En gafas normales sobra y confunde. ### El eje se activa con el cilindro Los tres valores de cada ojo —esfera, cilindro y eje— arrancan **vacíos**. No en `0.00`: un cero es un valor clínico real, quiere decir «sin astigmatismo», y no puede confundirse con «esto todavía no lo he rellenado». El campo de **eje** arranca además **desactivado**, en gris y sin poder tocarse. Se activa solo cuando el cliente escribe un cilindro distinto de cero, porque un eje sin cilindro no significa nada: es el ángulo de algo que no existe. Si el cliente vuelve atrás y quita el cilindro, el eje se vacía y se desactiva otra vez. Y al revés: **si hay cilindro, el eje es obligatorio.** La app no deja pasar de paso hasta que se rellene. **El cilindro también puede venir en positivo** En España las recetas suelen traer el cilindro en negativo, pero buena parte de Europa lo escribe en positivo, y las dos notaciones son igual de válidas. El eje se activa con **cualquier** cilindro distinto de cero, tenga el signo que tenga. Esto no se configura en ninguna parte: funciona así siempre, en todos los formularios. ### Distancia interpupilar - **Mostrar DIP** — añade la captura de la distancia interpupilar. - **Cómo la introduce el cliente** — *campo libre* (escribe el número; es lo de siempre) o *desplegable con los valores admitidos*. El desplegable evita erratas y valores que tu laboratorio no fabrica; el campo libre es más rápido para quien se sabe su DIP. Empieza en «—»: nadie tiene una DIP por defecto. - **Rangos en mm** — el valor único (por defecto 40 a 85, de 0,5 en 0,5) y el valor por ojo (20 a 45). Son a la vez lo que ofrece el desplegable y lo que acepta el campo libre: un cliente que escriba 6 en vez de 63 recibe un aviso, no un pedido imposible. - **DIP único o por ojo** — un solo número (lo habitual), o uno por ojo. El cliente lo cambia con un interruptor. - **Mensajes de validación** — qué se le dice si lo deja vacío. **Por defecto, lo sencillo** El interruptor de DIP por ojo arranca **desactivado**: el cliente escribe un único número salvo que lo active. La mayoría de recetas traen un solo valor, así que el caso común queda con menos fricción. ### El cliente tiene ayuda en cada campo Tu cliente no es óptico. Tiene la receta en la mano y no sabe qué es un cilindro, ni si el eje va con signo, ni cuál de los números es la distancia interpupilar. Por eso cada campo del paso lleva un pequeño **«?»** a la derecha de su etiqueta —ESF, CIL, EJE, ADD y el título de la DIP— que al pasar el ratón, tocarlo o llegar con el teclado abre una explicación corta, en palabras llanas: qué es ese valor, qué signo lleva y dónde encontrarlo en la receta. Viene activado en todos los formularios, con textos ya escritos en el idioma de tu tienda. No tienes que hacer nada. Lo que sí puedes hacer: - **Desactivarlo** — en la configuración del paso, desmarca *Mostrar un icono de ayuda junto a cada campo de la receta*. Desaparecen los cinco «?» a la vez. - **Reescribir los textos** — en *Etiquetas y traducciones* del mismo paso, bajo *Textos de ayuda*. Cada campo aparece vacío con el texto por defecto **en gris, en el idioma de tu tienda** — el mismo que lee tu cliente. Escribe encima si quieres decirlo a tu manera —por ejemplo, con la notación que usa tu laboratorio— y **si vacías el campo, vuelve al texto por defecto** (cómo funciona, en [Idiomas y textos](https://docs.getoptical.app/guias/traducciones/)). Los textos de ADD y DIP solo aparecen si tienes esos campos activos. - **Traducirlos** — como el resto de etiquetas, desde la pestaña de cada idioma. Ver [Idiomas y textos](https://docs.getoptical.app/guias/traducciones/). Los «?» usan los mismos ajustes de color, tamaño y fondo que los de las opciones del formulario. Se cambian en [Diseño y carrito](https://docs.getoptical.app/guias/diseno-y-carrito/), sección *Ayuda emergente*. ### Y una receta de ejemplo Arriba a la derecha del paso hay un enlace, **«¿Cómo leer tu receta?»**, que abre una receta de ejemplo montada con **tus propias etiquetas**: dos ojos con ESF, CIL y EJE (y ADD si lo tienes activo), y la DIP debajo. El cliente toca una columna y la app la resalta y le explica ese valor con el mismo texto de ayuda del «?» correspondiente. Es lo que más ayuda a quien tiene la receta en papel delante: ve dónde está cada número en un ejemplo que se parece al suyo. Viene activado. Se desactiva en la configuración del paso (*Mostrar un enlace «¿Cómo leer tu receta?»…*), y el texto del enlace, el título sobre el ejemplo y el texto de ayuda de debajo se reescriben en *Etiquetas y traducciones*, bajo *Guía con receta de ejemplo*. Las explicaciones son las mismas de los «?»: si cambias una, cambia en los dos sitios. ### Cambiar las etiquetas Todo el texto del paso se puede reescribir sin tocar código. Antes de hacerlo lee **[Idiomas y textos](https://docs.getoptical.app/guias/traducciones/)**: los campos vienen rellenos en inglés y eso tiene truco. ## Paso Resumen de graduación Muestra al cliente la receta que acaba de introducir **antes** de añadir al carrito: una tabla con tus etiquetas de cabecera (ESF, CIL, EJE y ADD si la hay), una fila por ojo y la DIP debajo — el mismo dibujo que la receta de ejemplo del paso anterior, para que no tenga que adivinar en qué orden van los números. Ponlo siempre que captures recetas completas. Es la última oportunidad de que el cliente detecte un error suyo, y te ahorra devoluciones. Si el cliente **subió una foto** de su receta en vez de teclearla, el resumen le enseña **la imagen**, no solo el nombre del archivo. Es la diferencia entre confirmar `receta.png` y confirmar los números que se van a fabricar: un archivo equivocado —el recibo del gimnasio, una captura de otra cosa— se ve al instante. Si lo que subió es un **PDF**, que no se puede dibujar, aparece un icono de documento con el nombre y el peso. ## Paso Receta de lectura (rejilla) Para gafas de lectura premontadas, donde el cliente solo elige una ampliación. - **Valor mínimo**, **máximo**, **paso** y **columnas** de la cuadrícula. - **Prefijo del valor** — normalmente `+`, para que se lea `+1.50`. - Vista previa en vivo de cuántos valores genera. ## Cómo llega la receta al pedido Cuando el cliente añade al carrito, la receta viaja **dentro del pedido de Shopify**, junto al producto. La ves en el detalle del pedido, en tu admin de siempre, y viaja también a lo que mandes a tu laboratorio. Se escribe una línea por ojo, con cada valor **precedido de la etiqueta de su campo** —las tuyas, en el idioma del cliente— para que cualquiera la lea sin saber en qué orden van los números: ``` Tipo de gafas: Gafas graduadas Tipo de lente: Lentes finas estándar OD: ESF -2.50 · CIL -1.25 · EJE 90° · ADD +1.50 OI: ESF -3.00 · CIL 0.00 · EJE — · ADD +2.00 DIP: 63 ``` Un ojo sin cilindro no lleva eje: se imprime `EJE —`, igual que la adición cuando solo la lleva un ojo — nunca un `0°` inventado que un óptico leería como un eje real. Es la misma línea que ve el cliente en el carrito, en el checkout y en el correo de confirmación. Si tienes una integración con tu software de gestión, la misma receta viaja además en la propiedad oculta que acordaste con él, con el formato que ese software espera (ahí un eje vacío sí va como `0`, porque es lo que pide su contrato). Ver [Integración](https://docs.getoptical.app/desarrolladores/integracion/). **La receta no se puede quitar del pedido** Hay una casilla para excluir pasos del carrito, pero **no aparece en los pasos que llevan la receta** ni en la subida de foto. Un pedido de gafas graduadas sin graduación no se puede fabricar, así que la app no te deja llegar a esa situación ni por error. Lo que sí decides es si el **cliente** ve esos valores. Mira [Diseño y carrito](https://docs.getoptical.app/guias/diseno-y-carrito/). Si el cliente sube una foto de su receta en vez de teclearla, en el pedido aparece el nombre del archivo. Ver [Subir la receta](https://docs.getoptical.app/guias/subir-receta/). --- # Subida de archivo > Deja que el cliente adjunte su receta como imagen o PDF. Source: https://docs.getoptical.app/guias/subir-receta/ Language: es El paso **Subida de archivo** permite al cliente adjuntar su receta (foto o PDF) en lugar de escribir los valores a mano. Ideal como alternativa al paso de [Graduación](https://docs.getoptical.app/guias/graduacion/) o como complemento. ## Configuración - **Tipos de archivo aceptados** — extensiones separadas por coma, ej. `.jpg,.png,.pdf`. - **Tamaño máximo (MB)** — límite de peso del archivo. ## Zona de subida Todo el texto es editable: el texto principal de la zona de arrastre, el texto secundario (hint), el botón de explorar, y los textos del estado con archivo seleccionado (**Cambiar archivo** / **Quitar archivo**). ## Validación Mensajes personalizables para: - **Archivo obligatorio** — cuando el paso es obligatorio y no se adjunta nada. - **Archivo demasiado grande** — usa `{maxSize}` como marcador en el texto. - **Tipo de archivo no permitido** — usa `{types}` como marcador. ## En el resumen Puedes definir el **texto de la etiqueta del pie** que representa el archivo subido en el carrusel de selecciones y en el resumen. Si el paso de subida va dentro de un paso de **Graduación** y detrás pones un [Resumen de graduación](https://docs.getoptical.app/guias/graduacion/#paso-resumen-de-graduación), ahí el cliente ve **la imagen que subió**, no solo su nombre. Con un PDF aparece un icono de documento con nombre y peso. No hay que activar nada. --- # Complementos, colores, accesorios y acciones externas > Las formas de vender extras, ofrecer colores dentro de una opción y llevar opciones fuera del carrito. Source: https://docs.getoptical.app/guias/accesorios-y-addons/ Language: es Optical Form tiene cuatro mecanismos para cobrar extras y dirigir al cliente más allá de una simple selección. Es importante no confundirlos. ## Complementos (por opción) Un **complemento** es un producto de Shopify vinculado a **una opción concreta**. Cuando el cliente elige esa opción, el complemento se añade al carrito como **línea separada** y suma su precio al total en vivo. - Se configuran en la sección **Complementos** de cada opción. - Cada complemento tiene una **cantidad** — pon **2** para artículos que se facturan por pares (ej. lentes). - **Su precio es el suplemento**, no el total: la montura ya tiene el suyo. Ver [Precios y cobro](https://docs.getoptical.app/guias/precios-y-cobro/). - Ejemplos típicos: el tipo de lente, un tratamiento (antirreflejante, filtro azul), un servicio de montaje. **Crea productos para los complementos** Los complementos son productos reales de Shopify. Créalos para tipos de lente, tratamientos y servicios con el estado **No listado** (se pueden comprar, pero no aparecen en colecciones ni en el buscador; un producto sin publicar o en borrador **no se puede añadir al carrito**), y luego vincúlalos. Así Shopify los factura, los incluye en el pedido y los envía a tu laboratorio. **Los complementos pertenecen a esta tienda** Un complemento guarda el identificador que Shopify le da a ese producto **en tu tienda**, y ese número no existe en ninguna otra. Por eso los complementos **no se copian** al exportar un formulario a otra tienda, y por eso la plantilla de ejemplo viene sin ellos: los vinculas tú con tus productos. Lo explicamos en [Copiar un formulario a otra tienda](https://docs.getoptical.app/guias/copiar-formulario/). **Los complementos se cobran todos; los colores, solo el elegido** Si vinculas como complementos **varias variantes del mismo producto** —gris, ámbar y verde de un mismo tinte—, el cliente que elija esa opción se lleva **las tres** al carrito y paga las tres. Casi siempre lo que querías era que **eligiera una**: para eso están los [colores seleccionables](#colores-seleccionables-por-opción). El editor lo detecta y te lo propone con un aviso y un botón, **Convertirlos en colores seleccionables**; se abre el selector con esas variantes ya marcadas y, al confirmar, pasan de complementos a colores. Si cancelas, no cambia nada. ## Colores seleccionables (por opción) Una opción puede llevar una **fila de muestras de color** debajo: perfecta para lentes polarizadas, tintadas o fotocromáticas que se fabrican en varios colores. El cliente toca un color y **solo ese color se cobra** — a diferencia de los complementos, que se suman todos, los colores son alternativas. Tocar la tarjeta sin elegir color solo la **abre** (borde discontinuo y la frase «Elige un color para continuar»): la opción cuenta como elegida cuando el cliente toca un color. - Se configuran en la sección **Colores seleccionables** de cada opción, con el mismo selector de productos que los complementos: **cada color es una variante de Shopify**, con su SKU y su precio. Así Shopify lo factura, lo incluye en el pedido y tu laboratorio recibe la referencia exacta del color elegido. - Cada color tiene un **nombre** (lo que lee el cliente, traducible como cualquier otro texto) y una **muestra**, que es la **imagen de la propia variante**: ponle a cada variante de color su foto de muestra en Shopify y no hay nada más que configurar. Solo si una variante no tiene imagen se usa el campo de color CSS — `#8b5a2b`, o un degradado como `linear-gradient(#555, #ddd)`. - Si los colores tienen precios distintos, la tarjeta muestra el más barato hasta que el cliente elige — nunca anuncia menos de lo que se puede acabar pagando. - Al pasar por una muestra de color aparece su **nombre** (y el recargo, si lo dejas activado en Diseño › Opciones); si los colores cuestan distinto, la tarjeta dice «Desde» hasta que el cliente elige. - El cliente **no puede continuar sin elegir color**: una opción con colores y sin color es una elección a medias, y el pedido saldría sin la referencia que tu laboratorio necesita. - Cada opción —y cada grupo de colores— admite un **texto de ayuda**: aparece un «?» junto al título que el cliente abre para leer una explicación más larga. Ver [Crear un formulario](https://docs.getoptical.app/guias/crear-formulario/#anatomía-de-una-opción). **¿Complemento o color?** Usa un **complemento** para algo que la opción siempre incluye (un tratamiento, un servicio). Usa **colores** cuando la opción se fabrica en varias versiones y el cliente debe elegir exactamente una. **Lo agotado se ve antes de elegirlo** Al abrir el configurador, la app consulta el stock de todos los complementos, colores y accesorios del formulario. Lo que no se puede vender —una variante con seguimiento de inventario a 0 que no admite pedidos sin stock, un producto en borrador o archivado, un producto que **no está en el canal Tienda online**, o uno que se ha eliminado de Shopify— se muestra **desactivado con «Agotado»**: la tarjeta de la opción, la del accesorio, y en los colores la muestra de color **tachada**, como en el selector de variantes de tu tema. El cliente no puede elegirlo y, si ya lo tenía elegido —de una visita anterior, o porque lo eligió antes de que llegara la respuesta del stock—, se le quita y el panel se lo dice: **«X ya no está disponible. Vuelve atrás y elige otra opción.»** Si ese paso exige una respuesta, no puede seguir ni añadir al carrito hasta que elija otra. En **Diseño › Opciones** puedes preferir **ocultarlo** en vez de desactivarlo; si ocultar dejara un paso sin nada que elegir, se muestran desactivados igualmente. Un producto **No listado** sigue vendiéndose: solo desaparece de colecciones y buscador. El editor te avisa de lo mismo desde tu lado, sin que pulses nada: al abrir la pestaña **Pasos** comprueba los productos del formulario y pone una etiqueta junto al complemento, color o accesorio afectado — «Agotado», «Borrador», «No está en Tienda online» o «Eliminado». Si alguno está en borrador, archivado o fuera del canal Tienda online, además sale un aviso rojo encima de los pasos, **«Productos de este formulario que no se pueden añadir al carrito»**, con cada producto y su motivo: mientras siga así, Shopify rechazaría el pedido entero de quien lo eligiera. Cómo arreglarlo: [poner un producto en el canal Tienda online](https://docs.getoptical.app/empezar/antes-de-empezar/#cómo-poner-un-producto-en-el-canal-tienda-online). **Comprobar precios** enseña la misma lista. **¿Grupos de colores? Un producto por grupo** ¿Quieres colores agrupados — Classic, Fashion, Gradient — como en las grandes tiendas de gafas? Crea **un producto de Shopify por grupo** («Tinte Classic», «Tinte Fashion», «Tinte Gradient»), cada uno con sus variantes de color, y vincula las variantes de los tres **bajo la misma opción**. La app detecta que vienen de productos distintos y convierte la opción en un **desplegable**: al elegirla se abren los grupos, uno por producto, cada uno con su **título** (el nombre del producto, editable y traducible), una **descripción** opcional y sus colores. Si los grupos cuestan distinto, cada uno enseña su precio y la cabecera de la opción no enseña ninguno; si cuestan igual, el precio va en la cabecera. El cliente toca el color que quiere: un solo gesto elige el grupo y el color, y al pedido va solo esa variante. ## Accesorios / cross-sell (paso propio) Un paso de tipo **Accesorios (cross-sell)** ofrece productos extra **opcionales** en su propio paso: estuches, limpiadores, cordones, etc. - **Seleccionar productos** — elige los que se ofrecen como cross-sell. - **Mostrar opción de saltar** — muestra una tarjeta "Continuar sin accesorios". Si está activa, el paso es opcional aunque esté marcado como *Obligatorio*. - Etiquetas editables: etiqueta y descripción de saltar, error de selección y etiqueta de resumen. **Diferencia clave:** un complemento depende de elegir una opción; un accesorio es un paso independiente de venta cruzada. Un accesorio agotado se muestra desactivado con «Agotado» (u oculto, según Diseño › Opciones), igual que los complementos y los colores: ver la nota de arriba. ## Acción externa (por opción) En lugar de añadir una opción al carrito, puedes convertirla en una **acción externa**: muestra un mensaje y un botón personalizados. - **Mensaje** — ej. "Solo en tienda". - **Texto del botón** — ej. "Reservar una cita". - **URL del botón** — admite `https://`, y también `tel:`, `mailto:`, `sms:` y `https://wa.me/`. Útil para productos solo disponibles en tienda física, reservas de cita o enlaces de contacto directo (WhatsApp, teléfono, email). --- # Precios y cobro > De dónde sale cada euro del total, por qué el precio del complemento es el suplemento y no el total, y los errores que hacen cobrar de más o de menos. Source: https://docs.getoptical.app/guias/precios-y-cobro/ Language: es Esta página explica **de dónde sale cada euro** que ve el cliente. Si algún total no te cuadra, la respuesta está aquí. ## La fórmula ``` Total = precio de la montura + precio de cada addon elegido × su cantidad + accesorios que añada el cliente ``` Nada más. No hay márgenes ocultos ni cálculos propios de la app: **cada línea es un producto de Shopify con su precio**, y el total es la suma. Por eso el total del formulario y el del carrito siempre coinciden — es el mismo cálculo. ## 🔴 El complemento es el suplemento, no el total El error más caro, y el más fácil de cometer. La montura **ya tiene su precio**. Cuando creas el producto "Lente fina 1.60", su precio debe ser **lo que cobras de más** por esa lente, no lo que vale el conjunto. | Montura | Lente fina | El cliente paga | |---|---|---| | 100 € | **15 €** ✅ | 115 € | | 100 € | ~~115 €~~ ❌ | 215 € | Suena obvio escrito, pero es fácil pensar en "gafa completa" al crear el producto. La regla sencilla: **si la montura sola vale 100 €, tus complementos son lo que sumas a esos 100 €**. ## Lo que va incluido: créalo a 0 € Puede parecer inútil crear un producto que vale 0 €, pero tiene dos motivos: 1. **El cliente ve "Incluido"** en vez de un hueco vacío. Comunica valor: la lente estándar entra en el precio. 2. **La línea llega al pedido**, y tu laboratorio sabe qué lente montar. Sin producto, esa información no viaja a ninguna parte. Ejemplo típico: *Lente monofocal estándar 1.50 — 0,00 €*. **Cambiar la etiqueta** Si prefieres que ponga otra cosa en vez de "Incluido", se cambia en **Apariencia → Etiqueta de incluido**. Déjala vacía y se usa el texto traducido de la app. ## Cantidad: el caso de las lentes Cada complemento tiene una **cantidad**. Por defecto 1. Las lentes se venden **por pares**, así que si el precio de tu producto es *por lente*, pon **cantidad 2**. Si el precio ya es el del par, déjala en 1. Las dos formas valen. Lo que no vale es mezclarlas sin darte cuenta: decide una y aplícala a todas tus lentes. ## 🔴 El distintivo no cobra En cada opción puedes poner un **distintivo informativo**: un texto pequeño junto al nombre. > **Es solo texto. No suma nada al total.** Si escribes `+30 €` en el distintivo pero no vinculas un complemento, el cliente **verá 30 € y pagará 0 €**. Es un error silencioso: nada falla, simplemente cobras de menos, y lo descubres cuadrando caja. **Úsalo para cosas que no son precio** —"Solo en tienda", "Más vendido", "Nuevo"— y deja que los precios los muestre el complemento, que es el que cobra de verdad. ## Qué ve el cliente mientras elige - **El total se actualiza en vivo** con cada selección. - Las opciones con complemento muestran su suplemento; las de 0 € muestran "Incluido". - El suplemento se lee **«+70,00 €»** por defecto. Puedes cambiar cómo se escribe en **Diseño → Textos de la interfaz → Precios y resumen → Suplemento de una opción**, por idioma: `{price} extra` da «70,00 € extra» y `Añade {price}` da «Añade 70,00 €». Se aplica en la tarjeta y en los colores con recargo. Sin el «+», el cliente puede leer el importe como el precio total: si lo que quieres es enseñar el total, usa el modo **Precio total** en la opción o en el paso; y si quieres el precio de la opción sin signo, **Solo el precio de la opción** ([los cuatro modos](#el-precio-de-cada-tarjeta-cuatro-modos)). - Puedes ocultar los precios por opción en **Apariencia → Mostrar ajustes de precio**, si prefieres enseñar solo el total. - En el modo **Precio de partida** (la tarjeta enseña lo que costaría el conjunto, no el suplemento), la palabra **«Desde»** solo aparece en las opciones desde las que el precio **aún puede subir**: porque les sigue un tratamiento con precio, un color con recargo, unas lentillas o un paso de accesorios. Una opción que termina el formulario, o a la que solo le siguen pasos gratuitos, enseña su total sin «Desde». No hay nada que configurar: la palabra sigue a cada opción. ### El precio de cada tarjeta: cuatro modos Qué importe enseña la tarjeta de una opción lo eliges tú en el editor del formulario: en cada paso, el desplegable **Precio que se muestra en las opciones**; y si una opción necesita otra cosa que el resto de su paso, en esa opción, **Precio que se muestra en esta opción**. Con una montura de 85 € y una opción cuyo complemento cuesta 25 €: | Modo | La tarjeta dice | Qué cuenta | |---|---|---| | **Solo el coste añadido** | «+25,00 €» | Lo que esa opción suma. Es el por defecto. | | **Precio de partida** | «Desde 110,00 €» | La montura, lo elegido hasta ahí, la opción y lo más barato que quede por elegir. Para un primer paso que reparte caminos. | | **Precio total** | «110,00 €» | La montura, lo elegido hasta ahí y la opción. Para un paso tras el que ya no se cobra nada. | | **Solo el precio de la opción** | «25,00 €» | Solo lo que cuesta esa opción: sin el «+», sin la montura y sin lo elegido en pasos anteriores. | **Solo el precio de la opción** es para los pasos en los que cada opción se lee como un producto con su precio —un paquete de lentes de 59 €— y no como un extra. Se nota sobre todo cuando un paso anterior ya ha cobrado algo: con un recargo de 35 € por montaje al espacio elegido antes, **Precio total** enseña ese paquete como «94,00 €» (suma lo ya elegido, para coincidir con el total del pie) y **Solo el coste añadido** como «+59,00 €». Con **Solo el precio de la opción** dice «59,00 €», y el recargo se queda en su paso y en el total. Tres detalles de ese modo: - Una opción de 0 € sigue mostrando "Incluido", igual que en **Solo el coste añadido**. - Si la opción lleva colores con recargos distintos, dice «Desde» hasta que el cliente elige uno. - El texto del suplemento que hayas escrito en Diseño no se aplica: la tarjeta enseña el importe solo. El modo solo decide **lo que se lee en la tarjeta**. El total del pie, el carrito y lo que se cobra son los mismos en los cuatro. ## En el carrito La montura y cada extra son **líneas separadas**, agrupadas visualmente bajo la montura: ``` Montura Archer ......................... 100,00 € └ Lente monofocal fina 1.60 ........... 15,00 € └ Antirreflejante premium ............. 30,00 € Total 145,00 € ``` Las líneas de complemento **no tienen selector de cantidad ni botón de borrar**: son parte del conjunto. Al eliminar la montura desaparecen todas. Que sean líneas separadas no es un detalle estético: es lo que permite que Shopify facture cada concepto, lo desglose en el pedido y lo envíe a tu laboratorio. ## Descuentos e impuestos - Los **descuentos automáticos** y los códigos funcionan con normalidad, pero muchos se aplican **en el checkout**, no en el carrito. Que el total del carrito no muestre el descuento no significa que no vaya a aplicarse. - Los **impuestos** siguen la configuración de tu tienda, como en cualquier otro producto. - Si vendes en **varios países o monedas** (Shopify Markets), el formulario enseña los precios **del mercado del visitante**: la montura y también cada suplemento, con el ajuste de precio o la moneda que tengas en ese mercado. Así el total coincide con el carrito y el checkout de ese país. No hay nada que configurar: se activa solo cuando la tienda vende en más de un país. Compruébalo desde el mismo país que tu cliente, o con el selector de país de tu tema. ## Comprobación antes de abrir Haz un pedido de prueba tú mismo y comprueba las tres cosas: - [ ] El total del formulario **coincide** con el del carrito - [ ] El total del carrito **coincide** con el del checkout - [ ] El pedido en tu panel trae **cada extra como su propia línea**, con su precio Si los tres cuadran, el cobro está bien montado. ## Cómo hago… **…que un tratamiento sea gratis solo en algunas monturas** Crea dos formularios, uno con el complemento a 0 € y otro con el precio normal, y asigna cada uno a su grupo de productos. **…subir el precio de un tratamiento** Cambia el precio del producto en Shopify. No hace falta tocar el formulario ni volver a sincronizar: el complemento apunta al producto, y el precio lo pone el producto. **…que un paquete de lentes enseñe su precio, sin «+» y sin sumarle nada** En el paso de los paquetes, pon **Precio que se muestra en las opciones** en **Solo el precio de la opción** y guarda. Cada tarjeta dirá lo que cuesta ese paquete; el total del pie sigue sumando la montura y lo elegido antes. **…ver cuánto me deja cada extra** Como son productos reales de Shopify, salen en tus informes de ventas por producto igual que cualquier otro artículo. --- # Diseño y carrito > Personaliza colores, tipografía, comportamiento y qué datos del formulario se muestran en el carrito. Source: https://docs.getoptical.app/guias/diseno-y-carrito/ Language: es La pestaña **Diseño** de cada formulario controla su apariencia, su comportamiento y qué información llega al carrito. Cada sección gobierna una zona concreta del panel. ## Comportamiento Activa o desactiva secciones del panel: - **Mostrar ajustes de precio** — muestra la diferencia de precio junto a cada opción (ej. `+$10.00`). - **Mostrar barra de progreso** — indica cuánto le queda al cliente. - **Mostrar paso de resumen** — añade un último paso de revisión antes de añadir al carrito. - **Mostrar el total en el botón Siguiente** — muestra el total acumulado en cada paso, no solo al final. ## Panel Posición y forma del panel: **anchura** (px), **posición** (derecha / izquierda / pantalla completa), **opacidad del fondo** (%) y **radio del borde** (px). ### Pantalla completa (escritorio) Con la posición en **Pantalla completa**, en escritorio el configurador ocupa toda la pantalla dividida **a partes iguales**: a la izquierda, la **imagen del producto** — con el nombre y la variante — y el **resumen en vivo** de lo que el cliente lleva configurado, con su total; a la derecha, los pasos. Si el cliente cambia de variante dentro del formulario (un color de montura, un pack), la foto y el nombre de la izquierda cambian con él. **Ancho máximo** (visible al elegir esta posición): en 0 el área usa toda la pantalla; por encima de 0 el contenido se centra y lo que sobra se convierte en márgenes laterales — para que en un monitor muy ancho el configurador no se desparrame. **Fondo de la columna de la imagen** (también solo en esta posición): el color de toda la mitad izquierda — foto, resumen y su margen lateral. Vacío sigue al fondo de las tarjetas. **Animación de entrada**: la pantalla completa no entra deslizándose como el panel lateral; aparece con un fundido y un gesto corto que eliges aquí — zoom, subida, dos mitades (la foto desde la izquierda y los pasos desde la derecha) o solo el fundido. Quien tiene activado «reducir movimiento» en su dispositivo ve siempre el fundido a secas — y lo mismo en el panel lateral: aparece con un fundido en vez de deslizarse, y los pasos cambian sin desplazarse. No hay que configurar nada: la app obedece la preferencia del dispositivo del cliente. En **móvil se mantiene el panel lateral** de siempre: una pantalla partida necesita anchura para existir. No cambia nada más — mismos pasos, mismos precios, mismo carrito. **Accesibilidad**: el panel es un diálogo modal de verdad. Mientras está abierto, el resto de la página queda inerte para el teclado y los lectores de pantalla; el foco entra al abrir, no se escapa con Tab y vuelve al botón al cerrar. La barra de progreso anuncia en qué paso va («paso 2 de 5»), todo lo enfocable lleva un anillo de foco de dos capas que se ve sobre cualquier color de fondo, y el botón «Atrás» del navegador retrocede un paso (en el primero, cierra el panel sin salir de la página de producto). No hay nada que configurar. ## Ayuda emergente Cada opción (y cada grupo de colores) admite un **texto de ayuda**: si lo rellenas, aparece un «?» junto al título que el cliente abre para leer una explicación más larga, con lo que la descripción puede quedarse en una línea. Se muestra al pasar el ratón o al pulsarlo, y se cierra tocando fuera. Esta sección viste esa burbuja, los «?» de [los campos de la receta](https://docs.getoptical.app/guias/graduacion/#el-cliente-tiene-ayuda-en-cada-campo) **y** la ayuda emergente con el nombre de cada color: **fondo** y **texto** (vacíos, siguen a los colores del formulario: blanco y negro por defecto, con un borde fino), **radio** (0 por defecto), **relleno** horizontal y vertical, **tamaño de letra**, **ancho máximo** de la burbuja de ayuda (0 = tan ancha como la columna de texto) y **color y tamaño del icono «?»**. Si no quieres que la ayuda emergente del color diga también el recargo («Gris (+€80,00)»), desactívalo en **Diseño › Opciones › Mostrar el recargo en la ayuda emergente del color**: queda solo el nombre, y el precio sigue bajo la fila al elegir un color. ## Plantilla de diseño Un aspecto completo en un clic, antes de tocar nada más: - **Clásica** — el panel de siempre, pegado al borde y compacto. - **Moderna** — más espacio, esquinas suaves, bordes finos y una escala de tipografía pensada; el panel flota como una tarjeta separada del borde. Es la que traen los formularios de ejemplo. - **Oscura** — la misma disposición que Moderna sobre fondo carbón, tarjetas grafito, tinta clara y acento bermellón. Pensada para gafas de sol y monturas premium: un configurador que parece parte del producto. Es la única plantilla que **trae sus propios colores**. Clásica y Moderna cambian espaciado, esquinas y tamaños de texto, **nunca tus colores**. Oscura sí los escribe al elegirla, y al volver a otra plantilla los devuelve a los valores por defecto — el panel te avisa si has cambiado algo desde que la aplicaste, con un botón para volver a aplicarla. Para un panel oscuro conviene usar los iconos del juego `on-dark/` del [pack de iconos](https://docs.getoptical.app/guias/iconos/): sobre fondo oscuro, los de fondo claro desaparecen. ## Colores **Acento**, **texto sobre acento**, **fondo**, **texto**, **texto atenuado** y **bordes** — para encajar con tu marca. Por defecto usan un acento neutro. ## Tipografía Tamaños y grosores para **encabezado**, **título del paso**, **descripción del paso**, **texto de las opciones** (título, descripción, precio y grosor del precio) y las **ventajas**. Bajo el título del paso, **Separación entre título y descripción** (8 px por defecto) mueve solo ese hueco; la distancia de la cabecera a las opciones no cambia. Las ventajas vienen en **automático**: se colocan un punto por debajo de la descripción de la opción y la siguen si la cambias, que es lo que mantiene la jerarquía de la tarjeta. Dales un tamaño propio solo si lo necesitas; el deslizador a cero vuelve a automático. ## Opciones Estilo de cada tarjeta: **padding** horizontal/vertical, **separación** entre opciones, **grosor del borde**, **tamaño de imagen** y la **etiqueta para opciones gratuitas** ("Incluido"). En un paso donde ninguna opción tiene precio —cómo nos envías la graduación, por ejemplo— las tarjetas no muestran esa etiqueta: «Incluido» solo aparece junto a un recargo. Y el espacio dentro de la tarjeta: **espacio a la derecha del texto** antes del precio (24 px en escritorio y 0 en móvil por defecto), **separación entre el título y la descripción** de la opción (2 px por defecto) y **espacio sobre las ventajas** (12 px por defecto). También el **hueco entre la imagen y el texto** y el **redondeo de la imagen** de la opción; el **encaje de la imagen**: **Entera** (por defecto) la enseña completa dentro de su cuadrado, y si no es cuadrada quedan márgenes; **Recortar para llenar** ocupa todo el cuadrado y corta los bordes, útil con fotos; las **ventajas** (relleno, forma píldora / redondeada / recta y separación entre ventajas); la **separación entre las muestras de color**; y la **tarjeta de accesorio** (su relleno y el hueco de la imagen al texto). Todos vienen por defecto con los valores que el panel usaba hasta ahora: no cambia nada hasta que los toques. La excepción es el encaje: antes la imagen se recortaba siempre, y ahora por defecto se ve entera. Con una imagen cuadrada, que es lo habitual, se ve igual. Para las opciones con [colores seleccionables](https://docs.getoptical.app/guias/accesorios-y-addons/#colores-seleccionables-por-opción): el **tamaño de las muestras de color** (por debajo de 32 px cuesta acertarles en el móvil), si la ayuda emergente que aparece al pasar por una muestra de color muestra también el **recargo** («Gris (+€80,00)») o solo el nombre, y el texto **«Elige un color para continuar»** — puedes reescribirlo, y decidir si se muestra bajo la fila de colores o solo como aviso sobre el botón Siguiente. **Complementos, colores y accesorios agotados**: qué hace el panel con lo que no se puede vender ahora mismo — mostrarlo **desactivado con «Agotado»** (por defecto; en los colores, la muestra de color tachada) u **ocultarlo**. Si ocultar dejara un paso sin opciones, se muestran desactivadas. Ver [lo agotado se ve antes de elegirlo](https://docs.getoptical.app/guias/accesorios-y-addons/#colores-seleccionables-por-opción). ## Navegación Barra de progreso y botones: **altura de la barra**, **tamaño/grosor/padding del botón**, el **carrusel de selecciones del pie** (mostrar en escritorio/móvil, prefijar con el nombre del paso) y el **contador de pasos** (palabra separadora, ej. "2 de 4"). **Espacio libre a la derecha del pie** — si tu tienda tiene un botón de chat en la esquina inferior derecha (WhatsApp, Tidio, Gorgias…), queda justo encima del botón *Siguiente* del panel. Este ajuste deja ese hueco vacío para que el chat flote sobre nada: unos 72 px bastan para el botón de chat habitual. Por defecto es 0 y el pie no cambia. **Mostrar la atribución de GetOptical en la cabecera** — desactivado por defecto en el plan de pago. Si lo activas, en la esquina superior izquierda del configurador aparece un icono de 24 píxeles (solo el icono, sin texto) que enlaza a la página de la app en el App Store. Es el patrón de atribución que Shopify permite a las apps en la tienda. En el plan gratuito de cortesía el icono forma parte del plan y se muestra siempre; el ajuste no aparece. **Recordar la configuración a medias** — desactivado por defecto; actívalo tú si lo quieres. Si el cliente cierra el configurador sin terminar y vuelve al mismo producto en los 7 días siguientes, en vez del primer paso ve «Tenías una configuración a medias» con dos botones: *Continuar donde lo dejaste* y *Empezar de nuevo*. Al continuar recupera lo que había elegido (con los precios de hoy, y solo las opciones que sigan existiendo) y vuelve al primer paso que le falte. Lo que **no** se recuerda: la graduación, la receta de lectura, las lentillas y los archivos, que vuelve a introducir. El borrador vive en el navegador del cliente, nunca en nuestros servidores, y se borra al añadir al carrito, al empezar de nuevo o a los 7 días. Desactívalo si varios clientes comparten un mismo dispositivo (un quiosco en tienda). Debajo, **«Ofrecer continuar a partir de N pasos completados»** (2 por defecto): con menos pasos hechos no se guarda nada, porque rehacer uno cuesta lo mismo que responder al aviso; súbelo si solo quieres rescatar a quien casi terminó. Los textos del aviso se cambian en Diseño › Textos, y en Analítica ves cuántos retoman. ## Resumen y Total La lista de selecciones y la línea de total: tamaños de **título**, **items** y **total**; **fondo** y **color del total**; una línea de **envío** (etiqueta + valor, ej. "Gratis (Peninsular)"); y la opción de **prefijar las líneas del resumen** con el nombre del paso. ## Qué ve el cliente de lo que eligió Debajo del producto, en el carrito, aparece lo que el cliente configuró: los pasos que eligió y su receta. Algo así: ``` Tipo de gafas: Gafas graduadas Tipo de lente: Lentes finas estándar OD: ESF -2.50 · CIL -1.25 · EJE 90° · ADD +1.50 OI: ESF -3.00 · CIL 0.00 · EJE — · ADD +2.00 DIP: 63 Accesorios: Funda rígida ``` Tienes dos interruptores para ocultarle esto **al cliente**: - **Ocultar los valores de graduación al cliente** - **Ocultar las etiquetas de selección al cliente** **Ojo: «ocultar» significa ocultar en todas partes** Aquí se equivoca casi todo el mundo, porque suena a que solo afecta al carrito. Cuando activas uno de estos interruptores, esos datos desaparecen de **todo lo que ve el cliente**: el carrito, el checkout, la página de estado del pedido **y el email de confirmación**. **Tú los sigues viendo** en el detalle del pedido, dentro de tu admin de Shopify, y viajan igual a tu laboratorio. Pero tu cliente ya no puede comprobar en ningún momento qué graduación pidió. Es todo o nada: Shopify no permite mostrar un dato en el email y esconderlo en el carrito. **Nuestra recomendación:** deja desactivado el de la graduación. Que el cliente reciba su receta por email es su única forma de detectar un error después de comprar, y a ti te ahorra la devolución. ### Quitar un paso concreto del pedido A veces hay un paso que no aporta nada al pedido: por ejemplo, uno que solo pregunta *cómo* quiere el cliente darte su graduación. Los propios valores de la receta ya lo dicen, así que esa línea solo alarga el carrito. Dentro de cada paso, en el editor, tienes la casilla **Ocultar del carrito y del pedido**. Y al lado, en los pasos de elección única, **Si este paso solo tiene una opción, elegirla y saltar el paso**: el cliente no ve esa pantalla, la opción va igualmente al pedido con su etiqueta, y el botón Atrás vuelve a la última pantalla que sí vio. Viene desactivada: si la única opción está ahí a propósito —un precio que enseñar, una condición que leer—, déjala desactivada. Un paso cuya única opción tenga colores seleccionables o un enlace externo se enseña siempre. Esa casilla **no aparece** en los pasos que llevan la receta ni en el de subir foto: un pedido de gafas graduadas sin graduación no se puede fabricar, así que la app no te deja llegar ahí. **Cuidado con los pasos que se llaman igual** Es habitual tener varios pasos titulados «Graduación» —el que pregunta el método, el que captura los valores, el de subir la foto—. Fíjate en la **etiqueta de color** que hay junto al título de cada paso: te dice de qué tipo es. También puedes rellenar el **ID interno** de cada paso («método», «valores», «foto») para distinguirlos de un vistazo. ## El bundle en el carrito El producto principal + lentes/complementos + accesorios se **agrupan como un bundle** bajo una sola línea, igual que se lee en el checkout. La relación se mantiene de forma nativa (`parent_id`) para el **borrado en cascada**, el **checkout** y los **emails de pedido** — si el cliente elimina el producto principal, se quitan también sus complementos. Ver [Integración con el tema](https://docs.getoptical.app/desarrolladores/integracion/) para el detalle técnico. ### Cómo se ve, lo decide tu tema La app **no aplica ni un estilo al carrito**. Lo que ves ahí —el sangrado de las líneas de complemento, los tamaños, los separadores— lo muestra tu tema, y así se mantiene coherente con el resto de tu tienda aunque cambies de plantilla. Los temas modernos como Horizon anidan las líneas del bundle por su cuenta. Si el tuyo no lo hace, o si quieres afinar cómo se ve, tienes tres ajustes en la incrustación de la app: - **Compactar las líneas de complementos** — deja las líneas de los complementos más pequeñas que la del producto principal, para que las gafas sigan siendo la protagonista y los extras se lean como parte de ellas. **Nace desactivada**, y activada solo cambia tamaños. - **Qué controles enseña cada línea del conjunto** — tres ajustes: **Complementos en el carrito** (con sus controles, sin controles u ocultos del carrito; por defecto, sin controles), **Ocultar el botón de eliminar de los accesorios** (por defecto, desactivado) y **Ocultar el selector de cantidad de las lentillas** (por defecto, activado). La incrustación nace con los controles que no sirven para nada bueno escondidos: la papelera de una lente solo rompe el conjunto, y el selector de una lentilla solo deshace lo que el configurador fijó. Si ya tenías la incrustación activada, conservas lo que elegiste. Ver [Botón y carrito](https://docs.getoptical.app/desarrolladores/boton-y-carrito/). - **CSS personalizado** — para cualquier ajuste que quieras hacer tú. En [Temas probados](https://docs.getoptical.app/guias/temas-probados/#cualquier-tema-las-clases-que-deja-la-integración-con-el-carrito) están las clases que la integración con el carrito deja en cada fila. **Por qué ahora es decisión tuya** Esconder un control nunca impidió la acción: quien quiera puede cambiar la línea igual. Lo que cambia desde la 1.5 es que **la app cuadra el conjunto ella misma**: un complemento cambiado por su cuenta vuelve a su sitio, si el cliente sube la montura los complementos suben con ella (o vuelve a 1, si eliges «Bloquear»), y si quita una lente, el conjunto entero se va (ver más abajo). Con el pedido a salvo, esconder controles es solo una cuestión de limpieza, y por eso te la dejamos a ti. Las reglas solo alcanzan a las filas de un conjunto de Optical Form: la papelera de otras apps —garantías, seguros de envío— no se toca. ### Si el cliente quita una lente Una montura «configurada» sin sus lentes es un pedido que el laboratorio no puede hacer. Si el cliente quita desde el carrito de tu tema una lente, un tratamiento o un color, la app **quita el conjunto entero** —la montura y el resto de sus complementos— y muestra un aviso corto en el carrito; puede volver a configurarla cuando quiera. Los accesorios no cuentan: quitar un líquido o una funda no toca nada más. Si en tu tienda una montura se puede comprar sola, **Si se quita una lente o un tratamiento**, en la incrustación de la app, tiene la opción «Conservar la montura y avisar»: la montura se queda marcada, con un aviso bajo la línea, y la decisión es tuya (el evento [`optical-form:cart:orphan`](https://docs.getoptical.app/desarrolladores/eventos/#optical-formcartorphan--en-el-carrito-falta-una-línea-del-conjunto) te lo cuenta). ### La cantidad, desde el carrito Si el cliente sube la cantidad de la montura en el carrito de tu tema, las lentes y los tratamientos se multiplican con ella; los accesorios van libres; y las lentillas vuelven a sus cajas, porque esas se eligen en el configurador. **Cantidad del conjunto desde el carrito**, en la incrustación de la app, elige entre «Escalar» (por defecto) y «Bloquear» (siempre 1 por conjunto, con un aviso). Detalle en [Temas probados](https://docs.getoptical.app/guias/temas-probados/#cambiar-la-cantidad-desde-el-carrito). --- # Ajustes en el editor de temas > Los dos sitios donde Optical Form pone ajustes en tu tema, qué hace cada uno, y el CSS personalizado. Source: https://docs.getoptical.app/guias/ajustes-del-tema/ Language: es Optical Form pone ajustes en **dos sitios distintos** del editor de temas, y confundirlos es la causa número uno de «lo he activado y no se ve nada». | | Dónde está | Qué controla | |---|---|---| | **La incrustación de la app** | Personalizar → **Incrustaciones de aplicaciones** | Lo general: el carrito, el CSS personalizado. Una vez para toda la tienda | | **El bloque** | Personalizar → plantilla **Producto** → Añadir bloque | **El botón**: cómo se ve y dónde va | La regla corta: **la incrustación hace que funcione, el bloque hace que se vea.** Con solo la incrustación, la página de producto no muestra nada. --- ## La incrustación (Apps) Personalizar → **Incrustaciones de aplicaciones** → **Optical Form Drawer**. ### Aspecto del carrito **Compactar las líneas de complementos.** Tu tema imprime cada complemento como una línea más, del mismo tamaño que el producto principal. Esta casilla las hace más pequeñas, para que las gafas sigan siendo la protagonista y los extras se lean como parte de ellas. **Nace desactivada**, y activada **solo cambia tamaños**: no esconde la cantidad ni el botón de eliminar. Está probada en Horizon 4.x; en otros temas no hace nada, porque el marcado al que se agarra no existe ahí. **Por qué no esconde el botón de eliminar** Es tentador esconderlo para que nadie descuadre el pedido. No sirve: esconder un control no impide la acción. Y esa fila la comparten otras apps —garantías, seguros de envío—, así que esconderles su papelera dejaría a tu cliente sin poder quitar un cargo que no es tuyo. ### CSS personalizado Un campo de texto para tus propias reglas. Se cargan **después** de las de la app y del tema, así que ganan sin que tengas que pelearte con la especificidad. Para qué se usa normalmente: ```css /* Achicar la fila de un complemento en el carrito (Horizon 4.x) */ .cart-items__nested-line .cart-items__title { font-size: 13px; } .cart-items__nested-line .cart-items__details { font-size: 12px; } ``` **Es CSS de TU tema, no de la app** Estas reglas apuntan a las clases que usa tu tema, y **esas clases cambian de un tema a otro**. Una regla escrita para Horizon puede no casar con nada en Dawn. Si cambias de tema, revisa este campo. Y no hace falta para el caso más común: la casilla de arriba ya trae la receta de Horizon hecha. ### Integración con el carrito **Después de añadir al carrito** — qué pasa al terminar el formulario: abrir el panel del carrito de tu tema, ir a la página del carrito, o no hacer nada. **«No hacer nada» en Horizon** Con «no hacer nada» la app no abre nada, pero tu tema sigue reaccionando como a cualquier añadido. Horizon abre su panel del carrito por su cuenta si tiene activado su propio ajuste **«Abrir el carrito al añadir»**: si no quieres que se abra, desactívalo en los ajustes del tema (Carrito), no aquí. **Mantener el carrito sincronizado** — cuando el cliente borra las gafas, se van también sus lentes y complementos. **Déjalo activado** salvo que sepas por qué lo desactivas: sin esto tu cliente puede quedarse con unas lentes sueltas en el carrito, sin montura. Y al revés: si el cliente borra las lentes desde el carrito de tu tema y deja la montura sola, la app lo detecta y pone un aviso bajo esa línea para que lo vea antes de pagar — un pedido de gafas graduadas sin lentes no se puede fabricar. No borra nada ni bloquea el pago; si quieres ir más allá, tu tema recibe un evento (ver [Integración](https://docs.getoptical.app/desarrolladores/integracion/)). Mientras la app recoloca las líneas justo después de añadir, el botón de pagar espera un instante. ### Avanzado Solo hacen falta si tu tema no es estándar y el ajuste automático falla: | | Para qué | |---|---| | **Abrir el panel del carrito desde el icono** | Si tu tema no abre su propio panel del carrito al pulsar el icono | | **Selector del contador del carrito** (CSS) | El número que va sobre el icono, si no lo encuentra solo | | **Selector del icono del carrito** (CSS) | El icono, si no lo encuentra solo | | **IDs de secciones a refrescar** | Las secciones del tema que deben actualizarse al añadir | | **Modo depuración** | Escribe en la consola del navegador lo que va haciendo. Para pasárnoslo si algo falla | **Déjalos vacíos primero** Todos se detectan solos en la mayoría de temas. Rellénalos solo si algo no funciona, y de uno en uno: así sabes cuál era. --- ## El bloque (página de producto) Personalizar → cambia la vista a **Producto** → **Añadir bloque** → **Optical Form**. Este bloque dibuja **el botón** que abre el formulario. Colócalo donde quieras, normalmente junto al de añadir al carrito. ### Ocultar el configurador en un producto concreto Al final de los ajustes del bloque, en *Avanzado*: **Etiqueta de producto que oculta el configurador** — por defecto, `optical-form-off`. Un producto que lleve esa etiqueta **no enseña el botón**, aunque tenga un formulario asignado o pertenezca a una colección asignada. Es la forma de dejar fuera un producto concreto sin tocar colecciones ni formularios: una montura de exposición, un modelo que solo vendes sin lentes, un producto en liquidación. La etiqueta se escribe en el producto, en tu admin de Shopify (*Productos › el producto › Etiquetas*), tal cual, respetando mayúsculas y minúsculas. Si prefieres otra palabra, cámbiala aquí. Si vacías el campo, el interruptor deja de existir. En el editor de temas, un producto oculto por su etiqueta te lo dice en el hueco del botón; tus clientes no ven nada. ### Contenido del botón **Texto** (déjalo vacío para usar el traducido por defecto), **icono** (opcional, desde tus archivos), **posición del icono** (izquierda o derecha) y **separación entre icono y texto**. ### Colores Fondo, texto y borde, cada uno con **su versión al pasar el ratón**. Seis en total, para que encaje con tu marca en los dos estados. ### Forma y tipografía **Radio de las esquinas**, **grosor del borde**, **grosor de la letra**, **espaciado entre letras** y **mayúsculas** (normal, TODO MAYÚSCULAS, Tipo Título). ### Escritorio y Móvil Los mismos siete ajustes, **por separado** para cada tamaño de pantalla: - **Ajustar al texto** — el botón ocupa solo lo que necesita, en vez de todo el ancho - **Anchura**, **relleno vertical** y **horizontal** - **Tamaño de letra** - **Alineación del contenido** — centrado, o texto e icono separados a los extremos - **Tamaño del icono** **Empieza por móvil** Más de la mitad de tus clientes compran ahí, y un botón que en escritorio se ve bien puede quedar apretado en un teléfono. El editor te deja alternar entre las dos vistas sin salir. ### Avanzado — integración con el tema **Selector del campo de variante (CSS)** — solo si tu tema no usa el campo de variante estándar. Le dice al formulario dónde leer qué variante ha elegido el cliente, para llevarse la correcta al carrito. Déjalo vacío salvo que el formulario esté añadiendo la variante equivocada. --- ## Cuando algo no encaja 1. **No se ve el botón** → falta el bloque, o el formulario no está *Activo + Sincronizado*. Ver [Instalar](https://docs.getoptical.app/empezar/instalacion/). 2. **El carrito se ve raro** → mira primero la casilla de compactar; el CSS personalizado es el último recurso. 3. **Se añade la variante equivocada** → el selector de variante del bloque. 4. **Nada de lo anterior** → activa el **modo depuración**, reproduce el problema y mándanos lo que salga en la consola. --- # Temas probados > Los temas de Shopify en los que hemos comprobado el carrito de Optical Form, el CSS que dejamos listo para cada uno y qué hacer si tu tema no está en la lista. Source: https://docs.getoptical.app/guias/temas-probados/ Language: es Optical Form añade la montura y cada complemento como **líneas separadas** del carrito, agrupadas bajo la montura. Cómo se ve ese grupo depende del tema: cada uno muestra sus líneas a su manera, y no todos saben anidarlas. Aquí están los temas en los que **nuestro equipo ha probado el carrito de principio a fin** —añadir desde el formulario, panel del carrito abierto, líneas visibles, receta legible— y lo que hay que ajustar en cada uno para que quede pulido. ## La tabla | Tema | Versiones | Estado | Qué hacer | |---|---|---|---| | **Horizon** | 2.0.1 · 4.1 – 4.2.0 | ✅ Es nuestra referencia: complementos agrupados bajo la montura, sin controles propios. 4.1 probado en escritorio y móvil; 4.2.0 (septiembre de 2026) en escritorio; 2.0.1 en una tienda real | Activar **Compact the add-on lines in the cart** si quieres las líneas de complemento más pequeñas; qué controles enseña cada fila se decide en la incrustación de la app | | **Dawn** | 15.2 – 16.0 | ✅ Probado en escritorio y móvil, en el panel y en la página del carrito | Nada obligatorio: los controles se deciden en la incrustación de la app; CSS opcional abajo para anidar y reducir las líneas | | **Split** (KrownThemes) | 4.4 | ✅ Probado en escritorio en una tienda real: el panel del carrito se abre con la montura y sus complementos, y al borrar la montura se van con ella | Activar **Compact the add-on lines in the cart** y elegir en **Add-ons in the cart** si las filas de complemento llevan controles; CSS opcional abajo para afinar | | **Glassglow** | 9.0 | 🟠 En curso: el panel del carrito se abre y se actualiza con las funciones del propio tema y nuestras líneas caen en él; nos falta verlo con el formulario activo en la tienda. Su mini-cart no enseña las propiedades de línea (la configuración y la receta salen en la página del carrito y en el checkout) y lista como mucho 5 líneas | Escríbenos antes de activarlo | ## Horizon No hace falta CSS. En **Tema › Incrustaciones de aplicaciones › Optical Form Drawer**, activa **Compact the add-on lines in the cart**: Horizon ya anida las líneas del conjunto bajo la montura, y esa casilla las hace más pequeñas para que las gafas sean el titular. Horizon muestra un selector de cantidad y una papelera en todas las filas, también en las líneas de complemento: si prefieres que los complementos no los enseñen, es el ajuste **Add-ons in the cart** de la misma incrustación de la app. Ver [Cambiar la cantidad desde el carrito](#cambiar-la-cantidad-desde-el-carrito). Dos cosas de **Horizon 4.2.0** que conviene saber: - Si actualizas desde la Theme Store, el tema nuevo llega **sin el bloque «Optical Form»** en la plantilla de producto (la incrustación de la app sí se conserva, porque es un ajuste de la app). Vuelve a colocarlo en **Personalizar › Plantilla de producto › Añadir bloque › Apps**. - Su ajuste **«"Add to cart" auto-opens drawer»** (Ajustes del tema › Cart) viene desactivado. Con él desactivado, el panel del carrito lo abre Optical Form cuando el tema ya ha mostrado las líneas; con él activado lo abre el tema al instante, y las líneas van en la misma petición que el añadido, así que también se abre lleno. ## Dawn 15.x Dawn muestra cada complemento como una línea igual que la montura, con su selector de cantidad y su papelera. Qué controles enseña cada fila lo decides en la incrustación de la app (**Add-ons in the cart**, **Hide the remove button of accessories**, **Hide the quantity selector of contact lenses**), y funciona igual en el panel y en la página del carrito. Si además quieres las líneas de complemento agrupadas bajo la montura y más pequeñas, como en Horizon: 1. Ve a **Tienda online › Temas › Personalizar › Incrustaciones de aplicaciones › Optical Form Drawer**. 2. Pega esto en **Custom CSS** y guarda: ```css /* Optical Form · Dawn 15.x/16.x — complementos anidados y reducidos bajo la montura, como en Horizon */ .cart-item.ofd-bundle-child td { padding-top: .8rem; padding-bottom: .8rem; border-top: 0; } .cart-item.ofd-bundle-child .cart-item__media { padding-left: 3.2rem; } .cart-item.ofd-bundle-child .cart-item__image-container { width: 100%; max-width: 5.2rem; } .cart-item.ofd-bundle-child .cart-item__name { font-size: 1.3rem; line-height: 1.35; } .cart-item.ofd-bundle-child .product-option, .cart-item.ofd-bundle-child .cart-item__totals .price { font-size: 1.2rem; } .cart-item.ofd-bundle-child .cart-item__quantity { padding-top: 0; } ``` **Si ya tenías pegado el CSS anterior** La receta antigua escondía el selector de la montura y los controles de los complementos con CSS. Ya no hace falta y conviene quitar esas reglas: el selector de la montura ahora sirve (multiplica los complementos, o vuelve a 1 en «Lock»), y los controles de las líneas de complemento se deciden en la incrustación de la app. Las reglas de tamaño de arriba siguen valiendo. ## Split (KrownThemes) Split tiene su propio panel de carrito y la app lo reconoce sola: no hay que tocar selectores. Dos cosas: 1. En **Tema › Incrustaciones de aplicaciones › Optical Form Drawer**, activa **Compact the add-on lines in the cart** (líneas de complemento sangradas bajo la montura) y, si no quieres que los complementos enseñen el selector de cantidad ni el enlace «Eliminar», pon **Add-ons in the cart** en «Visible without controls». El selector de la montura se queda: multiplica los complementos, o vuelve a 1 si eliges «Lock» en **Set quantity from the cart**. La montura conserva «Eliminar» y al borrarla se lleva las lentes. 2. Si quieres las líneas de complemento más pequeñas y sangradas bajo la montura, pega esto en **Custom CSS** de la misma incrustación de la app: ```css /* Optical Form · Split — complementos compactos bajo la montura (cajón y página del carrito) */ #AjaxCartForm .cart-item.ofd-bundle-child { padding-left: 24px !important; margin-top: -8px !important; } #AjaxCartForm .cart-item.ofd-bundle-child .thumbnail { width: 56px !important; flex: 0 0 56px !important; } #AjaxCartForm .cart-item.ofd-bundle-child .item-title { font-size: 13px !important; line-height: 1.35 !important; } #AjaxCartForm .cart-item.ofd-bundle-child .item-price { font-size: 12px !important; } #AjaxCartForm .cart-item.ofd-bundle-child .actions { display: none !important; } ``` Split imprime en el carrito **todas** las propiedades de línea, también las técnicas que empiezan por `_` (les quita el guion bajo), así que bajo la montura y bajo cada complemento verás líneas como `ofd_type: main`. Dos formas de quitarlas: - **La limpia, en el tema**: en `snippets/cart-form.liquid`, la condición que decide qué propiedad se imprime (`{%- if p.last != blank and p_first_char != '_p_' -%}`) pasa a `{%- if p.last != blank and p_first_char != '_p_' and p.first contains '_ofd_' == false -%}`. Sirve para cualquier orden y cualquier ajuste del formulario. - **Solo con CSS**, pegando esto debajo del bloque anterior. Vale mientras tengas activa **Unir las selecciones en una sola línea** (Diseño › Líneas del carrito): esa línea va la primera y las técnicas ocupan la segunda, la tercera y la última. Si desactivas la unión, cambia las dos primeras reglas de la montura por `span:nth-child(-n+2)`. ```css /* Propiedades técnicas (ofd_*): en los complementos, todas; en la montura, la 2.ª, la 3.ª y la última */ #AjaxCartForm .cart-item.ofd-bundle-child .margin-top-xs { display: none !important; } #AjaxCartForm .cart-item.ofd-bundle-parent .margin-top-xs > span:nth-child(2), #AjaxCartForm .cart-item.ofd-bundle-parent .margin-top-xs > span:nth-child(3), #AjaxCartForm .cart-item.ofd-bundle-parent .margin-top-xs > span:last-child { display: none !important; } ``` ## Cualquier tema: las clases que deja la integración con el carrito En todos los temas, la integración con el carrito marca cada fila de un conjunto con su **papel**: `ofd-bundle-parent` en la montura (y `ofd-set-fixed` si es una lentilla, cuya cantidad fija el configurador), `ofd-bundle-child` en cada línea de complemento, más `ofd-bundle-addon` (lentes y tratamientos) o `ofd-bundle-accessory` (líquidos, fundas). Y dentro de cada fila marca los controles que encuentra: `ofd-ctl-qty` en el selector de cantidad (el número con sus botones) y `ofd-ctl-remove` en la papelera. Son las clases que usan los ajustes de la incrustación de la app en los temas medidos, y las que puedes usar tú en cualquier otro, pegado en **Custom CSS**: ```css /* Optical Form · cualquier tema — por el papel de cada fila del conjunto */ .ofd-bundle-addon .ofd-ctl-qty, .ofd-bundle-addon .ofd-ctl-remove { display: none !important; } /* complementos sin controles */ .ofd-bundle-accessory .ofd-ctl-remove { display: none !important; } /* accesorios sin papelera */ .ofd-set-fixed .ofd-ctl-qty { display: none !important; } /* lentillas sin selector */ /* o, en vez de la primera regla, complementos ocultos del todo: */ /* .ofd-bundle-addon { display: none !important; } */ ``` Las marcas de los controles son una heurística (busca el campo numérico con sus botones «+»/«−» y el botón o enlace de eliminar por su etiqueta), pero acotada: solo mira dentro de las filas de un conjunto de Optical Form, así que nunca toca otra línea del carrito ni el resto de la página. Si en tu tema no acierta, escríbenos con el nombre y la versión y lo medimos. ## Cambiar la cantidad desde el carrito Una montura configurada y sus complementos son **un conjunto**. Si el cliente sube la cantidad de la montura en el carrito de tu tema —el panel o la página—, la app multiplica con ella las lentes y los tratamientos (dos lentes por montura, un tratamiento por montura…), en una sola petición y sin volver a abrir el panel. Si en cambio cambia un complemento por su cuenta, vuelve a su sitio. Los accesorios van libres. Y las **lentillas no se escalan**: sus cajas por ojo se eligen en el configurador, y cualquier cambio en el carrito vuelve a ellas con el aviso «Las cajas por ojo se eligen en el configurador». Si prefieres que una montura configurada sea siempre una unidad, pon **Set quantity from the cart** en «Lock»: vuelve a 1 con el aviso «Las cantidades del conjunto van juntas. Para otra montura igual, configúrala de nuevo». Los dos avisos están traducidos. Todo esto está medido en Horizon 2.x a 4.2, Dawn 15 y 16 y Split, con y sin descuentos automáticos (un 2×1 reparte la montura en varias líneas y la app las suma). ## Lo que verá tu cliente en cualquiera de los temas - La montura con su foto, su precio y la configuración elegida. - La **graduación etiquetada**, con los mismos nombres de campo que el formulario: `OD: SPH -2.25 · CYL -0.75 · AX 90°`, `OI: …`, `DIP: 63`. - Los complementos debajo, con su precio y su cantidad — o sin controles, u ocultos, según lo que elijas en la incrustación de la app. Las propiedades técnicas que van al laboratorio (empiezan por `_`) no se ven en ningún tema de Shopify: ni en el carrito, ni en el checkout, ni en el email. ## Tu tema no está en la lista El formulario y el cobro funcionan igual en cualquier tema: los ajustes automáticos de la incrustación de la app detectan el carrito de la mayoría. Lo que no podemos garantizar sin verlo es **el acabado** del panel del carrito —que los complementos salgan agrupados bajo la montura y pulidos como en Horizon—, porque cada tema muestra sus líneas con su propio código. Si quieres ese acabado en un tema que no está aquí, escríbenos a support@getoptical.app con el nombre y la versión del tema. Lo normal es que te pidamos **acceso de colaborador** a la tienda (permiso de *Temas*) o, como mínimo, un enlace de vista previa del tema con el formulario activo en un producto. Con eso ajustamos el carrito, te dejamos el CSS listo para pegar y el tema pasa a esta tabla. --- # El botón del producto > Cómo dar al botón que abre el configurador el mismo aspecto que los botones de tu tema, en escritorio y en móvil. Source: https://docs.getoptical.app/guias/boton-del-producto/ Language: es El botón que abre el configurador vive en la página de producto, así que tiene que parecerse a los demás botones de tu tienda. Se configura en el **editor de temas**, no dentro de la app. ## Dónde se configura 1. En tu admin de Shopify, ve a **Tienda online → Temas → Personalizar**. 2. Abre una página de producto. 3. Pulsa sobre el bloque **Optical Form**. Todos los ajustes que verás se aplican **solo a ese bloque**, y afectan a todos los productos que usen esa plantilla de producto. ## El botón no hereda nada Esto es importante y va a contracorriente de lo que uno esperaría: **el botón no coge colores de ningún sitio**. Ni de tu tema, ni de la pestaña *Diseño* del formulario. Es a propósito. Los temas de Shopify definen sus botones cada uno a su manera, y no hay forma fiable de adivinarlo. En vez de acertar a medias, la app te deja decidirlo todo. Lo que trae por defecto es un botón **gris muy oscuro con texto blanco**, que es neutro y encaja de forma discreta en casi cualquier tienda hasta que lo ajustes. **La forma rápida de acertar** No intentes adivinar los colores de tu tema. Ve a una página de producto de tu tienda, haz clic derecho sobre el botón **Añadir al carrito** y elige *Inspeccionar*. Ahí ves el color exacto. Cópialo y pégalo aquí. Si eso te suena a chino, hay una alternativa: hazle una captura al botón de tu tema y usa cualquier selector de color (el propio Shopify trae uno en el selector de color) para sacar el tono. ## Contenido - **Texto del botón** — lo que pone. Si lo dejas vacío, se usa el texto traducido de la app, que se adapta solo al idioma de cada cliente. **Si escribes algo aquí, ese texto sale igual en todos los idiomas.** - **Icono (opcional)** — una imagen de tu biblioteca de **Archivos**. Va mejor un PNG cuadrado con fondo transparente, de unos 128×128. Déjalo vacío para un botón solo de texto. - **Posición del icono** — antes o después del texto. Solo aparece cuando hay icono. - **Separación entre icono y texto** — de 0 a 32 px. Se ignora si la alineación del contenido separa las piezas a los extremos. ## Colores Seis colores: **fondo**, **texto** y **borde**, cada uno con su versión **al pasar el ratón por encima**. El borde solo se ve si además le pones un grosor mayor que cero, más abajo. Si dejas el color de borde vacío, no se ve borde aunque tenga grosor. ## Forma y tipografía Estos valores son **comunes a escritorio y móvil**, porque casi nunca conviene que cambien de un sitio a otro: - **Radio de las esquinas** — de 0 (cuadrado) a 60 (píldora). - **Grosor del borde** — 0 significa sin borde. - **Grosor de la letra**, **espaciado entre letras** y **mayúsculas/minúsculas**. ## Escritorio y móvil por separado Lo que sí cambia entre pantallas tiene su propio juego de ajustes: | Ajuste | Para qué | |---|---| | **Ajustar al contenido** | El botón ocupa solo lo que mide su texto, en vez de una anchura fija. Es lo habitual en escritorio | | **Ancho** | Porcentaje del espacio disponible. En móvil casi siempre 100% | | **Relleno vertical y horizontal** | El espacio entre el texto y el borde del botón. Lo que le da el tamaño | | **Tamaño de letra** | | | **Alineación del contenido** | Dónde quedan el icono y el texto dentro del botón: centrados, a la izquierda, a la derecha o separados a los extremos | | **Tamaño del icono** | De 10 a 48 px. Solo aparece cuando hay icono | La versión **móvil** se aplica en pantallas de menos de 750 píxeles de ancho, que es el corte estándar de Shopify. **Cómo previsualizar el móvil** En el editor de temas, arriba a la izquierda, hay unos iconos de pantalla y de móvil. Pulsa el de móvil y verás cómo queda sin salir del editor. ## Dónde va el botón respecto al de tu tema Por defecto el botón sale donde pongas el bloque en el editor: encima o debajo del bloque «Buy buttons» de tu tema, en su propia fila. Si lo quieres pegado al botón «Añadir al carrito», usa el ajuste **Position** del bloque, en la sección **Theme integration & placement**: - **Where the block is placed**: como hasta ahora. - **Above the theme's add to cart** / **Below the theme's add to cart**: justo encima o justo debajo de la línea del botón de tu tema. «Debajo» queda entre ese botón y los de pago rápido (Shop Pay, PayPal). - **Side by side, left / right**: los dos botones en la misma línea, mitad y mitad, a la misma altura. **Gap** es la separación con el botón del tema, en cualquiera de las posiciones, y **Stack on mobile** los apila a ancho completo en pantallas estrechas, porque medio ancho en un móvil parte la etiqueta. No hay que tocar el tema: la app encuentra sola el botón «Añadir al carrito» en los temas que hemos probado. Si en el tuyo no lo encuentra, el botón se queda donde está el bloque y puedes indicarle el selector CSS de tu botón en **Add to cart selector**, o escribirnos. Al lado, el botón toma el ancho de su mitad; los colores, el texto, el icono y la tipografía siguen siendo los del bloque. ## Ajustes avanzados El campo **Selector de input de variante** está pensado para desarrolladores y **casi nunca hace falta**: solo para temas raros donde la app no detecta qué variante ha elegido el cliente. Déjalo vacío salvo que te lo indique el soporte. ## Cuando la montura está agotada El botón sigue a la variante como el botón de compra de tu tema. Si la variante que el cliente tiene seleccionada no se puede vender, el botón se muestra **desactivado con el texto «Agotado»**; si cambia a un color con stock, vuelve a activarse sin recargar. En el mismo bloque, bajo **Ajustes avanzados**, el ajuste **When the frame is sold out** deja elegir entre ese botón desactivado y **ocultarlo** del todo. La palabra «Agotado» se cambia en **Diseño › Textos** de cada formulario. Aunque el cliente consiguiera abrir el configurador con una montura agotada, «Añadir» no la enviaría al carrito: le diría «La montura X está agotada. Elige otra montura». ## Y los demás textos, ¿dónde están? - El **idioma del panel** de la app: en **Ajustes** dentro de la app. Ver [Idiomas y textos](https://docs.getoptical.app/guias/traducciones/). - Los **textos del formulario** que ve el cliente: dentro de cada paso, en el editor del formulario. - Los **colores del configurador** (el panel que se abre): en la pestaña **Diseño** de cada formulario. Ver [Diseño y carrito](https://docs.getoptical.app/guias/diseno-y-carrito/). --- # Iconos para tus opciones > Un pack de 28 iconos, gratis y de uso comercial, para que todo el configurador se vea del mismo estilo. Source: https://docs.getoptical.app/guias/iconos/ Language: es Cada opción de tu formulario puede llevar una imagen. Si pones una de un sitio y otra de otro, el configurador se ve remendado — y eso lo nota el comprador aunque no sepa decir por qué. Para evitarlo tienes un pack propio: **28 iconos**, dibujados para GetOptical y **gratis para usar en tu tienda**, con o sin modificaciones. Cubren el catálogo de una óptica de punta a punta: el tipo de gafa, el índice, el área de visión de una progresiva, los tratamientos y los complementos.

Descargar el pack (ZIP, 24 KB)

## Qué incluye **Qué está comprando el cliente** | Icono | Para | |---|---| | `glasses-prescription` | Graduadas / monofocal | | `glasses-progressive` | Progresivas | | `glasses-reading` | Gafas de lectura | | `glasses-plano` | Sin graduar | | `glasses-sun` | Gafas de sol | | `contact-lenses` | Lentillas | **Índice de la lente** — el perfil en color marca cuál es. Cuanto más a la derecha, más gruesa. `index-150` · `index-160` · `index-167` · `index-174` **Área de visión, para progresivas** — el corredor nítido se ensancha al subir de gama. `corridor-standard` · `corridor-wide` · `corridor-premium` **Tratamientos** | Icono | Para | |---|---| | `lens-standard` | Lente estándar | | `lens-anti-reflective` | Antirreflejante | | `lens-blue-light` | Filtro de luz azul | | `lens-photochromic` | Fotocromática | | `lens-polarised` | Polarizada | | `lens-tint` | Tintada | | `lens-driving` | Conducción | | `lens-mirror` | Espejo | | `lens-water-repellent` | Hidrofóbico / repelente al agua | | `lens-scratch-resistant` | Antiarañazos | | `lens-anti-fog` | Antivaho | | `lens-uv` | Filtro UV | **Complementos** | Icono | Para | |---|---| | `addon-case` | Estuche | | `addon-solution` | Líquido limpiador | | `addon-cloth` | Gamuza | Son **SVG**, así que se ven nítidos a cualquier tamaño y pesan unos 500 bytes cada uno. **Vienen en dos juegos** La carpeta principal es para **fondos claros**. La carpeta `on-dark/` trae los mismos iconos con el contorno aclarado, para configuradores de fondo oscuro. Elige el juego que case con tu diseño: sobre el fondo equivocado el contorno desaparece. La plantilla de formulario **Gafas de sol · Oscuro** y la plantilla de diseño **Oscura** usan el juego `on-dark/`. ## Cómo ponerlos 1. En tu admin de Shopify, ve a **Contenido → Archivos** y sube los que vayas a usar. 2. Copia la URL de cada archivo. 3. En tu formulario, abre la opción y pégala en **Imagen de la opción**. **Súbelos a tu tienda, no los enlaces a los nuestros** Es tentador enlazar directamente a `getoptical.app`. Funciona hoy, pero si algún día reorganizamos esa carpeta se te quedan las páginas de producto sin imagen. Con los archivos en tu tienda, eso no puede pasarte. ## Si quieres añadir alguno tuyo El pack sigue una gramática sencilla, y respetarla es lo que hace que los iconos parezcan del mismo juego: - **La lente es siempre la misma elipse** — `cx 72, cy 72, rx 45, ry 36`, con trazo de `8`, sobre un lienzo de `144 × 144`. - **Dentro va el concepto**, y **el color de acento señala el sujeto** del icono. - **El gris es para lo secundario**, nunca para el sujeto. - Los índices y las áreas de visión varían una **forma**, no una etiqueta: qué perfil va en acento, o cuánto se ensancha el corredor. Sepáralos lo bastante como para que la diferencia se note a 40 px, que es el tamaño al que se usan de verdad. - **Los complementos no llevan elipse.** La elipse significa «esto es una lente», y un estuche no lo es. Colores: contorno `#1F2A28` · acento `#0E6E63` · gris `#7E8E8B`. ## Lo que puedes hacer con ellos Puedes **usarlos, modificarlos, recolorearlos y publicarlos** en tu tienda y en tu publicidad, incluidas las tiendas que montes para clientes tuyos. Sin atribución y sin coste. Lo único que no puedes es **revenderlos o redistribuirlos como pack de iconos**, por su cuenta o como el grueso de otro producto. **Sobre las marcas** Los iconos son deliberadamente genéricos y no llevan marcas de terceros. No hay un icono de *Transitions®*, porque es una marca registrada de Transitions Optical. Etiqueta tú tus opciones con los nombres comerciales que tengas derecho a usar como vendedor de esos productos — el icono de fotocromática te sirve igual. --- # Idiomas y textos > De dónde sale cada texto que ve tu cliente, quién manda sobre quién, y cómo cambiar una etiqueta sin romper los demás idiomas. Source: https://docs.getoptical.app/guias/traducciones/ Language: es Esta es la parte que más dudas genera, así que vamos despacio. No hace falta saber nada de programación. ## Primero: dos cosas que se confunden | | Qué es | Quién lo ve | |---|---|---| | **Idioma del panel** | En qué idioma se ve *esta* aplicación cuando entras a trabajar | Solo tú y tu equipo | | **Textos del formulario** | Las palabras que aparecen en el formulario de tu tienda | Tus clientes | Son independientes. Puedes tener el panel en español y vender en inglés, o al revés. ### Idioma del panel En **Ajustes → Idioma** eliges entre *Automático*, *Inglés* o *Español*. Se guarda **en tu tienda** y se aplica al momento, sin botón de guardar. Es una preferencia de la tienda, no de cada persona: todo tu equipo ve el panel en el idioma que elijas aquí. En *Automático* la app sigue el idioma principal de tu tienda. ## Los textos del formulario: de dónde salen Aquí está lo importante. Cada texto que ve tu cliente puede venir de **tres sitios distintos**, y cuando dos dicen cosas diferentes, gana uno concreto. Piénsalo como una escalera. Cada peldaño pisa al de abajo: ``` 4. Traducción por idioma (selector de idioma) ← manda siempre 3. Lo que escribes en las cajas del paso ← solo si lo cambias 2. El idioma de tu tienda (español, inglés…) ← lo normal 1. Los textos de fábrica, en inglés ← el suelo ``` ### 1. Textos por defecto La app trae todos sus textos escritos en inglés. Es el suelo: si nada más los pisa, se ven así. ### 2. El idioma de tu tienda La app viene traducida. Si tu tienda está en español, tu cliente ve el formulario en español automáticamente, sin que hagas nada. Esto ya cubre a la mayoría de comercios: **no necesitas tocar nada de lo que viene después.** ### 3. Los campos de texto de cada paso Dentro de cada paso hay campos donde puedes reescribir las etiquetas: los títulos de cada ojo, los nombres de los campos, los mensajes de error… Mientras no toques un campo, aparece **vacío y con el texto por defecto en gris** — el mismo que ve tu cliente, en el idioma de tu tienda. Abres un paso de graduación en una tienda española y el campo de la esfera muestra `ESF:` en gris; en una tienda inglesa, `SPH:`. Ese gris no es un valor: es lo que se enseña si no escribes nada. Solo cuando **escribes algo** en el campo, tu texto pasa a mandar. Si escribes `Esfera:`, tus clientes verán `Esfera:`. **Si ves texto en inglés escrito en un campo** Los formularios guardados antes de agosto de 2026 llevaban el texto por defecto en inglés escrito dentro de cada campo (`SPH:`, `Right eye (OD)`…). La app ya lo distingue: un texto idéntico al texto por defecto cuenta como *sin tocar*, así que tu cliente sigue viendo el idioma de la tienda, y al abrir el paso hoy esos campos se ven vacíos con el gris. Si en alguno sigue apareciendo inglés escrito, es que alguien lo cambió a propósito. **Cuidado con una consecuencia:** lo que escribas ahí se aplica **en todos los idiomas** de tu tienda. Si pones `Esfera:`, un cliente inglés también verá `Esfera:`. ### 4. El selector de idioma Si vendes en varios idiomas y quieres un texto distinto en cada uno, usa el **selector de idioma** que hay junto al título *Pasos*, en el editor del formulario. Eliges un idioma, escribes los textos para ese idioma, cambias a otro y escribes los suyos. Cada idioma guarda los suyos por separado. Esto pisa a todo lo demás, siempre. ### 5. Los textos de la interfaz Hay palabras que no son de ningún paso sino del propio formulario: **Siguiente**, **Añadir al carrito**, **Resumen**, **Total**, **Incluido**, «Elige un color para continuar», los mensajes de error del carrito… Vienen traducidas con la app y, hasta ahora, no se podían cambiar. Desde **Diseño › Textos de la interfaz** sí. Ahí está también el **texto del botón de la página de producto** (el que abre el formulario), en el primer grupo. Cada campo muestra en gris lo que ven hoy tus clientes en el idioma elegido, escribes encima para decirlo a tu manera («Pedir mis gafas» en vez de «Añadir al carrito», «Continuar» en vez de «Siguiente») y vacías el campo para volver. Si vendes en varios idiomas, elige el idioma arriba de la sección y escribe los suyos: cada idioma guarda los suyos por separado. Dos cosas a respetar: los marcadores entre llaves —`{price}`, `{label}`— son donde la app pone el importe o el nombre del paso, y tienen que quedarse; y algunos textos los leen solo los lectores de pantalla (Cerrar, Atrás, el icono de ayuda), así que cámbialos solo si sabes lo que hace un lector. ## Cómo hago… **…cambiar el nombre de un campo en todos los idiomas** Escribe el texto nuevo en el campo del paso. Vale para tiendas de un solo idioma, o cuando quieres el mismo término en todos. **…poner un texto distinto por idioma** Usa el selector de idioma del editor. Es la única forma de que cada idioma tenga el suyo. **…volver al texto original** Vacía el campo: vuelve a verse el gris por defecto, y tu cliente vuelve a ver el idioma de la tienda. **…dejar un campo en inglés dentro de una tienda española** Escribe el término en inglés en el campo (por ejemplo `SPH:` en vez del `ESF:` gris). Si quieres que solo lo vean los clientes en español y no los demás idiomas, usa el selector de idioma, elige *español*, y escríbelo ahí. ## Si traes un formulario de otra tienda Cada formulario tiene un **idioma base**: el de la tienda donde se creó. Es el que ves en el selector marcado como *— Base*. Al importar un formulario en una tienda cuyo idioma principal es distinto, la app **cambia la base al idioma de tu tienda** y guarda el idioma original como una traducción más. No pierdes ningún texto y no tienes que hacer nada. Si algún campo no tenía traducción a tu idioma, se queda como estaba en lugar de aparecer vacío: es más útil ver el texto en otro idioma que no ver nada. **Cómo saber en qué idioma estás editando** El selector junto al título *Pasos* siempre indica cuál es la base. Si dice **Español — Base**, lo que escribas en los campos es el español; para el resto de idiomas, cambia el selector primero. Más detalles en [Copiar un formulario a otra tienda](https://docs.getoptical.app/guias/copiar-formulario/). ## Los colores y las ayudas también se traducen Todo lo que escribes tú dentro de una opción se traduce igual que su etiqueta, con el mismo selector de idioma: el **nombre de cada color**, el **título, la descripción y la ayuda de cada grupo de colores**, y el **texto de ayuda** que aparece tras el «?» junto al título. Lo que no escribes tú —«Elige un color para continuar», el «Desde» del precio, «Incluido»— ya viene traducido; y si lo reescribes en **Diseño**, tu texto se aplica en todos los idiomas. ## Textos que no están en los pasos Los botones generales del formulario —*Siguiente*, *Anterior*, *Añadir al carrito*, *Total*, los mensajes de error— vienen traducidos con la app y siguen el idioma de tu tienda. No hace falta configurarlos. **Después de cambiar textos, sincroniza** Guardar en el editor **no** actualiza tu tienda todavía. Pulsa **Sincronizar ahora** y espera a que el estado diga *Sincronizado*. Hasta entonces tus clientes siguen viendo la versión anterior. --- # Sincronización y copias > Publica tus formularios en Shopify vía metaobjects y haz copias de seguridad en JSON. Source: https://docs.getoptical.app/guias/sincronizacion/ Language: es ## Guardar ≠ Publicar Editar un formulario en la app y pulsar **Guardar** almacena los cambios, pero **no** los publica en la tienda. Para que lleguen a la tienda hay que **Sincronizar**. Cada formulario se publica como un **metaobject de Shopify**. La extensión de tema lee ese metaobject para renderizar el panel. ## Sincronizar con Shopify 1. Guarda el formulario. 2. Pulsa **Sincronizar ahora** (o "Sincronizar con Shopify"). 3. La sincronización se procesa **en segundo plano**; recarga para ver el estado. En la pestaña **Ajustes** del formulario verás el estado: **Sincronizado**, **Sin sincronizar** o **Error de sincronización**, y la fecha de la última sincronización. **Si pone «Error de sincronización»** Ese formulario **no llegó a publicarse**, así que tu tienda sigue mostrando la versión anterior — o ninguna, si era la primera vez que lo publicabas. Ábrelo y pulsa **Sincronizar ahora**. Suele tardar unos segundos y con eso se resuelve en la mayoría de los casos. No has perdido nada: tus pasos, textos y ajustes están guardados. Si vuelve a fallar, escríbenos a **[support@getoptical.app](mailto:support@getoptical.app)** y lo miramos nosotros. **Recuerda sincronizar tras cada cambio** Si cambias pasos, precios o diseño y solo guardas, la tienda seguirá mostrando la versión anterior hasta que sincronices. ## Estado del formulario Un formulario solo aparece en la tienda si está **Activo** *y* **Sincronizado**, y su producto tiene el formulario asignado con la [incrustación de la app](https://docs.getoptical.app/empezar/instalacion/) activada. ## Copia de seguridad y restauración (JSON) - **Exportar formulario como JSON** (pestaña Ajustes) — descarga toda la configuración del formulario. Úsalo para respaldar o para **copiar el formulario a otra tienda**. - **Importar desde JSON** (dashboard) — crea un formulario nuevo a partir de un archivo exportado. Los pasos, textos, traducciones, diseño y los códigos de tu software de óptica viajan enteros. Los **complementos no**, porque están vinculados a productos de una tienda concreta: ver [Copiar un formulario a otra tienda](https://docs.getoptical.app/guias/copiar-formulario/). Ningún dato se borra al cambiar de plan: tus formularios, sus pasos y sus traducciones se quedan donde están. **Lo que sí se desactiva si el plan deja de estar al día** Tus datos siguen intactos, pero el configurador **deja de mostrarse en tu tienda**, aunque dentro de la app el formulario siga figurando como **Activo**. No es un fallo de sincronización: es el plan. Al regularizar el pago vuelve con tu configuración exactamente como la dejaste: en cuanto vuelvas a sincronizar el formulario, o solo, en la comprobación diaria. --- # Copiar un formulario a otra tienda > Qué viaja dentro del archivo JSON, qué no puede viajar por más que quieras, y qué hacer al llegar. Source: https://docs.getoptical.app/guias/copiar-formulario/ Language: es Puedes llevarte un formulario entero de una tienda a otra, o guardarlo como copia de seguridad. Se hace con un archivo, sin tocar código. Esta página explica **qué se copia y qué no**, porque hay una parte que no puede viajar y saberlo de antemano te ahorra un rato de confusión. ## Cómo se hace 1. En la tienda de origen, abre el formulario → pestaña **Ajustes** → **Exportar formulario como JSON**. Se descarga un archivo. 2. En la tienda de destino, ve al panel principal → **Importar desde JSON** → elige ese archivo. Listo. Aparece un formulario nuevo con el mismo nombre y la palabra *(imported)* al final. **Llega siempre como borrador** El formulario importado entra en estado **Borrador**, nunca activo. Es a propósito: así lo revisas antes de que lo vea un cliente. ## Qué viaja y qué no | | ¿Viaja? | |---|---| | Los pasos, en su orden | ✅ Sí | | Las opciones de cada paso, con sus textos y descripciones | ✅ Sí | | Las traducciones a otros idiomas | ✅ Sí | | Los saltos entre pasos (la lógica condicional) | ✅ Sí | | Los rangos de graduación y las etiquetas | ✅ Sí | | Los colores, tamaños y ajustes de diseño | ✅ Sí | | Los códigos de tu software de óptica (ERP) | ✅ Sí | | **Los complementos y los productos de accesorios** | ⚠️ Solo si existen en la tienda de destino | | La asignación a productos y colecciones | ❌ No | ## Qué pasa con los complementos Un complemento no es un texto: es **un producto concreto de tu tienda**. Por dentro se guarda como un número de identificación que Shopify le asigna a ese producto **en esa tienda y en ninguna otra**. Esos números no se repiten entre tiendas. Nunca. Aunque crees un producto con el mismo nombre, el mismo precio y la misma foto, su número será distinto. Así que al importar, la app **comprueba uno por uno** si esos productos existen aquí: - **Copiar dentro de la misma tienda** (duplicar un formulario, restaurar una copia de seguridad): los números son válidos, así que **los complementos se conservan enteros**. - **Copiar a otra tienda**: los que no existen aquí **se quitan**, y el aviso al terminar te dice cuántos enlaces se han quitado. Las opciones y los pasos siguen intactos: lo único que se cae es el vínculo al producto. **Por qué se quitan, y no se dejan «por si acaso»** Un número de producto de otra tienda no da un error suave. Shopify rechaza **la petición entera** de añadir al carrito, así que tu cliente se queda **sin nada**: ni la montura. Y si el complemento cuelga de una opción, no lo verías venir — simplemente todo el que eligiera esa opción dejaría de poder comprar. **Prepara los productos antes de importar** Si ya sabes qué complementos vas a querer (tipos de lente, tratamientos, montaje…), créalos en la tienda de destino **antes** de importar. Así los vinculas del tirón, sin ir y volver. ## Los códigos de tu software de óptica sí viajan Si en la pestaña **Integraciones** tienes puestos los códigos con los que tu software de gestión (Gesvisión u otro) identifica cada lente y cada tratamiento, esos códigos **viajan dentro del archivo**, igual que los textos. Son la excepción a la regla de los complementos: un código de ERP no es un número que asigne Shopify, es una etiqueta tuya, así que significa lo mismo en cualquier tienda. **Si importaste antes de agosto de 2026, vuelve a importar** Las versiones anteriores de la app se dejaban esos códigos por el camino: el formulario llegaba entero pero **sin la integración**, y los pedidos salían sin la referencia que espera tu software. Si te pasó, exporta de nuevo desde la tienda de origen e importa otra vez. Lo que la app **no** hace es inventárselos. Si el archivo no trae códigos, llegan vacíos y los rellenas tú: son tuyos y de tu proveedor, y nadie más puede adivinarlos. ## Si ves un aviso de "productos que ya no existen" Puede pasar con formularios importados de versiones antiguas, o si alguien borró un producto de Shopify que estaba vinculado. Es un aviso naranja arriba del formulario, y trae un botón **Quitar referencias borradas**. - Si los productos que menciona **de verdad ya no existen** en tu tienda, pulsa el botón: limpia esas referencias y deja el formulario sano. - Si te suenan y **crees que sí existen**, no pulses nada y escríbenos. El botón borra los complementos de las opciones, y si el aviso estuviera equivocado perderías configuración. ## El idioma se ajusta solo Cada formulario tiene un idioma "principal" que es el de la tienda donde se creó. Si copias un formulario de una tienda española a una inglesa, la app **cambia la base al idioma de la tienda de destino** durante la importación, y guarda el idioma original como traducción. No pierdes ningún texto y no tienes que hacer nada. Si en la tienda de destino falta la traducción de algún campo, ese campo se queda como estaba en lugar de vaciarse. Para entender de dónde sale cada texto, mira [Idiomas y textos](https://docs.getoptical.app/guias/traducciones/). ## Los formularios de ejemplo **Al instalar la app ya tienes cuatro**, en borrador, sin que hagas nada: - **Gafas graduadas · pantalla completa** — los 11 pasos de una óptica a pantalla partida, con colores de tratamiento de muestra (sin producto detrás: cámbialos por tus tintes). - **Gafas graduadas** — los mismos 11 pasos en panel lateral: tipo de gafas, grosor de la lente, aumento de lectura, tratamientos, cómo nos das tu graduación, la graduación, el resumen, la subida de receta y los accesorios. - **Gafas de sol · oscuro** — solo sol o graduadas, tinte, polarización y accesorios, con la plantilla de diseño Oscura. - **Lentillas** — los 3 pasos de una venta de lentillas: tipo de lentilla, graduación por ojo y complementos de cuidado. Los cuatro llegan **en el idioma de tu tienda** y en **borrador**, así que no aparecen en ninguna página de producto hasta que tú los actives. **Vienen sin complementos a propósito**, por lo que acabas de leer. Ábrelos, recorre los pasos, y ve vinculando tus productos en las opciones donde quieras cobrar un extra. ## Después de importar, en este orden 1. **Revisa los pasos** y ajusta los textos a cómo hablas tú de tus lentes. 2. **Vincula tus complementos** en las opciones que lleven precio. 3. **Asigna el formulario** a tus productos o colecciones, en la pestaña *Productos*. 4. Pon el estado en **Activo**. 5. Pulsa **Sincronizar ahora** y espera a que diga *Sincronizado*. **Sin sincronizar no se ve** Guardar guarda, pero no publica. Hasta que sincronices, tus clientes no verán el formulario nuevo. Lo mismo cada vez que cambies algo. --- # Leer la analítica > Qué significa cada cifra de la pestaña Analítica, qué es la señal «aquí se quedan» y qué tocar en tu formulario según el paso que pierde clientes. Source: https://docs.getoptical.app/guias/analitica/ Language: es La pestaña **Analítica** del admin cuenta qué hacen tus clientes con el configurador: cuántos lo abren, cuántos llegan al carrito y en qué paso se quedan los que no. Esta guía explica cada cifra y, sobre todo, qué hacer con ella. ## Dónde está y qué periodo mira En el menú de la app, **Analítica**. Arriba eliges el periodo: últimos 7, 30 o 90 días. Cada cifra se compara con el periodo anterior de la misma duración, y ese es el número pequeño con la flecha. Las cifras se recalculan como mucho cada diez minutos: si acabas de probar el configurador, dale ese margen antes de buscarte en el embudo. ## Las cuatro cifras de arriba - **Lo abrieron.** Clientes distintos que abrieron el configurador. Un cliente que lo abre tres veces cuenta una. - **Llegaron al carrito.** Clientes que terminaron y añadieron su pedido. - **Conversión.** De los que abren, cuántos terminan. En las tiendas que medimos se mueve entre el 20 y el 30 por ciento; por debajo del 20 casi siempre hay un paso que pierde gente, y el embudo te dice cuál. - **Tiempo típico.** Lo que tarda un cliente en completarlo, en mediana: la mitad tarda menos, la mitad más. Entre uno y dos minutos es normal con cinco pasos. Debajo, y solo cuando ha ocurrido, una línea en rojo: **Errores al añadir al carrito: N**, con el desglose por causa — montura agotada, complemento no disponible, límite de stock en el carrito, tienda ocupada. Cada uno es un cliente que terminó el formulario y no pudo comprar. Un «complemento no disponible» repetido es un tratamiento o un accesorio sin stock o en borrador: revísalo en el editor con **Comprobar precios**. ## Día a día El gráfico enseña aperturas y llegadas al carrito por día, con el periodo anterior en línea discontinua. Sirve para ver si un cambio en el formulario o una campaña movió algo, no para leer un día suelto: con pocas visitas cualquier día parece una tendencia. ## Dónde se quedan Un embudo por formulario. Cada barra es un paso: cuántos clientes llegaron a él y, en rojo, cuántos cerraron el configurador estando justo ahí. Lo que importa no es el rojo en bruto sino la proporción: un paso al que llegan 10 y pierde 5 es peor que uno al que llegan 500 y pierde 20. Los pasos se nombran con la etiqueta que les diste en el editor. Un paso que borraste sigue apareciendo mientras tenga datos, marcado como eliminado. ## La señal: «aquí se quedan» Sobre el embudo de cada formulario, la app te señala **el paso que más pierde** en proporción a los que llegan, y te dice qué tocar. Para no señalar ruido, solo aparece cuando al paso han llegado **al menos 20 clientes** y **se va el 25 por ciento o más** de ellos. Con menos datos verás «todavía pocos datos» y el número de sesiones que llevas; con datos suficientes y ningún paso por encima del umbral, «ningún paso pierde más del 25 por ciento». La señal trae dos botones: **Editar el formulario**, que abre ese formulario en el editor, y **Cómo mejorarlo**, que trae aquí. La misma señal, la mayor de todos tus formularios, aparece también en el **Home** de la app, debajo de tus formularios. Puedes descartarla; si otra semana la señal cambia de paso, vuelve a aparecer. ## Qué tocar según el paso que pierde **Un paso de elección** (tipo de lente, índice, tratamiento, color). Es donde más gente se va, y casi siempre por la misma razón: tiene que decidir algo que no domina, y ve el precio. Deja tres o cuatro opciones y marca la que recomiendas con la etiqueta «Recomendada» (botón **Elegir etiqueta** en la opción; el cliente ve la etiqueta junto al nombre). Añade un texto de ayuda a las que confunden, dales un icono del pack y enseña el precio como suplemento sobre lo anterior, no como un total nuevo. Ver [Crear un formulario](https://docs.getoptical.app/guias/crear-formulario/), [Iconos](https://docs.getoptical.app/guias/iconos/) y [Precios y cobro](https://docs.getoptical.app/guias/precios-y-cobro/). **El paso de graduación** (gafas, lectura o lentillas). Quien no tiene la receta a mano se va. Haz opcionales la adición y la distancia pupilar, pon un ejemplo de receta en el texto de ayuda y ofrece la alternativa de subir una foto de la receta con un paso de subida de archivo. Ver [Graduación y receta](https://docs.getoptical.app/guias/graduacion/) y [Subida de archivo](https://docs.getoptical.app/guias/subir-receta/). **El resumen de la receta.** Es donde el cliente ve por primera vez todo junto y el total. Revisa que cada línea tenga un precio que se entienda y que el botón diga exactamente lo que va a pasar. **La subida de archivo.** Acepta imagen y PDF, di qué formatos y qué tamaño valen, y deja saltarla: si es obligatoria y el cliente no tiene la receta a mano, se va. **Accesorios y extras.** Son opcionales: no los marques por defecto y enseña el suplemento de cada uno. Si la gente se va justo aquí, lo que sorprende es el precio. Ver [Complementos y accesorios](https://docs.getoptical.app/guias/accesorios-y-addons/). **Un campo de texto.** Un campo de texto obligatorio frena. Hazlo opcional o convierte la pregunta en opciones. Después de cada cambio, espera 30 días y vuelve a mirar el mismo embudo. Es la única manera de saber si el cambio sirvió. ## Lo que más eligen La tabla de abajo cuenta, solo de pedidos terminados, qué opciones se eligieron más veces. Es la respuesta a «¿merece la pena la opción cara?» y a «¿alguien elige esto?». Los pasos de receta no entran nunca. ## Lo que no se mide Estas cifras son anónimas. La app no guarda ninguna graduación, ningún archivo ni ningún dato del cliente, y las cifras no salen de tu tienda: nadie más las ve. Los datos se conservan 195 días y después se borran solos; el embudo de un periodo que ya no existe no se puede recuperar. Si quieres cruzar estas cifras con tu propia analítica o tu chat, el configurador emite eventos en el navegador para eso: [Qué hacer con cada evento](https://docs.getoptical.app/desarrolladores/eventos/). --- # Cuando algo no funciona > Busca tu síntoma, sigue las comprobaciones en orden y para en cuanto una falle. Sin tecnicismos. Source: https://docs.getoptical.app/guias/cuando-algo-no-funciona/ Language: es Busca abajo **lo que ves** y sigue las comprobaciones **en el orden dado**. Están ordenadas de la causa más frecuente a la más rara, así que para en cuanto una falle: esa es. --- ## No veo el botón en la página de producto El caso más común, y casi siempre es una de las cinco condiciones que hacen falta a la vez. **1. ¿La Guía de configuración está al 6/6?** Ábrela en el inicio de la app. Si algún paso está pendiente, ahí tienes la respuesta — sigue ese paso y vuelve. **2. ¿El formulario está Activo *y* Sincronizado?** Ajustes del formulario. Hacen falta **las dos** cosas. *Activo* pero *Sin sincronizar* significa que tus cambios aún no han salido a la tienda: pulsa **Sincronizar ahora** y espera al verde. **3. ¿Este producto tiene formulario asignado?** Pestaña **Productos** del formulario. Un formulario perfecto sin asignar no aparece en ninguna parte. Si lo asignaste por **colección**, comprueba que el producto está realmente en esa colección y que la colección está **publicada en Tienda online**: las que no lo están no muestran el formulario ([Productos y colecciones](https://docs.getoptical.app/guias/productos-y-colecciones/)). **4. ¿El bloque está en la plantilla que usa este producto?** Esta es la que más despista. Si tienes varias plantillas de producto, el bloque hay que añadirlo **en cada una**. Mira en el producto, barra lateral derecha, **Plantilla de tema**, cuál usa — y comprueba que el bloque está en esa. **5. ¿Estás mirando el tema publicado?** Los ajustes de tema no se comparten entre temas. Si añadiste el bloque a un borrador, en el tema en vivo no está. **Atajo** Cambiar de tema **borra** la incrustación y el bloque, porque son ajustes del tema. Si el botón desapareció justo después de cambiar o actualizar el tema, es eso: la Guía te lo marcará en rojo. --- ## Veo dos botones iguales Añadiste el bloque dos veces. Pasa con facilidad: el enlace de la Guía **ya deja el bloque puesto** en el editor, así que si además añades otro a mano, quedan dos. En el editor de temas, sobre la plantilla de producto, borra el que sobre y guarda. --- ## El botón sale, pero al pulsarlo no pasa nada Casi siempre es que **la incrustación está desactivada**. El botón lo muestra un bloque, pero el formulario lo carga la incrustación: sin ella, hay botón pero no se abre nada. Ve a la Guía de configuración y comprueba el paso **"Activa la incrustación de la app"**. Si está en verde y sigue sin abrir, escríbenos con el nombre y la versión de tu tema. --- ## Elijo una variante y el carrito recibe otra Por ejemplo, eliges el color negro y llega el azul. El formulario lee la variante en el momento de abrirlo **y otra vez al añadir al carrito**, así que cambiar de variante con el formulario abierto es seguro. Si aun así falla, tu tema anuncia la variante de una forma poco común. Tiene arreglo sin tocar código: en los ajustes del bloque hay un campo para indicárselo. **Escríbenos con la URL del producto** y te decimos exactamente qué poner. --- ## Añado al carrito y el carrito no se entera El pedido **sí** se ha añadido —compruébalo abriendo el carrito— pero la pantalla no se actualiza sola. 1. Recarga la página y mira el carrito. Si el producto está, es un problema de refresco visual, no de venta. 2. En los ajustes de la incrustación, comprueba que **«Mantener el carrito sincronizado»** está activado. 3. **Tu tema es Dawn y el panel del carrito se abre vacío o en blanco**, aunque al cerrarlo y volver a abrirlo (o al recargar) sí salen las líneas: es un fallo nuestro ya corregido. Asegúrate de tener la última versión de la app (los temas la cargan solos; basta recargar la tienda) y, si sigue igual, escríbenos con el nombre y la versión de tu tema. 4. Si tu tema es poco habitual, en el apartado **Avanzado** de la incrustación hay campos para indicarle dónde está tu carrito. Escríbenos antes de tocarlos: normalmente no hacen falta. --- ## Los tratamientos salen sueltos en el carrito Deberían verse **debajo de la montura**, indentados, como parte del conjunto. Cuando salen como líneas independientes, es que tu tema muestra el carrito de una forma que la app no reconoce. **No afecta a la venta**: los precios, el pedido y el checkout son correctos; solo se ve peor. Escríbenos con el nombre del tema. Suele resolverse con unas líneas en **Custom CSS**. --- ## El cliente puede cambiar la cantidad de un tratamiento **Es a propósito, no es una avería.** La app coloca las líneas de tratamiento debajo de la montura, pero **no les esconde ni la cantidad ni la papelera**. El motivo: esconder un botón no impide la acción —quien quiera puede cambiar esa línea igual desde la API del carrito— y esa misma fila la usan otras apps para garantías y seguros de envío; taparles la papelera dejaría a tu cliente con un cargo ajeno que no puede quitar. Lo que sí está garantizado siempre: **borrar la montura borra todo su conjunto**, lo muestre como lo muestre el tema. Si lo que quieres es que esas líneas pesen menos visualmente, activa **Compactar las líneas de complementos** en la incrustación de la app. Ver [Diseño y carrito](https://docs.getoptical.app/guias/diseno-y-carrito/). --- ## Los precios del formulario no cuadran con los de la página de producto 1. ¿Estás mirando la **misma variante**? Los precios cambian por variante. 2. ¿Tienes **varios países o monedas** activos? Comprueba desde el mismo país que el cliente. 3. Si tienes descuentos automáticos, recuerda que muchos se aplican **en el checkout**, no en el carrito. --- ## Sale en el idioma equivocado **El formulario entero en otro idioma:** revisa [Idiomas y textos](https://docs.getoptical.app/guias/traducciones/). Lo más habitual es haber escrito un texto en los campos del paso, que **se aplica a todos los idiomas**. **Solo el botón:** si escribiste algo en *Texto del botón* (en el bloque del tema o en Diseño › Textos de la interfaz), ese texto se usa tal cual en todos los idiomas. **Déjalo vacío** y se traduce solo. **Un formulario traído de otra tienda:** al importarlo se ajusta al idioma de tu tienda automáticamente. Si algún campo no tenía traducción, se queda en el idioma de origen — edítalo con el selector de idioma. --- ## Un aviso naranja dice que faltan productos *"N productos referenciados ya no existen en tu catálogo"*. Significa que algún tratamiento o accesorio vinculado a una opción se ha borrado de Shopify. - Si **de verdad los borraste**, pulsa **Quitar referencias eliminadas**. - Si **te suenan y crees que siguen existiendo**, no pulses nada y escríbenos. Ese botón borra los complementos de las opciones, y si el aviso fuera equivocado perderías configuración. --- ## El cliente ve «X no está disponible ahora mismo» Al pulsar «Añadir», el panel explica por qué Shopify no aceptó el pedido, en el idioma de la tienda: - **«La montura X está agotada. Elige otra montura.»** — la variante elegida no tiene stock. El botón de la página de producto debería salir ya como «Agotado»; si no, revisa [el botón del producto](https://docs.getoptical.app/guias/boton-del-producto/#cuando-la-montura-está-agotada). - **«X no está disponible ahora mismo. Avisa a la tienda para que lo revise.»** — un tratamiento, un color o un accesorio del formulario está sin stock, en borrador, archivado o fuera del canal Tienda online. Es tuyo de arreglar: abre el formulario y, en la pestaña **Pasos**, mira las etiquetas «Agotado», «Borrador» o «No está en Tienda online» (salen solas al abrir; **Comprobar precios** las vuelve a leer). - **«Ya tienes el máximo disponible de X en el carrito.»** — el cliente ya tiene en el carrito todas las unidades que quedan. - **«X ya no está disponible. Vuelve atrás y elige otra opción.»** — una opción que el cliente ya había elegido ha dejado de poder venderse: se ha agotado, o su producto está en borrador, archivado, fuera del canal **Tienda online** o eliminado. Sale en cuanto la app lo sabe, sin esperar a «Añadir»: el panel le quita esa respuesta y, si el paso la exige, no le deja seguir hasta que elija otra. Abre el formulario: el editor marca con una etiqueta qué producto es. - **«No se encontró la variante»** (en el idioma de tu tienda) — un producto vinculado en el formulario no está en el canal **Tienda online**, o se ha borrado. Shopify no dice cuál, y rechaza también la montura. Ya es raro llegar aquí: el panel muestra esas opciones como «Agotado» antes de que nadie las elija, el editor te avisa al abrir el formulario y, si Shopify rechaza el añadido sin explicarlo, el panel vuelve a consultar y nombra la opción en vez de enseñar esta frase. Si la ves, revisa los productos de las opciones elegidas y [ponlos en el canal](https://docs.getoptical.app/empezar/antes-de-empezar/#cómo-poner-un-producto-en-el-canal-tienda-online). - Cualquier otra frase es la de Shopify tal cual. Analítica cuenta estos casos en **Errores al añadir al carrito**. --- ## Cambié algo y en la tienda sigue igual Guardar **no** publica. Pulsa **Sincronizar ahora** en el formulario y espera a que ponga *Sincronizado*. Si dice *Error de sincronización*, vuelve a intentarlo. Si insiste, escríbenos con el nombre del formulario. --- ## Cuando escribas a soporte Cuanto más de esto nos mandes, antes lo resolvemos: - **URL del producto** donde falla (y la contraseña de la tienda si está protegida) - **Nombre y versión del tema** - **Qué esperabas y qué pasó** - Una **captura** o un vídeo corto - Si sabes hacerlo: activa el **Modo depuración** en los ajustes de la incrustación, repite el fallo, abre la consola del navegador (F12) y cópianos lo que salga Ese último punto es el que más acelera las cosas: nos dice exactamente por dónde pasó la app antes de fallar. **[support@getoptical.app](mailto:support@getoptical.app)** --- # Planes y facturación > Planes de Optical Form, prueba gratis de 14 días y 0% de comisión. Source: https://docs.getoptical.app/facturacion/planes/ Language: es Optical Form cobra un **precio fijo** y **0% de comisión** sobre tus ventas. La facturación es a través de **Shopify App Pricing**: eliges y cambias de plan en la propia página de Shopify, y el cargo aparece en tu factura de Shopify. ## Planes | Plan | Precio | Incluye | |---|---|---| | **Pro** | $49/mes o $490/año | Todo lo que la app hace hoy: gafas graduadas, **lentillas** y configuradores ilimitados | | **Plus** *(próximamente)* | $99/mes o $990/año | + guardar y reutilizar la graduación, recompra, suscripciones de lentillas y soporte prioritario | Pagando al año te ahorras dos meses. Todos los planes incluyen **prueba gratis de 14 días**. Los precios están en **USD**. ## Prueba gratis Los 14 días van asociados a la **suscripción**, no a la instalación: el contador empieza el día que eliges plan en Shopify. Mientras te lo piensas no gastas prueba. Los 14 días no generan cargo por adelantado. Cancela antes de que terminen y no se te cobra nada. ## Qué pasa desde que instalas Hay **dos periodos distintos**, y conviene no confundirlos: los **14 días de bienvenida**, que empiezan al instalar, y los **14 días de prueba**, que empiezan al elegir plan. No se solapan ni se restan: puedes usar los primeros enteros y después tener los segundos completos. | Momento | Qué pasa | |---|---| | **Día 0 — instalas** | Todo funciona, **sin elegir plan**: puedes crear y editar formularios, asignarlos y publicarlos en tu tienda. Ya tienes cuatro formularios de ejemplo en borrador. En el Home verás un aviso amarillo con la fecha en que termina la bienvenida y los días que quedan. | | **Día 3** | Si aún no has elegido plan, te escribimos un correo para recordarte que los días de prueba no han empezado a contar. | | **Día 11** | Segundo correo, con la fecha en que se acaba la bienvenida. | | **Día 14 — se acaba la bienvenida** | Tus configuradores dejan de mostrarse en la tienda y los formularios ya no se pueden editar. **No se borra nada**: formularios, pasos, complementos y ajustes se conservan tal cual, y vuelven a publicarse en cuanto elijas plan. | | **Eliges plan — el día que quieras** | Se abre la página de Shopify y apruebas el cargo. Empiezan tus **14 días de prueba** sin cobro. Cancela antes de que terminen y no pagas nada. | | **Día 15 de la prueba** | Shopify te cobra $49 (o $490 si elegiste el año) en tu factura de Shopify. | Dos detalles que ahorran sorpresas: - **Desinstalar y volver a instalar no reinicia los 14 días de bienvenida**: cuentan desde la primera instalación. - Shopify recuerda los días de prueba consumidos durante 180 días: si usas 10 días de prueba, cancelas y vuelves dos meses después, te quedan 4, no 14. Para elegir plan: dentro de la app, en **Plan y facturación**, pulsa **Ver planes y precios**. Se abre la página de Shopify donde apruebas el cargo — es la única puerta al pago. Al aprobarlo, Shopify te devuelve al Home de la app: durante unos segundos verás **«Activando tu plan…»** mientras confirmamos la suscripción con Shopify, y después tu plan activo y tus configuradores publicados de nuevo. ## Agencias y tiendas de desarrollo Si montas la tienda para un cliente desde una tienda de desarrollo de Shopify Partners, **Pro no te cuesta nada ahí** y el reloj de la bienvenida deja de correr en cuanto lo eliges. Cómo funciona, y qué pasa al pasar a la tienda real, en [Agencias y tiendas de desarrollo](https://docs.getoptical.app/desarrolladores/tiendas-de-desarrollo/). ## Cambiar de plan Puedes subir, bajar de plan o cancelar en cualquier momento desde Shopify — sin contactar a soporte. ## Sin comisión No cobramos ningún porcentaje de tus ventas. El precio del plan es lo único que pagas — te quedas el 100% de cada venta. --- # Integración con el tema > Cómo Optical Form se instala de forma agnóstica al tema, sus hooks y la agrupación del carrito. Source: https://docs.getoptical.app/desarrolladores/integracion/ Language: es Optical Form funciona en **cualquier tema con Online Store 2.0** —los que permiten añadir bloques desde el editor de temas— y no necesita desarrollador para instalarse. Está verificado en **Dawn** y **Horizon**; para temas a medida hay adaptadores y los hooks de abajo. Esta página resume la capa de integración para quien quiera personalizarla. Para los ajustes visuales del bloque y de la incrustación, ver [Botón y carrito (tema)](https://docs.getoptical.app/desarrolladores/boton-y-carrito/). ## Resolución de variante (agnóstica al tema) El panel y el botón son web components independientes que **no** se re-renderizan al cambiar de variante. Por eso Optical Form resuelve la variante actual **de forma perezosa** (al abrir y al añadir al carrito), con esta cadena de prioridad: 1. Hook del comerciante: `window.OpticalFormHooks.getVariantId(triggerEl)` 2. Selector configurable en el bloque (setting *Variant input selector*) 3. Input estándar del formulario de producto `[name="id"]` (Dawn/Horizon y la mayoría) 4. Parámetro de URL `?variant=` 5. Fallback al valor renderizado por el servidor ## Plan de suscripción (apps de suscripciones) El configurador no muestra ningún selector de planes: el cliente elige el plan en la página de producto, con la app de suscripciones que tenga la tienda (Shopify Subscriptions, Appstle o cualquier otra), y Optical Form **lleva esa elección** al carrito. Se resuelve al añadir, en este orden: 1. Hook del comerciante: `window.OpticalFormHooks.getSellingPlanId(triggerEl)` 2. Un `[name="selling_plan"]` dentro del formulario de producto **de este producto** (`form[action*="/cart/add"]` cuyo `[name="id"]` es una de sus variantes): radio marcado, `` or a hidden input; whatever is there is the answer, including "one-time purchase" (empty) 3. Any `[name="selling_plan"]` on the page (Appstle renders its radios in an app block outside the form) The plan goes on the **main line only** (add-ons and accessories are one-time purchases) and only when the variant has that plan allocated: the drawer shows the plan price in the footer, on the buttons and in the summary, and the cart charges that same amount. If the subscription app patches `fetch` (Appstle does), it writes the same value we already send. ## Hooks (no fork required) ```js window.OpticalFormHooks = { // Return the selected variant id (highest priority). getVariantId(triggerEl) { return /* variant id */; }, // Optional: override the price (in cents) for a variant. getVariantPrice(variantId, triggerEl) { return undefined; }, // Optional: the id of the chosen subscription plan (highest priority); undefined = read it from the product page. getSellingPlanId(triggerEl) { return undefined; }, // Optional: turn off cart bundle grouping. disableCartGrouping: false, }; ``` ## Cart grouping Add-ons and accessories are added as separate line items linked via `parent_id` (Shopify's native bundle — needed for cascade-remove, checkout and order emails). Since themes render them as flat rows, **CartBridge** **reorders** them so each child sits directly under its parent line, and marks each row with its role: `ofd-bundle-parent` (plus `ofd-set-fixed` for a pair of contact lenses), `ofd-bundle-child` plus `ofd-bundle-addon` or `ofd-bundle-accessory`; and inside the row, `ofd-ctl-qty` on the quantity stepper and `ofd-ctl-remove` on the remove control. **The set's quantities are squared by the bridge**, not by CSS: Shopify's nested lines do not follow their parent, so when the customer raises the frame from the cart, CartBridge multiplies the add-ons with it in a single `POST /cart/update.js` (with the theme's sections in the same response), puts back an add-on changed on its own, leaves accessories free and puts a pair of contact lenses back to its boxes. It emits `optical-form:cart:resync` with what changed (see [Events](https://docs.getoptical.app/en/desarrolladores/eventos/)). Under "Lock" the frame goes back to 1. One pass per change, never a loop, never adds anything. By default **the app ships no cart CSS at all**: which controls each row shows is the merchant's decision in the app embed (**Add-ons in the cart**, **Hide the remove button of accessories**, **Hide the quantity selector of contact lenses**), and those rules only reach the rows of an Optical Form set: other apps' remove buttons (warranties, shipping insurance) are left alone. To fine-tune the look: the **Compact the add-on lines in the cart** checkbox (`cart_tidy_addons`, off by default) and the **Custom CSS** field. See [Design & cart](https://docs.getoptical.app/en/guias/diseno-y-carrito/) and [Tested themes](https://docs.getoptical.app/en/guias/temas-probados/#any-theme-the-classes-the-bridge-leaves). Cart selectors and the after-add behavior are set in the app embed — see [Button & cart](https://docs.getoptical.app/en/desarrolladores/boton-y-carrito/). CartBridge **auto-detects** most themes' patterns; you only need to override selectors on non-standard themes. ## Configurator events The hooks above point inwards: the theme answers something the app asks. These events go the other way — **the app tells the page what the shopper is doing**, so your analytics, your chat widget or your abandoned-cart flow can live where they already live, without needing a feature from us. You don't have to do anything to get them. If nobody listens, nothing happens. What to build on top of each one, with examples for chat, analytics and abandonment: [What to do with each event](https://docs.getoptical.app/en/desarrolladores/eventos/). ```js document.addEventListener('opticalform:step:rendered', (e) => { gtag('event', 'lens_configurator_step', { step_type: e.detail.stepType, step_index: e.detail.stepIndex, session_id: e.detail.sessionId, }); }); ``` They are dispatched on `` and **bubble**, so you can listen on the element or on `document`. | Event | When | Own fields | |---|---|---| | `opticalform:open` | the configurator opens | — | | `opticalform:step:rendered` | the shopper lands on a step | `isFirst`, `isLast` | | `opticalform:validation:error` | a step stops them moving on | — | | `opticalform:addtocart:start` | the add begins | — | | `opticalform:addtocart:success` | the cart accepted it | `lineCount`, `totalPrice`, `currency`, `sellingPlanId` (or `null`) | | `opticalform:addtocart:error` | it failed | `kind` | | `opticalform:close` | it closes | `completed` | | `optical-form:cart:orphan` | a frame in the cart is missing one of its child lines: the customer removed the lenses from the theme's cart | `groupId`, `key`, `expected`, `actual` | The last one is not emitted by the configurator but by the cart bridge, on `document`, as soon as it spots a frame without the lenses or treatments it left with: the row also gets the class `ofd-bundle-orphan` and a translated notice underneath. The app deletes nothing and never blocks checkout — the event is there so you decide (ping your chat, remove the frame, whatever fits). While the bridge rearranges the cart after an add, the checkout buttons are disabled for a moment and `` carries the class `ofd-cart-busy`. Both can be switched off in the bridge configuration: `orphanNotice: false` and `guardCheckoutWhileBusy: false`. They all carry the same context: ```js { version: 1, sessionId, // random, per drawer session — stitches one visit together productId, variantId, stepIndex, stepId, stepType, totalSteps, // steps CONFIGURED, not the ones this shopper will walk } ``` `kind` is `'throttled' | 'unavailable' | 'unknown'`: the cause, not the message — the message is a label the merchant can rewrite. Only `throttled` is worth retrying. `completed` tells “they finished” from “they left”, which is the whole difference when you're recovering an abandonment. `totalPrice` is in **cents**, and only on `:addtocart:success`. ### What these events never carry **They say WHERE the shopper is, never WHAT they answered.** A `CustomEvent` is readable by every script on the page, so the payload is a closed list: it never contains the prescription values, the uploaded file or its name, the photo of the prescription, the merchant's own text or the step's DOM node. Two things worth knowing before you build on this: - **`stepType` is inferred health data.** Reaching the prescription step means that person has a refractive error. It's included because without it the events are useless, and because the same inference is already within reach of any script on the page. Handle it accordingly. - **`totalPrice` only after the add.** Once added, that figure is in `/cart.js` for anyone to read. Before the add it would be new information, and in a contact-lens form it would reveal a single-eye order. ### They notify, they don't intervene None of them is cancelable: `preventDefault()` does nothing. That's deliberate. A/B tests and merchant-side validation rules will need a different mechanism, and it will be added as one rather than by changing what these mean. ### Versioning `version` only goes up if an existing field **changes shape**. Adding new fields doesn't bump it: a listener reading what it already knew keeps working. Events are never renamed or removed without a major version change. ### Re-renders `:step:rendered` fires when the step **changes**, not on every repaint: attaching a file, the contact-lens catalogue narrowing a combination, or mutually-exclusive options all redraw the panel without moving the shopper. If you need to know when new HTML lands — a translation layer, say — use a `MutationObserver` on the panel. ## Full reference The technical detail (resolver, CartBridge, selectors, events) lives in `INTEGRATION.md` inside the app extension: `extensions/optical-form-ext/INTEGRATION.md`. --- # Button & cart (theme settings) > The block and embed settings configured in Shopify's theme editor. Source: https://docs.getoptical.app/en/desarrolladores/boton-y-carrito/ Language: en Beyond the app panel, Optical Form exposes settings in Shopify's **theme editor**: a **block** for the button and an **app embed** for the drawer and cart. ## "Optical Form" block (the button) Added to the product section, it controls the button that opens the drawer. - **Content**: button text (empty = the default translated text) and, optionally, an **icon** from your Files library, with its position (before or after the text) and the gap to the text. - **Colors**: background, text and border, each with a hover variant. Neutral dark grey by default. - **Shape & typography** (shared): radius, border width, font weight, letter-spacing (px) and text case. - **Desktop** and **Mobile** separately: shrink-to-fit, width (%), vertical/horizontal padding and font size. The cut-off is 750px. **The button inherits no tokens** The button's colors do **not** fall back to the drawer's `--ofd-*` tokens. Those are applied to the panel (`_applyStyling` → `this.panel`) and the button lives outside it, so it would inherit the app CSS `:root` — that is, Optical Form's own brand colour leaking onto the merchant's storefront. Hence the button's defaults are neutral and explicit. - **Advanced → `variant_input_selector`**: CSS selector for the selected variant; only if the theme doesn't update `[name="id"]` or `?variant=`. See [Theme integration](https://docs.getoptical.app/en/desarrolladores/integracion/). ## "Optical Form Drawer" app embed Enabled under **App embeds**, it controls the drawer and its relationship with the theme's cart. **Cart appearance** - **Compact the add-on lines in the cart** (`cart_tidy_addons`) — off by default. Shrinks the add-on lines so the frame stays the headline. It only changes sizes: which controls each line shows is decided by the next three settings. Verified on Horizon 4.x and on Split; on themes that don't print that class it does nothing. - **Add-ons in the cart** (`cart_addon_rows`) — **"Visible without controls"** by default since October 2026 (before, "Visible with their controls"; if you had the embed enabled already, you keep your choice): no quantity stepper and no remove button. "Hidden" does not paint their lines in the cart at all. They are still charged and still appear at checkout and on the order: the frame's line shows the frame's price while the cart total includes them, and what the customer chose stays readable under the frame. - **Hide the remove button of accessories** (`cart_accessory_remove`) — off. They still go when the frame is removed. - **Hide the quantity selector of contact lenses** (`cart_contact_lens_selector`) — on by default since October 2026 (before, off). Their boxes per eye are chosen in the configurator and the app puts the quantity back if anything changes it in the cart; this only hides the selector. - **Custom CSS** — rules to override any drawer or button style. It loads on every storefront page, so it can also restyle how your theme prints the form's line item properties in the cart. **Cart integration** - **After add to cart** (`cart_after_add`): open the cart drawer, redirect to `/cart`, or do nothing. "Do nothing" only means the bridge opens nothing itself: the theme still receives the standard `shopify:cart:lines-update` (`action: 'add'`), and Horizon 4.x opens its drawer on it whenever its `cart-drawer-component` carries `auto-open` (its own **"Add to cart" auto-opens drawer** setting, under Theme settings › Cart; off by default on Horizon 4.2.0). The theme wins. Since 1.5 the cart lines travel in the same request as the add and in the event's promise (`detail.sections`), so Horizon paints them before opening. - **Keep the cart in sync** (`cart_intercept`) — **on by default**. On themes with Shopify's standard cart events it listens passively; on older themes it monitors cart API calls. - **Set quantity from the cart** (`cart_set_quantity`) — **"Scale"** by default: when the customer raises the frame's quantity in the cart, the add-ons multiply with it (two lenses per frame, one treatment per frame…). **"Lock"** puts it back to 1 with a short notice under the line. In both modes an add-on changed on its own goes back to its place, and **contact lenses are never scaled**: their boxes per eye are set in the configurator and any change goes back to them with its own notice. Both notices are translated and can be changed in the app's locales. - **Accessories in the cart** (`cart_accessory_quantity`) — **"Free quantity"** by default: solutions, cases and other extras are changed by the customer and do not multiply with the frame. "Follow the frame" treats them like one more add-on. - **When a lens or treatment is removed** (`cart_orphan_action`) — **"Remove the whole set"** by default: when the customer removes a lens, a treatment or a colour from the cart, the app removes the frame and the rest of its add-ons in one request, with a short notice in the cart (translated text, `cart_set_removed_notice` in the locales). An accessory removed on its own never triggers it. "Keep the frame and show a notice" leaves the frame marked with the notice under the line, as before, and removes nothing: the decision is yours, with the `optical-form:cart:orphan` event. **The control settings ship without effect** Everything above ships as it looked until now: nothing hidden, and the add-ons following the frame. The rules that hide controls reach the themes we measured (Horizon 2.x to 4.x, Dawn 15 and 16, Split) and, on any other, the marks the bridge leaves on the controls of each row of the set. See [Tested themes](https://docs.getoptical.app/en/guias/temas-probados/#any-theme-the-classes-the-bridge-leaves). **Advanced** — only if your theme isn't picked up automatically: - **Open the drawer from the cart icon** (`cart_intercept_icon`) — **off by default**. Turn it on only if clicking the icon does nothing. - **CSS selectors** (empty = auto-detect): cart count, cart icon and **section IDs to refresh**. There is no separate cart drawer selector: it is detected automatically. - **Debug mode** — logs CartBridge activity to the browser console. **Start with auto-detect** Leave the selectors empty: CartBridge auto-detects the patterns of Dawn, Horizon and most themes. Only fill them in if the cart doesn't refresh or the drawer won't open. --- # What to do with each event > The eight events the configurator emits, one by one, and what you can build on top of them with your chat, your analytics or your cart recovery, without touching the app. Source: https://docs.getoptical.app/en/desarrolladores/eventos/ Language: en The configurator tells you what the shopper is doing through browser events. Nothing to switch on: they are always emitted, and if nobody listens nothing happens. This page goes event by event with concrete ideas; the technical contract (shared fields, versioning, what they never carry) lives in [Theme integration](https://docs.getoptical.app/en/desarrolladores/integracion/#configurator-events). ## How to listen They are dispatched on `` and **bubble**, so listening on `document` is enough. All of them carry a `detail` with the same context: `sessionId` (stitches a whole visit together), `productId`, `variantId`, `stepIndex`, `stepId`, `stepType` and `totalSteps`. ```js document.addEventListener('opticalform:open', (e) => { console.log('configurator opened on product', e.detail.productId); }); ``` Two limits worth knowing before you build: the events **never carry the shopper's answers** (no prescription, no file, no texts) and **cannot be cancelled**. They say where the shopper is, not what they answered, and they do not let you intervene. ## The ten events ### `opticalform:open` — the configurator opens The first moment you know this person wants to build glasses, not just look at a frame. - **Load your chat only now.** If your chat loads lazily for privacy reasons, this is the right trigger: someone who looks without touching leaves no third-party cookies. - **Tag the session** in your chat or analytics: "is configuring glasses" is worth more than "viewed a product". - **Start a clock**: the time from here to `:addtocart:success` is your real configuration time. ```js document.addEventListener('opticalform:open', () => { if (!window.myChatLoaded) loadMyChat(); // your function, your provider }); ``` ### `opticalform:step:rendered` — the shopper reaches a step Also carries `isFirst` and `isLast`. Emitted when the step **changes**, not on every re-render. - **Funnel by step** in your analytics: you will know where people stop, which is the question that decides what to fix. - **A contextual chat message** when they reach the prescription (`stepType` `graduation`, `reading_rx` or `contact_lens`): "Got your prescription handy? If not, upload a photo." Once per session, not on every step. - **Prepare the finish** when `isLast` is `true`: for example, mention free shipping. ```js document.addEventListener('opticalform:step:rendered', (e) => { dataLayer.push({ event: 'lens_step', step: e.detail.stepType, index: e.detail.stepIndex }); }); ``` ### `opticalform:validation:error` — a step will not let them move on It does not carry the failing value, only the step. - **Count where people stumble.** If one step concentrates the errors, the step is the problem: its help text, its example, whether it should be required. - **Offer help after a few tries**: on the second or third error on the same step, the chat can open with a direct question. ### `opticalform:addtocart:start` — the add begins Between this event and the next one the configurator is talking to the Shopify cart. - **Hide what gets in the way** while adding, such as a chat launcher floating over the button. - **Measure the latency** to `:addtocart:success`: if it grows, something changed in the theme or in a cart app. ### `opticalform:addtocart:success` — the cart accepted it Carries `lineCount`, `totalPrice` (in cents) and `currency`. This is your conversion event. - **Send the conversion** to GA4, Meta or TikTok with its value. Before this moment the price deliberately does not travel; after it, it is already in `/cart.js`. - **Recommend the extra they skipped**: a case, a second pair, a treatment. - **Explain the cart** to first-timers: the frame and every lens or treatment arrive as separate lines with their own price. That is what your lab receives. ```js document.addEventListener('opticalform:addtocart:success', (e) => { gtag('event', 'add_to_cart', { value: e.detail.totalPrice / 100, currency: e.detail.currency, items: [{ item_id: String(e.detail.productId), quantity: e.detail.lineCount }], }); }); ``` ### `opticalform:addtocart:error` — it failed Carries `kind` — the cause — and `line` — which line failed. `kind` is one of `sold_out` (the frame is sold out), `addon_unavailable` (a treatment, colour or accessory cannot be sold), `limit` (the cart already holds all the stock), `unavailable` (something no longer exists), `throttled` (Shopify asked to wait) or `unknown`; `line` is `frame`, `addon` or `unknown`. It also fires when the drawer refuses to send without calling Shopify, because it already knew the frame or an add-on was sold out. - **Alert support** with `sessionId`, `productId`, `kind` and `line`: you get there before the shopper writes. - **Retry only when `throttled`**; the others are not fixed by repeating. - **Watch `addon_unavailable`**: each one is a lens, colour or accessory variant that couldn't be sold while people were choosing it — the editor shows it under **Check prices**. `sold_out` is the frame: the product-page button should already read "Sold out". ### `opticalform:close` — it closes Carries `completed`: `true` if they finished, `false` if they left. That is the whole difference when recovering an abandonment. - **Abandonment with context**: with `completed` at `false` you know the step (`stepType`, `stepIndex`) and the product. A chat message, a "we saved your configuration" note or an email form are worth more here than any exit popup. - **Leave finishers alone**: with `completed` at `true`, the only thing to do is let them go to the cart. ```js document.addEventListener('opticalform:close', (e) => { if (!e.detail.completed) myChat.message('Any questions? Write to us here.'); }); ``` ### `opticalform:resume` — the shopper resumes a half-finished configuration If they closed the configurator before finishing and come back to the same product within 7 days, the app offers “Continue where you left off”. This event fires when they press it. It carries `restoredSteps`: how many steps got their answer back. Like every event, **it does not say what they answered**. And it only fires if the merchant has turned on “Remember a half-finished configuration” under Design › Navigation (it is off by default). - **Measure whether it helps**: how many `resume` against how many `close` without `completed` tells you whether it is worth keeping on. The Analytics tab already counts it (“N resumed a half-finished configuration”). - **Change the chat's tone**: someone resuming has already decided half of it; “need a hand with the prescription?” fits better than “shall we start?”. ```js document.addEventListener('opticalform:resume', (e) => { myAnalytics.event('configurator_resumed', { steps: e.detail.restoredSteps }); }); ``` ### `optical-form:cart:orphan` — a child line is missing in the cart This one is not emitted by the configurator but by the cart bridge, on `document`, when it detects a frame without the lenses, treatments or colours it left with: the customer removed them from the theme's cart (a removed accessory does not count). Carries `groupId`, `key`, `expected`, `actual` and `action`: `'removed'` when the app removed the whole set — what it does by default since October 2026; it also carries `lines`, the keys of the lines it set to 0 — or `'notice'` when you chose "Keep the frame and show a notice" in the embed: then the app paints a translated notice under the row and **removes nothing and blocks no checkout**. - **You decide** (with "Keep the frame and show a notice"): remove the frame, warn through chat, or let it through if in your store a frame can be bought on its own. - **Measure it**: how many remove the lenses tells you whether the add-on price surprises people in the cart. ### `optical-form:cart:resync` — the bridge squared a set Also from the cart bridge, on `document`, every time it corrects the quantities of a set after a customer's change in the theme's cart: the frame went up and the add-ons were multiplied with it ("Scale"), or the frame went back to its base ("Lock", or a pair of contact lenses). Carries `groupId`, `mainKey`, `quantity` (the frame's quantity after the adjustment), `base`, `sets`, `mode` (`'scale'` or `'lock'`) and `changed` (a list of `{ key, from, to }` with every line touched). It may carry `reason`: `'form-quantity'` when what went back is a pair of contact lenses to its boxes, `'unknown-ratio'` when the bridge does not know the set's ratio and touches nothing, and `'capped'` when Shopify did not accept the requested quantity (out of stock) and the set is marked `ofd-bundle-mismatch`. - **Show the adjustment your way**: the app paints a translated notice under the line; with this event you can replace it with yours. - **Measure it**: how many raise the frame from the cart, and how often Shopify caps it for stock. ## Three complete recipes **Funnel in Google Analytics 4.** Listen to `:open`, `:step:rendered`, `:validation:error`, `:addtocart:success` and `:close`, and send each as an event with `stepType` and `stepIndex`. In GA4, a funnel report by `stepIndex` shows the drop step by step; `sessionId` as a custom dimension stitches the whole visit together. **A chat that accompanies.** Load your provider on `:open`, keep in `sessionStorage` which messages you have already shown so you do not repeat them, and send at most one per milestone: reaching the prescription, adding to the cart, closing without finishing. If your chat lives at the bottom right, make room for it with the **Space kept free at the right of the footer** setting (Design › Navigation) so it does not cover the continue button: see [Design & cart](https://docs.getoptical.app/en/guias/diseno-y-carrito/). **Abandonment recovery.** On `:close` with `completed` at `false`, store `productId` and `stepIndex`; if you have the customer's email (they are logged in, or your popup asks for it), your email tool can send a "pick up where you left off" with the product link. The app does not save half-finished configurations: what you recover is the intent, not the answers. ## What you cannot do with them - Cancel a step, an add or a close: `preventDefault()` does nothing, on purpose. - Read the prescription, the uploaded file or the merchant's texts: the `detail` is a closed list. `stepType` does travel, and it is inferred health data; treat it as such. - Change what a step validates: that is configured in the form, not in a script. Versioning and re-render details are in [Theme integration](https://docs.getoptical.app/en/desarrolladores/integracion/#versioning). --- # Agencies and development stores > Building an optician's store for a client — Pro is free on your development store, what happens when you move to the real store, and what we need from your theme. Source: https://docs.getoptical.app/en/desarrolladores/tiendas-de-desarrollo/ Language: en If you're an agency or a developer building an optician's store for a client, you'll usually start on a Shopify Partners **development store**. Optical Form is built with that path in mind. Here's what changes compared with a regular store, and what doesn't. ## Pro costs nothing on a development store Shopify lets developers test apps on their development stores **without paying the subscription**, and Optical Form has that option switched on. When you click **View plans & pricing** inside the app, Shopify's page offers **Pro at $0**: approve it and you have a real subscription, with no charge and no expiry for as long as the store remains a development store. There's no trial clock to watch and no card to enter. It's the same app, with everything Pro does. ## The 14-day welcome window applies here too As on any store, installing gives you [14 welcome days](https://docs.getoptical.app/en/facturacion/planes/#what-happens-from-the-moment-you-install) with the full app and no plan chosen. On a development store that has one practical consequence: if you don't pick the free Pro plan, **on day 14 the configurators switch off just the same**, in the middle of your work. Pick it on day one and forget the calendar. ## When you move to the client's store The development store and the live store are two different stores to Shopify, so the app is installed **again** on the client's store, from the [App Store](https://apps.shopify.com/optical-form?locale=en). That's where a plan is chosen and the charge approved: the **14-day free trial** starts that day, not the day you installed on the development store. Your client can cancel before it ends and pay nothing. To carry your work over, **export each form as JSON** from its Settings tab and import it on the live store. One detail: add-ons and accessories point to products of the store where they were created, so after importing, review those links and point them at the client's products. See [Copying a form](https://docs.getoptical.app/en/guias/copiar-formulario/). Theme settings — the app embed and the button block — don't travel either: you switch them on again in the client's theme. The Setup guide on the Home detects it and flags it for you. ## What you can test on a development store The whole shopper journey, checkout included: development stores accept **test orders** through Shopify's test gateway, so you can see how the prescription reaches the order and the confirmation email before a real customer exists. The only thing you can't do is take real money. ## Your theme Optical Form works on any Online Store 2.0 theme, but **the cart is drawn by the theme**, and that's where themes differ. Start with [Tested themes](https://docs.getoptical.app/en/guias/temas-probados/): if the client's theme is there, you'll find what to adjust and the CSS already measured. If it isn't, send [support@getoptical.app](mailto:support@getoptical.app) **a theme preview link with the form active on a product page**. With that we measure how that theme draws the cart and send you back the recipe — what to change in the embed settings and which CSS to paste — before it goes live. It's what we do with every new theme, and it's better done early than late. ## If something doesn't fit Write to us. An agency that builds opticians' stores matters a lot more to us than a one-off install, and integration questions get fast answers. --- # FAQ > Common questions about Optical Form. Source: https://docs.getoptical.app/en/faq/ Language: en ## Do you take a commission on my sales? No. Ever. GetOptical charges a **flat plan price** — monthly or annual — and you keep 100% of every sale. ## Can a customer buy without filling in the form? Yes, if you allow it — and that is a business decision of yours, not a fault in the app. Your theme keeps its own buy buttons (the one on the product page, the bar that appears as you scroll, and quick-add on collection pages), and those add the frame **with no lenses and no prescription**. That may be exactly what you want, if you also sell bare frames. And if it isn't, it takes ten minutes to close with a dedicated product template. Both routes, step by step, in [Controlling how each frame is bought](https://docs.getoptical.app/en/guias/evitar-compras-sin-configurar/). ## Does it work on my theme? Yes, on any **Online Store 2.0** theme — the ones that let you add blocks from the theme editor. Optical Form uses a theme-agnostic layer that detects the selected variant and bundles the cart correctly: verified on **Dawn** and **Horizon**, with adapters for custom themes. See [Theme integration](https://docs.getoptical.app/en/desarrolladores/integracion/). ## What happens if the customer presses the browser's Back button? It goes back one step, just like the panel's "Previous" button: opening the configurator and every step forward leave an entry in the browser history, so the phone's back gesture does what the customer expects. On the first step, Back closes the configurator and the customer stays on the product page — it never takes them to another page. On close, those entries are removed and the history is left as it was. ## Do I need a developer to install it? No. It installs by enabling an **app embed** and assigning the form to a product. Only heavily customized themes may need a CSS selector tweak. See [Install](https://docs.getoptical.app/en/empezar/instalacion/). ## How are lens types and treatments billed? As **real Shopify products** linked to options ([add-ons](https://docs.getoptical.app/en/guias/accesorios-y-addons/)). They're added as separate lines and grouped under the main product as a bundle, so Shopify includes them on the order and they reach your lab. ## Can the customer pick the color of a tint or a polarized lens? Yes. Any option in the form can carry a row of **selectable colors**: the customer taps the color they want and **only that one is charged** and reaches the order with its reference. Each color is a variant of one of your Shopify products, and the color dot is that variant's photo — nothing else to set up. To group colors (classic, fashion, gradient…), create one product per group. See [Selectable colors](https://docs.getoptical.app/en/guias/accesorios-y-addons/#selectable-colors-per-option). ## I changed a form and the store doesn't update. Why? Saving doesn't publish. You must click **Sync** for changes to reach the storefront, and the form must be **Active**. See [Sync](https://docs.getoptical.app/en/guias/sincronizacion/). ## Can a product have two forms? No. **Each product takes a single form**, even though one form can carry many products. If you assign a form a product that already belonged to another, **the new one takes it**, with no warning: the previous form loses it silently. If what you want is the same frame sold **with and without** the configurator, you need neither two forms nor two products: your theme's button and Optical Form's live side by side on the same page (see [Controlling how each frame is bought](https://docs.getoptical.app/en/guias/evitar-compras-sin-configurar/)). Two different **forms** on the same frame do require two products. See [Creating a form](https://docs.getoptical.app/en/guias/crear-formulario/). With collections the rule is the same but layered: the product's own assignment always wins, and if the form only reaches it through a collection, it shows the form of the first assigned collection it belongs to. See [Products and collections](https://docs.getoptical.app/en/guias/productos-y-colecciones/). ## Can I copy a form to another store? Yes. **Export the form as JSON** from the Settings tab and use **Import from JSON** on the other store. ## Is there a free trial? Yes — **14 days**, billed through Shopify. Cancel before they end and you won't be charged. One detail that decides when to subscribe: **the trial starts when you approve the subscription, not when you install the app**. The days you spend deciding cost you nothing. And before the trial there's something else: a **14-day welcome window from the moment you install**, with the full app and no plan chosen. When it ends, the configurators switch off on your storefront until you pick a plan — but nothing is deleted. The full day-by-day timeline is in [Plans & billing](https://docs.getoptical.app/en/facturacion/planes/#what-happens-from-the-moment-you-install). ## I'm an agency working on a development store — do I pay? No. On a Shopify Partners development store you can pick **Pro at $0** and build the client's store with no clock running. The real subscription is chosen when the app is installed on the live store, and the 14-day trial starts that day. See [Agencies and development stores](https://docs.getoptical.app/en/desarrolladores/tiendas-de-desarrollo/). ## Do you sell contact lenses? Yes, and they're included in **Pro** — there's no future plan to wait for. On install you already have a sample **Contact lenses** form, in draft, and **Create form** ships that template. The customer picks the pack, marks which eyes they're ordering and their per-eye power. If your product carries the catalogue of combinations the manufacturer actually makes, the app resolves the exact reference and sends it on the order, so your lab can order without translating anything. ## Does it work with subscription apps? Yes. If the customer picks a plan on the product page — with Shopify Subscriptions, Appstle or any app that puts its selector there — before opening the configurator, that plan travels with the frame or the contact lenses: the drawer shows the plan price and the cart charges that same amount. Add-ons and accessories are added as one-time purchases. With no plan chosen, everything works as usual. Developer detail under [Theme integration](https://docs.getoptical.app/en/desarrolladores/integracion/#subscription-plan-subscription-apps). ## Can the customer order two identical frames? Yes, from the cart: raise the frame's quantity with your theme's stepper and the lenses and treatments multiply with it. If they change an add-on on its own, it goes back to its place. And if you would rather every configured frame always be one unit, set **Set quantity from the cart** to "Lock" in the app embed: it goes back to 1 with a notice. Contact lenses are a different story: their boxes per eye are chosen in the configurator, and any change in the cart goes back to them. See [Tested themes](https://docs.getoptical.app/en/guias/temas-probados/#changing-the-quantity-from-the-cart). ## How is prescription data handled? **It never reaches our servers.** The prescription and any file your customer uploads travel over TLS **straight into your store's Shopify order**, as line item properties. We don't store them and couldn't read them: the app doesn't request permission to read orders or customers. That means you are the controller for that data, and access or deletion requests are settled inside your Shopify. You can hide it from what the customer sees without losing it from the order — see [Design & cart](https://docs.getoptical.app/en/guias/diseno-y-carrito/) — and the legal detail is in the [Privacy Policy](https://www.getoptical.app/en/privacy). ## What happens to my data if I uninstall the app? Your **forms and their product assignments are kept**: if you reinstall, they come back as they were and get published again. The copy of your catalog and the configurator analytics **are deleted after 30 days** — the app reads them back from Shopify whenever it needs them. Your customers' prescriptions were never with us: they travel inside your Shopify orders. When you uninstall you get a single email saying exactly this; if you would rather have everything deleted right away, reply to that email. ## Will you email me? Only if you need it, and always to your store's Shopify address — never to your customers. Two things: a few setup nudges if you get stuck on a step (**three at most**, and none at all if you finish setting up), and billing notices if your subscription stops being active. There's no newsletter, no offers, no weekly cadence. To stop them, **reply to any of them**: it reaches a person and we turn them off. You can also write to [support@getoptical.app](mailto:support@getoptical.app).