Precios exclusivos de la app en Shopify por API
Esta página describe cómo un equipo de desarrollo, ya sea del comerciante, de su ERP o de un tercero, puede gestionar por su cuenta los precios exclusivos de la app en una tienda Shopify. Sirve, por ejemplo, para sincronizar precios desde un ERP o un PIM sin pasar por el editor de Reskyt.
Aplica solo a Shopify. La única API pública documentada de Reskyt es la de notificaciones push.
Cómo funciona
Sección titulada «Cómo funciona»El precio exclusivo de una variante se guarda en un metafield estándar de Shopify sobre esa variante. Dos piezas lo leen:
| Pieza | Qué hace con el metafield |
|---|---|
| Shopify Function de Reskyt | Aplica el precio en el checkout |
| Bloque de tema de Reskyt | Muestra el precio en la ficha de producto y en las colecciones, en temas Liquid |
No interviene ninguna base de datos ni API propia de Reskyt. Quien tenga acceso de escritura al Admin API de la tienda puede escribir el metafield.
Requisitos previos
Sección titulada «Requisitos previos»- Un descuento automático ya creado en la tienda. El metafield solo tiene efecto en el checkout si existe el descuento automático “Reskyt — Precio Catálogo App”, al que está ligada la Function. Se crea la primera vez que alguien guarda una regla de tipo Precio de catálogo desde el editor de la app Reskyt en Shopify (Promociones → Nueva regla). Basta con hacerlo una vez por tienda. Si nunca se ha usado el editor, escribir el metafield no tendrá efecto.
- Una app propia, privada o personalizada con el scope
write_productsen esa tienda, para usar el Admin GraphQL API. - El app embed de Reskyt activo en el tema, necesario para que los pedidos de la app se identifiquen como tales. Ver Shopify.
El metafield
Sección titulada «El metafield»| Campo | Valor |
|---|---|
Recurso (ownerType) | PRODUCTVARIANT. Se escribe por variante, no por producto |
| Namespace | reskyt |
| Key | catalog_price |
| Tipo | json |
{ "price": 19.99, "ruleId": "mi-integracion", "customerTag": "mayorista", "from": "2026-01-01T00:00:00Z", "until": "2026-01-31T23:59:59Z"}| Campo | Obligatorio | Descripción |
|---|---|---|
price | Sí | Precio fijo, no un porcentaje, que verá y pagará el usuario de la app por esa variante, en la moneda de la tienda |
ruleId | No | Identificador libre para tu propio control. Reskyt no lo usa |
customerTag | No | Etiqueta de cliente de Shopify, no el Segmento nativo. Si se indica, el precio solo se aplica a clientes con sesión iniciada que tengan esa etiqueta exacta. Si se omite, se aplica a cualquier usuario de la app |
from, until | No | Solo informativos. La Function no los lee: mientras el metafield exista, el precio está activo |
Cuándo se aplica el precio
Sección titulada «Cuándo se aplica el precio»El precio se aplica en el checkout cuando se cumplen todas estas condiciones:
- El pedido procede de la app, es decir, el carrito tiene el atributo
__reskyt_app_origincon el valortrue. - El
pricedel metafield es inferior al precio unitario que la línea tiene en ese momento en el carrito. Si es igual o superior, no se aplica ningún descuento. - Si el valor incluye
customerTag, el cliente tiene sesión iniciada y esa etiqueta.
Ventana de fechas
Sección titulada «Ventana de fechas»from y until no se hacen cumplir. Si el precio debe tener una fecha de
inicio y de fin, la integración debe escribir el metafield al empezar y
borrarlo al terminar, por ejemplo con un proceso programado propio.
Escribir el precio
Sección titulada «Escribir el precio»1. Obtener el identificador de la variante a partir de su SKU
query FindVariantBySku($query: String!) { productVariants(first: 1, query: $query) { nodes { id } }}Variables:
{ "query": "sku:TU-SKU" }2. Escribir el metafield
mutation SetCatalogPrice($metafields: [MetafieldsSetInput!]!) { metafieldsSet(metafields: $metafields) { metafields { id } userErrors { field message } }}Variables:
{ "metafields": [ { "ownerId": "gid://shopify/ProductVariant/1234567890", "namespace": "reskyt", "key": "catalog_price", "type": "json", "value": "{\"price\":19.99,\"customerTag\":\"mayorista\"}" } ]}El campo value es una cadena que contiene el JSON. Los límites de peticiones y
de metafields por operación son los del Admin API de Shopify.
Quitar el precio
Sección titulada «Quitar el precio»Para que una variante deje de tener precio exclusivo hay que eliminar el
metafield. Dejarlo en 0 o en null no lo desactiva.
mutation DeleteCatalogPrice($metafields: [MetafieldIdentifierInput!]!) { metafieldsDelete(metafields: $metafields) { deletedMetafields { key namespace ownerId } userErrors { field message } }}Variables:
{ "metafields": [ { "ownerId": "gid://shopify/ProductVariant/1234567890", "namespace": "reskyt", "key": "catalog_price" } ]}Mostrar el precio en la tienda
Sección titulada «Mostrar el precio en la tienda»Escribir el metafield hace que se cobre el precio en el checkout. Que el comprador lo vea en la tienda es una cuestión aparte, y no afecta al cobro.
| Escaparate | Qué hay que hacer |
|---|---|
| Tema Liquid | El bloque de tema de Reskyt muestra el precio. También hay un fragmento de código equivalente para temas personalizados |
| Headless, como Hydrogen u Oxygen | El frontend lee el metafield desde la Storefront API y lo muestra donde corresponda |
Escaparate headless y origen de la app
Sección titulada «Escaparate headless y origen de la app»En un tema Liquid, la extensión de tema de Reskyt añade al carrito el atributo
__reskyt_app_origin cuando detecta la app. En un escaparate headless esa
extensión no se ejecuta. El equipo que construye el frontend debe añadir el
mismo atributo cuando detecte que el visitante viene de la app, con la mutación
cartAttributesUpdate de la Storefront API:
{ "key": "__reskyt_app_origin", "value": "true" }Sin ese atributo, el checkout no aplica el precio exclusivo.
Resumen
Sección titulada «Resumen»- Confirma que se ha creado una vez una regla de Precio de catálogo desde el editor de Reskyt en la tienda.
- Crea una app propia con el scope
write_productsy obtén su token. - Por cada variante, busca su identificador por SKU y escribe
reskyt.catalog_pricecomo JSON. - Si el precio tiene fecha de fin, borra el metafield desde tu propio proceso.
- Si usas una
customerTag, comprueba que esa etiqueta ya se usa en una regla del editor. - Si el escaparate es headless, añade el atributo de carrito
__reskyt_app_originy muestra el precio desde tu frontend.