Llevar un proyecto Shopify a producción tiene tres rutas: app custom (sin review, una tienda), App Store público (review con criterios de performance, seguridad, y UX), o Theme Store (review estricta: accessibility, i18n, inventario, documentación). Built for Shopify es la certificación de calidad para apps embebidas en el admin. El checklist senior que cierra este tutorial cubre las 20+ capacidades que definen el perfil senior en el ecosistema Shopify.
Las tres rutas de distribución
Antes de hablar de review, hay que entender cuál de los tres caminos aplica a tu proyecto. La elección determina si hay un proceso de review, cuánto dura, y qué criterios aplican.
Ruta 1: App custom (privada)
Una app custom se instala en una sola tienda mediante una invitación directa del comerciante. No pasa por el App Store, no hay review pública. El comerciante va a Admin → Apps → Desarrollar apps y te da acceso, o tú generas las credenciales desde tu Partner Dashboard y compartes el link de instalación.
Esta es la ruta correcta cuando el cliente es uno solo, cuando la app contiene lógica de negocio específica de esa empresa, o cuando necesitas iterar rápido sin el ciclo de review. La desventaja: si el cliente tiene múltiples tiendas, tienes que instalar la app en cada una por separado.
Ruta 2: App pública en el App Store
Una app pública puede instalarse en cualquier tienda Shopify. Para llegar al App Store, tu app pasa por el proceso de review de Shopify — una evaluación manual que puede tomar una a tres semanas en la primera submisión. Los criterios cubren performance (Lighthouse), seguridad (HMAC, CSP), scopes (least-privilege), UX, y honestidad en los metadatos.
Una vez publicada, Shopify hace auditorías periódicas. Si tu app cae por debajo de los estándares después de publicarse, puede ser removida del App Store.
Ruta 3: Theme Store
Los themes que se venden en el Theme Store de Shopify pasan por el proceso de review más estricto del ecosistema. Los criterios incluyen accesibilidad completa (WCAG 2.2 AA), internacionalización (ningún texto hardcodeado en inglés), lógica de inventario correcta (mostrar disponibilidad real, manejar out-of-stock correctamente), documentación para el comerciante, y documentación técnica para el desarrollador. El proceso puede tomar semanas y es frecuente que el review pida cambios antes de aprobar.
Built for Shopify
Built for Shopify (BFS) es la certificación de calidad para apps embebidas en el admin de Shopify. No es un requisito para publicar en el App Store, pero es la distinción que Shopify otorga a las apps que cumplen sus más altos estándares de UX, performance, y seguridad.
Para obtener la certificación BFS, tu app embebida debe cumplir todos estos requisitos:
Session tokens: autenticación con JWT (session tokens), no con cookies de terceros
App Bridge: usar App Bridge v4 para la integración con el admin de Shopify — menú de navegación, modales, toasts, y comunicación con el frame del admin
Polaris: la UI del admin está construida con componentes Polaris — no CSS propio que compita visualmente con el admin de Shopify
Core Web Vitals: LCP, INP, y CLS dentro de los umbrales de Google en el admin iframe
Scopes mínimos: solo los scopes de OAuth que la app realmente usa, en la cantidad mínima necesaria
Metadatos honestos: el nombre, la descripción, y los screenshots en el App Store describen con precisión lo que la app hace — sin promesas de features que no existen
Cleanup de datos en uninstall: el webhook app/uninstalled borra los datos del comerciante que tu app tiene en tu servidor, conforme a GDPR/CCPA
Checklist de review para apps
Antes de submittir tu app al App Store, verifica cada uno de estos puntos. Una submisión incompleta puede ser rechazada, y el ciclo de corrección y re-review puede añadir semanas al timeline.
OAuth y autenticación:
El flujo OAuth funciona con una instalación en una tienda limpia, sin estado previo
Todos los redirect URIs declarados en el Partner Dashboard están implementados y responden correctamente
El PKCE flow está implementado si la app usa Shopify CLI v3 (el CLI lo configura automáticamente)
Scopes:
Todos los scopes declarados en shopify.app.toml son usados activamente por la app
No hay scopes declarados “por si acaso” — si un scope no se usa en el primer release, no se declara
Si la app necesita scopes adicionales en una versión futura, los agrega con un mensaje claro al comerciante durante la actualización
Seguridad:
Todos los webhooks validan la firma HMAC antes de procesar el payload — sin excepción
El Content Security Policy del admin iframe está configurado correctamente (frame-ancestors https://*.shopify.com, https://admin.shopify.com)
El token de Admin API está en variables de entorno del servidor, nunca en el código ni en el cliente
La app no hace llamadas al Admin API antes de que el flujo de instalación esté completo (sin el access token)
Webhooks obligatorios de GDPR:
Shopify requiere que todas las apps públicas implementen tres webhooks de conformidad con GDPR y CCPA. Sin estos, la app no puede pasar el review:
customers/data_request: el comerciante solicita exportar los datos de un cliente
customers/redact: el comerciante solicita borrar los datos de un cliente
shop/redact: cuando un comerciante desinstala la app, 48 horas después Shopify envía este webhook para señalar que los datos de la tienda deben borrarse
Los tres deben responder HTTP 200 dentro de los 5 segundos. La lógica real (exportar o borrar datos) puede correr en background, pero el handler debe responder inmediatamente.
Billing:
Si la app cobra una tarifa de uso, el flujo de billing usa el Billing API de Shopify — no un procesador de pagos externo
El periodo de prueba gratuito (si existe) está correctamente configurado en el Billing API
La app no desactiva funcionalidades cuando el comerciante está en trial, solo cuando el trial expiró y no completó el billing
UX:
La primera pantalla que ve el comerciante después de instalar le explica qué hace la app y cómo empezar
Los estados de error son legibles — no dumps de JSON ni mensajes técnicos para el comerciante
Las acciones destructivas (borrar datos, cancelar algo) tienen confirmación explícita
Checklist de review para themes
El process de review del Theme Store es más detallado que el de apps. Los auditores revisan el theme manualmente en una tienda de prueba con datos reales.
Performance:
Lighthouse ≥ 75 en mobile con los datos de demo del theme — no en una tienda en blanco
No hay JavaScript bloqueante en el critical path (scripts en el <head> sin async o defer)
Las imágenes del theme usan el filtro image_url: width: con los atributos width y height correctos
El theme no carga recursos de terceros externos en el critical path (fuentes de Google Fonts sin preconnect, etc.)
Accesibilidad:
Navegación completa por teclado: menú, carrito, modales, dropdowns
Contraste WCAG 2.2 AA: relación ≥ 4.5:1 para texto normal, ≥ 3:1 para texto grande
Todos los inputs tienen labels o aria-label
Skip-to-content link visible cuando recibe foco
ARIA solo cuando HTML nativo no puede expresar la semántica necesaria
Target size mínimo de 24x24px para elementos interactivos (criterio nuevo de WCAG 2.2)
Internacionalización:
No hay textos hardcodeados en los archivos .liquid — todos usan {{ 'key' | t }}
Los archivos de locale cubren todos los strings de UI
El theme maneja RTL correctamente cuando el locale es árabe o hebreo
Los precios usan el filtro | money para que Shopify aplique el formato correcto
Inventario:
Los productos out-of-stock muestran un estado claro (“Agotado”, “Sin stock”)
El botón “Agregar al carrito” está deshabilitado correctamente cuando no hay inventario
La lógica de variantes muestra correctamente qué combinaciones están disponibles vs. agotadas
Documentación:
Guía para el comerciante: cómo personalizar el theme desde el editor visual
Guía técnica: cómo instalar, cómo manejar actualizaciones de Shopify, qué customizaciones son soportadas
Metadata:
Nombre y descripción del theme describen con precisión lo que ofrece
Los screenshots muestran el theme con datos reales, no placeholders
Sin emojis en el nombre ni en la descripción del Theme Store
Debugging en producción
Cuando algo falla en producción, el flujo de diagnóstico tiene un orden:
1. Partner Dashboard → Events
El primer lugar para ir. El dashboard de events muestra un timeline de webhooks recibidos, errores de API, y eventos de la app en las últimas 72 horas. Filtrar por tienda y por tipo de evento. Si un webhook falló repetidamente, acá está la evidencia.
2. requestId en las respuestas del Admin API
Cada respuesta del Admin API incluye el header X-Request-Id. Cuando reportas un error a Shopify Support, ese requestId es lo que les permite rastrear la request en sus sistemas. Loguea ese header en todas las respuestas de Admin API — es la diferencia entre “algo falló” y “la request ABC123 falló a las 14:32 UTC con este error”.
// Loguear requestId en cada respuestaconst response = await fetch(adminApiUrl, { headers });const requestId = response.headers.get('x-request-id');console.log({ requestId, status: response.status });
3. Rate limit: backoff sobre 429
Un 429 del Admin API significa que agotaste el bucket de costo. No reintentes inmediatamente — el header Retry-After te dice cuántos segundos esperar. El backoff exponencial con jitter es el estándar: esperar Math.pow(2, attempt) * 1000 + Math.random() * 500 ms antes de reintentar. Después de 5 reintentos, loguear como error crítico y alertar.
4. Errors en Oxygen (Hydrogen)
Los errores de loader en Hydrogen que llegan a un throw new Response(...) son capturados por el Error Boundary del componente padre. Los errores no capturados muestran la pantalla de error de Oxygen. Configurar sentry o equivalente para capturar errores de runtime antes de que lleguen al usuario.
Versionado y rollback
Apps: cada shopify app deploy crea una nueva versión inmutable. Para hacer rollback, redespliegas una versión anterior (por tag de git o por el ID de versión en el Partner Dashboard). El comerciante no nota el rollback si la app sigue respondiendo correctamente.
Themes: el Theme Store tiene un sistema de versiones con un botón “Release” que hace swap entre la versión publicada y la anterior. Para tiendas individuales (no Theme Store), shopify theme push actualiza el theme activo. El rollback es hacer push de la versión anterior.
Hydrogen/Oxygen: los environments de Oxygen son inmutables. Cada deploy crea un nuevo environment de preview. La promoción de preview a producción hace swap en el routing de Oxygen. El ambiente anterior de producción queda como snapshot — para rollback, promueves ese snapshot de vuelta a producción desde el dashboard.
Deprecación responsable
Cuando remueves una feature de una app, el proceso correcto es:
Version N: deprecar la feature — agregar un banner en el admin de la app indicando que la feature se eliminará en 60 días. Si la feature tiene una alternativa, linkear a ella.
Transition N a N+3: mantener la feature funcional pero deprecada. Los eventos de analytics pueden ayudar a medir cuántos comerciantes la están usando activamente.
Version N+3 mínimo: remover la feature del código. Si la feature manipulaba datos (por ejemplo, guardaba registros en una tabla de tu base de datos), correr una migration que mueva esos datos a la nueva estructura o que los borre limpiamente.
Para features que requieren migración de datos, la herramienta es una bulk mutation del Admin API que procesa los recursos afectados en un job de una sola ejecución. Documentarlo en el changelog para el comerciante.
Puentes mentales
Desde Chrome Web Store / App Store de Apple
Publicar una app en el Shopify App Store es a Shopify lo que publicar una extensión en el Chrome Web Store es a Google, o una app en el App Store de Apple. El proceso de review es un forcing function para la calidad: te obliga a cubrir casos que el desarrollo informal deja sin resolver (estados de error, onboarding, cleanup en desinstalación). Las apps que pasan el review siendo honestas en sus metadatos y sólidas en sus checklist técnicos tienen tasas de instalación mayores que las apps que “pasaron la review con lo mínimo”. Los rechazos de review también pueden tomar semanas en resolverse — alinear el checklist antes de submitir es tiempo bien invertido.
Built for Shopify es incremental: Shopify introdujo un programa de certificación gradual. Podés publicar en el App Store sin BFS, y después trabajar hacia la certificación BFS como mejora post-lanzamiento.
GDPR webhooks son no-negociables: desde 2022, todas las apps públicas deben tener los tres webhooks GDPR implementados. El review los verifica explícitamente. Una app sin ellos es rechazada en la primera review.
App Bridge v4: la versión 4 de App Bridge eliminó la dependencia de Shopify/App Bridge anterior. Los componentes de App Bridge v4 son componentes de Polaris — si tienes una app embebida en v3 o anterior, planifica la migración.
WCAG 2.2 (para themes): el Theme Store actualiza sus requerimientos de accesibilidad a medida que el estándar evoluciona. Al momento de escribir esto (2026-04), el estándar vigente es WCAG 2.2 AA.
Proyecto · Brew Atlas
Brew Atlas · Paso 17
El paso final de Brew Atlas no agrega código — agrega claridad operacional. El archivo ~/proyectos/shopify/brew-atlas/GO-LIVE.md es el runbook de go-live del proyecto: qué deployar en qué orden, qué verificar en cada paso, y qué queda fuera del alcance del MVP.
El archivo documenta los siguientes pasos en orden:
1. Deploy del theme
Desde ~/proyectos/shopify/brew-atlas/brew-atlas-theme/:
✓Ejecutar Deploy theme a produccion
shopify theme push --live
2. Instalación custom de la app
Desde ~/proyectos/shopify/brew-atlas/brew-atlas-app/:
✓Ejecutar Deploy de la app
shopify app deploy
Luego: link de instalación, verificación del flujo OAuth, verificación de webhooks GDPR.
3. Activación de la Function: creación del nodo discountAutomatic via Admin API desde el admin de la app.
4. Activación de la Customer Account Extension: desde Admin → Configuración → Cuentas de cliente.
5. Deploy de Hydrogen
Desde ~/proyectos/shopify/brew-atlas/brew-atlas-hydrogen/:
✓Ejecutar Link y deploy de Hydrogen a Oxygen
shopify hydrogen linkshopify hydrogen deploy
Luego: promoción de preview a producción desde el dashboard de Hydrogen en el Partner Dashboard.
6. Cutover de dominio: CNAME al endpoint de Oxygen, verificación de SSL.
7. Verificación post-lanzamiento: checklist de rutas HTTP 200, test de flujo de compra completo, verificación de Core Web Vitals en prod.
El archivo también lista explícitamente qué está fuera del alcance del MVP: Markets, B2B, y el Theme Store review (Brew Atlas es un custom theme para una tienda propia, no un tema para vender).
El checklist senior
Este es el checklist que define el perfil senior Shopify. No es un checklist de “sé la documentación” — es un checklist de “puedo construir y razonar sobre” cada una de estas capacidades. Si puedes marcar todos los ítems con evidencia concreta (un proyecto, un fragmento de código, un diagnóstico resuelto), tienes el perfil senior.
Checklist senior
Liquid — puedes escribir templates complejos con tags, filters, objects, y lógica de control sin consultar la documentación para sintaxis básica
Online Store 2.0 — entiendes la anatomía del theme, los JSON templates, las dynamic sources, y cómo el editor visual del comerciante interactúa con tu código
Sections y Theme Blocks — puedes diseñar un sistema de sections/blocks composable que el comerciante puede reorganizar sin tocar código
Metafields — puedes modelar datos de producto con metafields custom, exponerlos en Liquid y en GraphQL, y razonar sobre qué tipo usar para cada caso de datos
Metaobjects — puedes diseñar un content model con metaobjects como alternativa a páginas o productos para contenido editorial
Storefront GraphQL API — puedes escribir queries con fragmentos reutilizables, paginación por cursor, y la directiva @inContext para localización
Admin GraphQL API — puedes escribir mutations, manejar userErrors, implementar backoff para rate limiting, y usar bulk operations para datasets grandes
Theme App Extensions — puedes construir una extensión que inyecta un bloque en cualquier theme sin modificar el código del theme, usando el App Block API
Admin App + Polaris + App Bridge — puedes construir una app embebida en el admin con autenticación por session token, componentes Polaris, y navegación con App Bridge
Shopify Functions — puedes implementar una Function de descuento en Rust con rust_decimal para montos, compilar a wasm32-wasip1, y activarla via Admin API
Checkout UI Extensions — puedes construir una extensión de checkout con el componente correcto para el target, hooks de carrito, y comunicación con tu servidor para operaciones privilegiadas
Customer Account UI Extensions — entiendes la diferencia entre las cuentas legacy y las nuevas (OTP), y puedes construir una página completa y un bloque de perfil para las nuevas cuentas
Hydrogen + React Router v7 — puedes scaffoldear un proyecto Hydrogen, escribir loaders con context.storefront.query, configurar la caché correcta para cada query, y deployar a Oxygen
Core Web Vitals — sabes qué mide LCP, INP (no FID), y CLS, y puedes diagnosticar y corregir problemas en themes y en storefronts Hydrogen
Markets — entiendes cómo se configura un market en Shopify y por qué @inContext en el Storefront API es obligatorio para mercados no-primarios
B2B — conoces el modelo de datos B2B nativo de Shopify (companies, locations, contacts, net terms) y sabes que los precios B2B requieren autenticación del contacto
Accesibilidad — puedes hacer un audit manual de WCAG 2.2 AA en un theme: contraste, focus, labels, target size, skip-to-content
Observabilidad — puedes configurar log drain en Oxygen, Web Pixels para analytics, y Consent API para cookies. Sabes por qué los webhooks no deben hacer trabajo pesado síncronamente
Webhook security — puedes implementar validación de firma HMAC con timingSafeEqual y articular por qué la comparación directa de strings es vulnerable a timing attacks
Costo del Admin API — sabes leer extensions.cost, implementar backoff exponencial en 429, y elegir entre paginación manual y bulk operations según el tamaño del dataset
Deploy y rollback — entiendes el ciclo de deploy de cada artefacto Shopify (app, theme, Function, Hydrogen) y sabes cómo hacer rollback en cada uno
App Store review — conoces los criterios de la review: OAuth, HMAC, scopes mínimos, GDPR webhooks, billing API, y metadatos honestos. Puedes preparar una submisión que pase en la primera review
Deprecación responsable — sabes comunicar deprecaciones con antelación, mantener compatibilidad durante el período de transición, y migrar datos antes de remover features
Quiz
Quiz · ¿Lo tenés claro?
5 preguntas · respondé para marcar la sección como completada.
1. Tu cliente tiene una necesidad muy específica y sólo va a instalar tu app en UNA tienda. ¿Qué ruta de distribución corresponde?
Apps custom no pasan por review. El comerciante da acceso directo desde Admin → Apps → Desarrollar apps, o el Partner genera el link de instalación. Sin review, rápido, ideal para clientes únicos.
2. ¿Qué es 'Built for Shopify' exactamente?
App Store approval es el piso (seguridad, funcionalidad básica). Built for Shopify es el techo: criterios estrictos de UX embebido en Admin, performance, A11y y Polaris. Da badge visible y ranking — no es requisito para listarse.
3. Recibís un webhook `orders/create`. Hay que enviar email, actualizar inventario externo y llamar a tres APIs más. ¿Cómo lo manejás?
Shopify espera 200 en segundos; timeout → reintentos → eventual descarte. Patrón: validar HMAC (timing-safe), persistir el payload, responder 200, procesar vía worker/queue. Trabajo síncrono pesado pierde webhooks en producción.
4. Lanzaste la v2 de tu app y un cliente reporta un bug crítico. Necesitas rollback rápido. ¿Qué sabes del modelo de versiones de Shopify Functions?
Versiones inmutables + activación explícita hacen posible rollback rápido: re-publicás una versión anterior de la app y las Functions vuelven a ese Wasm. En merchants con discountAutomaticAppCreate, la referencia es al functionId (estable), la ejecución apunta a la versión activa.
5. Para pasar la review del App Store sin rechazo, ¿cuál es el requisito MÁS frecuentemente incumplido?
Las rechazan rechazos más frecuentes son los GDPR webhooks no implementados, scopes sobre-pedidos (principio de mínimo privilegio), y HMAC sin validar. Son requisitos hard — no negociables — y fáciles de olvidar porque no afectan el 'happy path' del producto.
Cierre
Terminaste de recorrer todo el camino que promete tu CV. Si puedes armar Brew Atlas de principio a fin — theme OS 2.0, theme app extension, admin app embebida, Shopify Function en Rust, checkout extension, customer account extension, y la réplica headless en Hydrogen — tienes la base senior. El siguiente paso es construir el proyecto real: recrea Brew Atlas en tu dev store, llévalo a producción, y documenta cada decisión. Cuando apliques, esa evidencia vale más que cualquier descripción del CV.
Los links oficiales al final de cada sección son tu referencia canónica. shopify.dev cambia, este tutorial es del 2026-04 — siempre valida versiones antes de ejecutar.