La mayoría de tiendas Shopify se equivocan en esto — y les cuesta revenue.
Shopify Functions: qué son y qué hacen en tu tienda
Un explicativo técnico sobre Shopify Functions: el runtime Wasm, los lenguajes soportados (Rust, JS, TS), los siete tipos de Function y cómo se compara la arquitectura con una llamada tradicional a una API.
Actualizado 19 de mayo de 2026
Trabajamos típicamente con tiendas Shopify y Shopify Plus con $500k+ en revenue anual.
Publicado

Shopify Functions es la capa de extensibilidad para desarrolladores que controla los momentos más consecuentes de una tienda Shopify — qué descuento se aplica en el checkout, qué opciones de envío aparecen, si un método de pago se muestra u oculta, y si el cliente puede completar su compra. Corren dentro de la propia infraestructura de Shopify como módulos WebAssembly (Wasm), escritos en Rust, JavaScript o TypeScript, sin cold start y sin llamadas HTTP externas. La ejecución típicamente termina en menos de 5 milisegundos.
Este artículo es un explicativo técnico. Cubre qué es una Function a nivel de arquitectura, los siete tipos de Function que Shopify expone hoy, cómo se ve el código y dónde encajan las Functions frente a las apps y la Admin API. Si eres un merchant Plus y necesitas el cronograma de migración y un checklist paso a paso para salir de Scripts, lee el checklist de deprecación de Shopify Scripts — esa pieza cubre el bloqueo de edición del 15 de abril y el corte del 30 de junio.
Qué es realmente una Shopify Function
Piensa en una Function como un pequeño conjunto de reglas que Shopify ejecuta automáticamente en un momento específico del proceso de compra o checkout. Tú defines la lógica — "si el cliente tiene la etiqueta VIP, aplica 15% de descuento" — y Shopify la ejecuta en segundo plano, al instante, cada vez que se cumple la condición.
Las Functions las construyen desarrolladores con JavaScript, TypeScript o Rust, y corren dentro de la propia infraestructura de Shopify. No son un add-on de terceros alojado en otro servidor. Se ejecutan en menos de 5 milisegundos, lo que para dimensionarlo es más rápido que un solo frame de un video a 30fps. Esa velocidad importa porque esta lógica corre durante el checkout, donde cualquier retraso lo siente directamente el cliente.
Cada Function es pura y autocontenida. Recibe información del carrito o de la orden, ejecuta su lógica y devuelve un resultado. No puede hacer llamadas a servicios externos durante la ejecución, ni guarda nada entre corridas. Si necesita datos de fuera de Shopify — un tier desde tu ERP, una clasificación de cliente desde tu CRM — esos datos tienen que estar pre-cargados en metafields de Shopify de antemano, donde la Function pueda leerlos. Esta es la principal restricción que obliga a planear builds complejos.
Las Functions se despliegan como apps. Viven en tu repositorio, pasan por tu proceso normal de desarrollo y revisión, y se pueden versionar y revertir como cualquier otro software. Es una mejora significativa frente al Script Editor, donde lógica crítica de negocio vivía en un campo de texto web sin historial de versiones.
Qué puede hacer realmente tu tienda con Functions
Shopify soporta actualmente siete tipos de Functions, cada una controlando una parte distinta de la experiencia comercial. Esto es lo que cada una significa en la práctica para un dueño de tienda.
Discount Functions
Reglas de precio personalizadas que el sistema estándar de descuentos de Shopify no puede expresar. BOGO, precios escalonados según cantidad en el carrito, descuentos por volumen, precios VIP ocultos para segmentos etiquetados, bundles — todo eso se puede construir como Discount Function. Vale la pena notar: los descuentos automáticos nativos de Shopify han mejorado mucho y hoy resuelven muchos escenarios simples de BOGO y porcentaje sin código custom. Si tu lógica de pricing es directa, revisa la UI de descuentos nativa antes de encargar una Function.
Cart Transform Functions
Cambian lo que aparece en el carrito. Agrupan productos individuales en un bundle con un precio compartido, expanden un solo SKU en sus componentes para fulfillment, o modifican cómo se muestran los line items. Esto es lo que habilita experiencias nativas de bundles sin necesidad de una app de terceros que inyecte su propia lógica de carrito.
Delivery Customization Functions
Controlan qué opciones de envío ve el cliente en el checkout y en qué orden. Ocultar ciertas paqueterías para códigos postales específicos, renombrar una tarifa "Standard" para que coincida con tu lenguaje de marca, mostrar una opción same-day solo cuando el carrito tenga productos elegibles, o reordenar métodos para que tu paquetería preferida aparezca primero. La lógica la defines tú.
Payment Customization Functions
Misma idea, aplicada a métodos de pago. Ocultar pago contra entrega para órdenes arriba de cierto monto, suprimir ciertos procesadores en geografías específicas, o reordenar opciones de pago para que tu método preferido aparezca arriba. Hasta 25 Payment Customization Functions pueden estar activas simultáneamente en una sola tienda.
Cart and Checkout Validation Functions
Bloquean el avance del checkout salvo que se cumplan condiciones específicas. Una marca de sneakers en un drop limitado puede restringir a un par por cliente. Una tienda de productos con restricción de edad puede bloquear el checkout desde apartados postales. Un merchant B2B puede forzar cantidades mínimas antes de que el comprador llegue al pago. El mensaje de validación aparece en el UI del checkout, y se puede agregar una UI Extension para que el mensaje de error coincida con tu diseño.
Order Routing Functions
Determinan qué ubicación cumple cada item cuando una orden tiene productos en múltiples ubicaciones de inventario. En lugar de depender del routing por defecto de Shopify, una Function puede aplicar tus propias reglas — priorizar el almacén más cercano al cliente, rutear items frágiles desde una ubicación específica, o respetar acuerdos de fulfillment.
Fulfillment Constraints Functions
Controlan si los items de una orden tienen que enviarse juntos o pueden separarse. Si ciertos productos no se pueden dividir entre envíos — materiales peligrosos, items que requieren firma, productos atados a un 3PL específico — una Function puede imponer esa regla a nivel de orden.
¿No tienes claro qué tipo de Function aplica a tu caso? Cotizamos builds de Functions custom en 48 horas. Solicita una cotización y te decimos si tu lógica necesita una Function custom, una app existente, o un enfoque distinto.
Cómo se ve el código
Leer ejemplos es la forma más rápida de ver lo directa que es la mayoría de la lógica de una Function. Cada uno de los siguientes es un patrón real, desplegable.
Discount Function: precio VIP para clientes etiquetados
Esta Function revisa si el cliente tiene la etiqueta vip y aplica un 15% de descuento a toda su orden si la tiene. Corre automáticamente cada vez que un cliente etiquetado llega al checkout.
import type { RunInput, FunctionRunResult } from "../generated/api";
import { DiscountApplicationStrategy } from "../generated/api";
export function run(input: RunInput): FunctionRunResult {
const isVip = input.cart.buyerIdentity?.customer?.hasAnyTag === true;
if (!isVip) {
return {
discounts: [],
discountApplicationStrategy: DiscountApplicationStrategy.First,
};
}
return {
discounts: [
{
message: "VIP 15% off",
targets: [{ orderSubtotal: { excludedVariantIds: [] } }],
value: { percentage: { value: 15.0 } },
},
],
discountApplicationStrategy: DiscountApplicationStrategy.First,
};
}
La Function lee las etiquetas del cliente desde el input del carrito, toma una decisión y devuelve una lista de descuentos vacía o la regla del 15%. Nada más pasa. Ni llamadas externas, ni escrituras a base de datos.
Delivery Customization Function: ocultar envío express para órdenes grandes
Oculta la opción de Express Shipping para órdenes arriba de $500. Las órdenes grandes a menudo tienen requerimientos de manejo distintos, y mostrar opciones express puede generar problemas de fulfillment.
import type { RunInput, FunctionRunResult } from "../generated/api";
import { HideOperation } from "../generated/api";
const CART_THRESHOLD = 500.0;
const EXPRESS_HANDLE = "express-shipping";
export function run(input: RunInput): FunctionRunResult {
const cartTotal = parseFloat(input.cart.cost.totalAmount.amount);
const operations: HideOperation[] = [];
if (cartTotal > CART_THRESHOLD) {
for (const group of input.deliveryGroups) {
for (const option of group.deliveryOptions) {
if (option.handle === EXPRESS_HANDLE) {
operations.push({ hide: { deliveryOptionHandle: option.handle } });
}
}
}
}
return { operations };
}
Esta lee el total del carrito, lo compara contra el umbral, y oculta la opción de envío correspondiente si se cumple la condición. El merchant controla el umbral y el handle del envío — ambos pueden vivir en metafields para que sean configurables desde el admin sin tocar código.
Payment Customization Function: ocultar pago contra entrega arriba de un umbral
Quita el pago contra entrega como opción para órdenes arriba de $300. Un escenario común para merchants que aceptan COD en órdenes pequeñas pero no pueden absorber el riesgo en las grandes.
import type { RunInput, FunctionRunResult } from "../generated/api";
import { HideOperation } from "../generated/api";
const ORDER_LIMIT = 300.0;
const COD_NAME = "Cash on Delivery";
export function run(input: RunInput): FunctionRunResult {
const cartTotal = parseFloat(input.cart.cost.totalAmount.amount);
const operations: HideOperation[] = [];
if (cartTotal > ORDER_LIMIT) {
for (const method of input.paymentMethods) {
if (method.name === COD_NAME) {
operations.push({ hide: { paymentMethodId: method.id } });
}
}
}
return { operations };
}
Mismo patrón que el ejemplo de delivery. Lee el total del carrito, lo compara contra un umbral, oculta el método de pago que coincide. La complejidad real en un proyecto está casi siempre en la plomería de datos — hacer que el umbral y el nombre del método sean configurables por mercado en lugar de hardcodearlos — no en la Function en sí.
Build custom vs. app: cómo decidir
No todo caso de uso requiere una Function custom. La App Store de Shopify ya tiene una categoría madura de apps de descuentos, checkout y envíos construidas sobre Functions, mantenidas por terceros y configurables a través de una interfaz no-code en el admin. Para casos estándar — descuentos por volumen, reglas básicas de envío, patrones BOGO comunes — una app es más rápida de desplegar, más barata de mantener y no crea una dependencia interna de ingeniería.
Las Functions custom tienen sentido cuando la lógica es genuinamente propietaria, involucra datos de tus propios sistemas (un ERP, una plataforma de loyalty, un motor de pricing) o no se puede expresar a través de la interfaz de configuración de una app. Si necesitas una regla de descuento que lea el tier del cliente desde tu CRM externo y aplique tarifas distintas por categoría de producto, ninguna app va a exponer ese nivel de especificidad. Ahí es cuando un build custom es la decisión correcta.
El framework de decisión es directo: revisa primero la App Store. Si una app existente cubre el caso con una interfaz de configuración que puedes manejar sin soporte de ingeniería, úsala. Si la lógica requiere datos o condiciones que la app no puede alcanzar, construye una Function custom.
Cuando la lógica es genuinamente propietaria, ese es el trabajo que hacemos. Nuestros servicios de desarrollo Shopify cubren builds de Functions para marcas DTC establecidas cuya lógica de pricing, envío o checkout ya superó lo que las apps off-the-shelf pueden expresar.
Qué se necesita para desplegar una
Las Functions se despliegan a través del Shopify CLI, empaquetadas como parte de una app (pública o custom) y se activan desde el admin de Shopify o vía un mutation de GraphQL. El flujo para una Function nueva se ve así:
# Genera una nueva extensión Function dentro de tu app
shopify app generate extension
# Prueba la Function localmente con datos reales
shopify app function run
# Despliega a producción
shopify app deploy
Las pruebas locales usan datos de input que reflejan lo que Shopify enviaría en producción, así que puedes verificar la lógica contra composiciones reales de carrito, etiquetas de cliente y montos de orden antes de tocar la tienda en vivo. Es una mejora importante frente al Script Editor, donde probar significaba correr lógica contra tráfico real y cruzar los dedos.
Una vez desplegadas, las Functions aparecen en la sección correspondiente del admin — las Discount Functions en Discounts, las Payment Customization Functions en Settings > Payments, y así. Activarlas y desactivarlas no requiere cambios de código.
Algunos límites prácticos que vale la pena conocer
El presupuesto de ejecución de 5 ms es la restricción más importante para lógica compleja. En la práctica es generoso para casos estándar — la mayoría de las Functions bien escritas terminan en uno o dos milisegundos — pero si intentas procesar un carrito con miles de line items contra una matriz de pricing compleja, el techo se vuelve relevante. Pre-computar lo que se pueda y mantener la lógica delgada es el principio de diseño.
El límite de 256 KB del binario compilado rara vez es un problema para lógica típica, pero vale la pena saberlo si estás considerando embeber tablas de lookup grandes directamente en el código. Esos datos van en metafields.
Las Functions no pueden hacer requests de red durante la ejecución. Son puras: input adentro, output afuera. Cualquier dato fuera de Shopify tiene que llegar antes de que la Function corra, almacenado en metafields que la Function lee desde su input de GraphQL. Esta es la restricción que más seguido obliga a trabajo de diseño arquitectónico en un proyecto nuevo.
Lectura adicional
Recursos relacionados de Shugert
- Deprecación de Shopify Scripts — qué debe hacer todo merchant Plus
- Guía de desarrollo Shopify: temas, apps, Functions y headless
- Soluciones Shopify custom para marcas establecidas
En Shugert construimos Shopify Functions para marcas DTC establecidas que necesitan lógica de pricing, envío o checkout que su stack actual de apps no puede manejar. Ese trabajo vive dentro de nuestros servicios de desarrollo Shopify, ya sea como un proyecto de alcance fijo o como parte de un retainer continuo. Solicita una cotización y volvemos con un alcance en 48 horas.
Sigue leyendo
Recursos relacionados

Migración a Shopify Plus: cuándo dar el salto en 2026
Cuándo subir a Shopify Plus, cómo es la migración real de Shopify a Shopify Plus, costos 2026 y checklist completo. Notas de campo de más de 30 migraciones.

Deprecación de Shopify Scripts: checklist Plus (junio)
Shopify Scripts deja de funcionar el 30 de junio de 2026 y el bloqueo de edición empieza el 15 de abril. Este es el checklist paso a paso que los merchants Plus necesitan para migrar a Functions a tiempo.