Shopify Functions: qué son, cómo funcionan y cuándo usarlas
Las Shopify Functions te permiten personalizar la lógica de backend de Shopify: descuentos, opciones de envío, métodos de pago o validaciones del checkout. Te explico cómo funcionan, sus límites y quién puede usarlas.
- Javi Mata
- 8 min de lectura
Tabla de contenido
- Qué es una Function
- El ciclo de vida
- Para qué sirven: las APIs
- Dónde encajan en el checkout
- Cómo se crea una: el scaffold
- La configuración: shopify.extension.toml
- Versiones del esquema
- Rust o JavaScript
- Límites que conviene conocer
- ¿Quién puede usarlas?
- Eliminar una función
- ¿Y si uso un agente de IA para escribirlas?
- Conclusión
- Fuentes
Hay cosas que Shopify no hace de forma nativa: un tipo de descuento propio, ocultar un método de pago según el carrito, o bloquear el checkout cuando un pedido supera un máximo. Las Shopify Functions permiten a los desarrolladores personalizar la lógica de backend de Shopify para construir ese tipo de funcionalidad, ejecutando código propio durante el proceso de checkout.
Esta guía es una introducción basada en la documentación oficial. Si ya trabajas con temas, mira antes Shopify CLI para temas: las Functions se crean con la misma herramienta, pero dentro de una app.
Qué es una Function
Una Function es código tuyo que Shopify ejecuta dentro de su propio backend, en momentos concretos de la compra. Los targets (objetivos) de una Function inyectan código en la lógica de backend de Shopify, y la documentación describe tres piezas:
- Entrada (input): un objeto JSON que es el resultado de una consulta GraphQL que tú defines. Así seleccionas solo los datos que necesitas, como los productos de las líneas del carrito o metafields.
- Lógica: el código que transforma la entrada. Se escribe en cualquier lenguaje que compile a WebAssembly. Hay plantillas y librerías para Rust y JavaScript.
- Salida (output): un documento JSON que describe las operaciones que quieres que Shopify ejecute.
Un detalle clave de la documentación: las Functions nunca se invocan directamente por URL ni de otra forma; Shopify las invoca cuando hace falta durante el recorrido del cliente.
El ciclo de vida
La documentación lo resume así:
- El desarrollador crea y despliega una app que contiene funciones.
- El comerciante instala la app en su tienda y configura la función.
- El cliente interactúa con la tienda y Shopify ejecuta la función.
El ejemplo oficial: un desarrollador crea una app con una función que define un nuevo tipo de descuento; el comerciante crea un descuento de ese tipo; y Shopify ejecuta la función para calcular el descuento cuando un cliente agrega un producto al carrito.
Para qué sirven: las APIs
Cada tipo de personalización tiene su propia Function API. Los tutoriales oficiales de introducción muestran estos casos de uso:
- Descuentos: crear un nuevo tipo de descuento.
- Pagos: ocultar una opción de pago que se ofrece en el checkout.
- Opciones de entrega: renombrar una opción de entrega en el checkout.
- Validación del checkout: bloquear el checkout cuando un pedido supera un máximo para clientes sin historial de pedidos.
- Reglas de ubicación: elegir una ubicación de pedido distinta durante el checkout.
- Bundles personalizados: agrupar productos y venderlos como una unidad.
- Restricciones de fulfillment: personalizar las estrategias de cumplimiento y entrega.
- Recogida local y puntos de recogida: generar opciones de entrega y cargos de recogida.
Dónde encajan en el checkout
Las Functions se ejecutan en una secuencia concreta durante el checkout, y cada una depende de datos de pasos anteriores. Según la referencia oficial, el orden es:
- Líneas del carrito: Cart Transform
- Descuentos de líneas: Discount
- Grupos de fulfillment: Fulfillment Constraints y Order Routing
- Métodos de entrega: Pickup Point Delivery Option Generator, Local Pickup Delivery Option Generator y Delivery Customization (en la referencia, los dos primeros enlazan a la versión
unstablede la API) - Descuentos de entrega: Discount
- Métodos de pago: Payment Customization
- Verificación: Cart and Checkout Validation
Por eso, por ejemplo, una función de validación del carrito no puede correr hasta después de calcular los descuentos.
Cómo se crea una: el scaffold
Una Function necesita varios archivos esenciales: la configuración TOML, el esquema GraphQL, la consulta de entrada y el código. La CLI de Shopify los genera por ti:
shopify app generate extension
Dentro del proyecto, los archivos clave son:
shopify.extension.toml: la configuración (nombre, tipo, versión de API, ruta de la consulta, build).run.graphql: tu consulta de entrada. La estructura del JSON de entrada coincide con la forma de esa consulta.schema.graphql: una copia del esquema de la Function API.
La documentación muestra este ejemplo de consulta y de entrada resultante:
query {
cart {
cart_field {
property
}
}
}
{
"cart": {
"cart_field": {
"property": "bar"
}
}
}
Y el formato de la salida: un objeto con una lista de operaciones.
{
"operations": [
{
"operations_field": {
"field": "value"
}
}
]
}
En el código, una función en JavaScript tiene esta forma básica (según la referencia):
export function run(input) {
//function logic
return { };
}
La configuración: shopify.extension.toml
Las propiedades obligatorias incluyen api_version y, dentro de [[extensions]]: type (para Functions, function), name (el nombre que ve el comerciante en el administrador), handle (identificador interno único que no puedes cambiar después de crear un borrador o desplegar) y uid (lo genera Shopify automáticamente al crear la extensión con la CLI; no lo edites a mano). Un [[extensions.targeting]] define el target, la ruta de la consulta (input_query) y el export.
Este es un fragmento del ejemplo oficial (versión 2026-10 de la referencia; se omiten uid, [extensions.build] y la configuración de la interfaz):
api_version = "2026-10"
[[extensions]]
name = "t:name"
handle = "my-discount-function"
type = "function"
[[extensions.targeting]]
target = "cart.lines.discounts.generate.run"
input_query = "src/run.graphql"
export = "run"
Y en [extensions.build] defines el comando de compilación, la ruta del módulo .wasm (por defecto dist/index.wasm) y qué archivos vigilar durante el desarrollo. Para JavaScript y TypeScript, el watch por defecto es ['src/**/*.js', 'src/**/*.ts'].
Versiones del esquema
Las Function APIs tienen versiones y se actualizan cada trimestre; el detalle está en el changelog de desarrolladores. La referencia recomienda usar siempre la última versión soportada. Para regenerar el esquema y los tipos:
shopify app function schema
shopify app function typegen
El segundo es solo para funciones basadas en JavaScript. Con shopify app function schema --stdout imprimes el esquema en la salida estándar, por ejemplo, para pasarlo a una herramienta de generación de código.
Rust o JavaScript
Las Functions se ejecutan en flujos críticos, como el checkout, donde puede haber varias funciones por solicitud y cada una suma latencia. Por eso hay límites de plataforma, y la documentación es explícita con el lenguaje:
- Los lenguajes que compilan directamente a WebAssembly, como Rust, rinden mejor que los dinámicos, como JavaScript.
- Si tu función va en una app pública, opera con muchas líneas de pedido o es computacionalmente compleja, elige Rust para mantenerte dentro de los requisitos de instrucciones.
- Para prototipar, JavaScript es un buen punto de partida si ya lo conoces, pero se alcanzan antes los límites de instrucciones.
Shopify recomienda “fuertemente” Rust para evitar que tu función falle con carritos grandes.
Límites que conviene conocer
Según la referencia oficial, todas las funciones deben respetar estos límites:
| Recurso | Límite |
|---|---|
| Tamaño del binario compilado | 256 kB |
| Memoria lineal en ejecución | 10,000 kB |
| Memoria de pila en ejecución | 512 kB |
| Logs escritos | 1 kB (se truncan) |
Y para carritos de hasta 200 líneas (para carritos más grandes, los valores escalan proporcionalmente):
| Recurso | Límite |
|---|---|
| Instrucciones de ejecución | 11 millones |
| Entrada de la función | 128 kB |
| Salida de la función | 20 kB |
Las consultas de entrada también tienen límites, entre ellos: un máximo de 3000 bytes por consulta (sin contar comentarios) y un costo de consulta calculado máximo de 30 (un campo que devuelve un objeto Metafield cuesta 3).
Otras restricciones que menciona la documentación:
- No se permite el no determinismo: no puedes usar aleatoriedad ni relojes.
- No puedes depurar imprimiendo en
STDOUToSTDERR. - Una app solo puede referenciar sus propias funciones en las mutaciones de la Admin API.
- Algunas funciones admiten acceso a red, con condiciones; también puedes precargar datos con metafields de productos y clientes, o pasar datos con atributos del carrito.
¿Quién puede usarlas?
Esta es la parte que más conviene mirar antes de empezar, según la documentación:
- Las tiendas de cualquier plan pueden usar apps públicas distribuidas en la Shopify App Store que contengan funciones.
- Solo las tiendas en un plan Shopify Plus pueden usar apps personalizadas (custom apps) que contengan Function APIs.
- Algunas capacidades están disponibles solo para tiendas Plus; el detalle está por API en la referencia.
- El fetch target (una llamada HTTPS a un servicio externo) tiene acceso limitado: está restringido a apps personalizadas instaladas en tiendas Enterprise y requiere solicitar acceso de red (no está disponible en tiendas de desarrollo). Hay excepciones en algunas Function APIs; cada página de referencia indica su caso.
Si trabajas con clientes en planes que no son Plus, esto significa que tu función tendría que distribuirse como una app pública. Confirma siempre la disponibilidad de la API concreta que vayas a usar en su página de referencia.
Eliminar una función
Para eliminarla, quita los archivos correspondientes del directorio /extensions de tu app y vuelve a desplegarla. Al hacerlo, la función se elimina de forma permanente (junto con sus function owners) y deja de ejecutarse en todas las tiendas que tengan tu app instalada.
¿Y si uso un agente de IA para escribirlas?
Las Functions tienen reglas estrictas (límites, determinismo, esquemas versionados). Mi recomendación es que, si usas un agente, este consulte la documentación actual y no dependa de lo que recuerde. Cómo conectarlo a la documentación oficial de Shopify lo explico en el artículo sobre el Shopify AI Toolkit con Claude Code.
Conclusión
Las Shopify Functions te permiten personalizar la lógica de backend de Shopify: una consulta GraphQL de entrada, tu lógica en WebAssembly y una salida de operaciones. Empieza con uno de los tutoriales oficiales, prototipa en JavaScript si lo necesitas, pasa a Rust cuando el rendimiento lo exija, y revisa desde el principio si tu caso de uso está disponible en el plan de tu tienda.
Fuentes
Etiquetas:
Compartir: