Función de parse
Esta guía es para quien configura la integración de catálogo de Tiendanube (Nuvemshop en Brasil) en GoPersonal y quiere escribir o modificar la función de parse: el fragmento de JavaScript que decide cómo se convierte cada producto de tu tienda en un item de GoPersonal. Explica de dónde salen los datos, con qué forma exacta llegan a la función (campo por campo), qué tiene que devolver y cómo probarla antes de guardarla. Al final hay un prompt listo para pedirle a un asistente de IA que escriba o cambie la función por vos.
para acceder a la función ingresa a sección Integraciones en el Menu y selecciona la integración de Tiendanube ya creada.
1. Qué hace la función de parse
Cada vez que corre la sincronización de productos, GoPersonal:
Descarga todos los productos publicados de tu tienda desde la API de Tiendanube.
Ejecuta tu función de parse una vez por producto, pasándole el producto tal como lo entrega la API, sin transformar.
Guarda el objeto que devuelve tu función como un item de GoPersonal.
Marca como inactivo todo item que existía y no vino en esta sincronización.
Si no cargás una función, se usa la función por defecto (sección 2). La función se pega en el campo de función de parse de la configuración de la integración, y se aplica desde la próxima sincronización.
2. Formato de la función
Para Tiendanube la función es una función de JavaScript llamada parse que recibe un producto y devuelve un objeto:
function parse(product) {
return { /* ... */ };
}Reglas:
JavaScript moderno (funciona optional chaining, spread, arrow functions). No hay
require,fetch,async/await, acceso a red ni a archivos.No hay
console. Unconsole.logdentro de la función produce un error.Devolvé siempre un objeto, uno por producto. No se puede devolver
nullpara saltear un producto, ni un array para generar varios items por producto.El campo
activesiempre queda en1. Si devolvésactive: 0(o no lo devolvés), GoPersonal lo reemplaza por1. Los items se desactivan únicamente cuando el producto deja de venir de la API (por ejemplo, porque se despublicó). Si necesitás excluir productos sin stock, usá un campo propio (ver ejemplo en la sección 6).Si la función tira una excepción, los productos del mismo lote (hasta 250) quedan fuera de esa sincronización y pasan a inactivos; el resto del catálogo sigue procesándose. Escribí código defensivo ante campos faltantes:
(product.images || []),product.name?.es.
Función por defecto:
Qué hace el default, en palabras: un item por producto, con id = ID del producto como string. Cosas a tener en cuenta:
Todos los precios salen de la primera variante.
pricees el precio promocional si existe, si no el precio normal.colores en realidad el valor del primer atributo de la primera variante. Si tu tienda define los atributos como Talle y Color, en ese orden, ahí va a quedar el talle.Los textos usan el idioma
es. Si tu tienda está en portugués (pt) o inglés (en), el default devuelve""en nombre, descripción y categorías.No incluye stock, tags,
handle, ni los atributos por nombre.
3. De dónde salen los datos
GoPersonal consulta la API v1 de Tiendanube con el token que autorizaste al instalar la app de GoPersonal en tu tienda:
Recorre el catálogo de a 50 productos.
Solo trae productos publicados. Un producto despublicado no llega a la función y queda inactivo en GoPersonal en la siguiente sincronización.
Trae todas las variantes de cada producto, visibles o no, con o sin stock.
El producto llega a tu función exactamente como lo devuelve la API, sin ninguna transformación de GoPersonal.
Para ver un producto real, si tenés un access token propio de la API de Tiendanube:
Si no tenés un token, usá el ejemplo de la sección 4.5, que sigue la referencia oficial del recurso Product: https://tiendanube.github.io/api-documentation/resources/product.
4. Qué recibe la función: product campo por campo
Convención de textos: todos los campos de texto traducibles son objetos por idioma, { "es": "...", "pt": "...", "en": "..." }, con solo los idiomas que tu tienda tiene activos. La columna "Default" marca qué usa la función por defecto.
4.1 Nivel producto
id
number
ID del producto. Convertilo a string para id
id
name
{es?, pt?, en?}
Nombre por idioma
name (.es)
description
{es?, pt?, en?}
Descripción en HTML
description (.es)
handle
{es?, pt?, en?}
Slug de la URL por idioma
attributes
Array<{es?, pt?, en?}>
Nombres de los atributos de variante, en orden. Ejemplo: [{es:"Talle"},{es:"Color"}]. Define qué significa cada posición de variants[].values
published
boolean
Siempre true (solo llegan productos publicados)
free_shipping
boolean
Envío gratis
requires_shipping
boolean
Producto físico
canonical_url
string
URL completa del producto en la tienda
url
video_url
string | null
seo_title
{es?, ...}
seo_description
{es?, ...}
brand
string | null
Marca (texto libre)
brand
tags
string
Tags separados por coma, por ejemplo "verano, oferta"
created_at
string
Fecha ISO 8601
updated_at
string
Fecha ISO 8601
variants
Array<Variant>
Siempre al menos una. Un producto sin variantes tiene una única variante con values: []
ver 4.2
images
Array<Image>
Ordenadas por position. Puede ser []
imgs
categories
Array<Category>
Todas las categorías a las que pertenece el producto, no solo la más específica
category, firstCategory
4.2 Variantes: variants[]
id
number
ID de la variante. Es el ID que usan los eventos de carrito y compra de la tienda
sku_list
product_id
number
image_id
number | null
ID en images[] de la foto de esta variante
position
number
Orden
price
string
Precio de lista, por ejemplo "1500.00". Es texto, hay que usar parseFloat
regular_price, price (si no hay promoción)
promotional_price
string | null
Precio en promoción. null si no hay
price
compare_at_price
string | null
Precio "antes", tachado
compare_at_price
cost
string | null
Costo interno
sku
string | null
Código SKU cargado en la tienda
sku (solo el de la primera variante)
barcode
string | null
mpn
string | null
values
Array<{es?, pt?, en?}>
Valores de atributo, en el mismo orden que product.attributes. Ejemplo: [{es:"M"},{es:"Azul"}]. [] si el producto no tiene variantes
color (values[0].es)
stock_management
boolean
false = stock ilimitado
stock
number | null
Stock total. null cuando no se gestiona stock
inventory_levels
Array<{id, variant_id, location_id, stock}>
Stock por sucursal o depósito
visible
boolean
Si la variante se muestra en la tienda
weight, width, height, depth
string
Dimensiones, como texto decimal
age_group, gender
string | null
Datos para Google Shopping
created_at, updated_at
string
Fechas ISO 8601
4.3 Imágenes: images[]
id
number
Se cruza con variants[].image_id
product_id
number
src
string
URL absoluta de la imagen
imgs[].url
position
number
Orden
alt
Array<{es?, ...}> | []
Texto alternativo
created_at, updated_at
string
4.4 Categorías: categories[]
id
number
name
{es?, pt?, en?}
category, firstCategory
description
{es?, ...}
handle
{es?, ...}
Slug
parent
number | null
ID de la categoría padre. null si es raíz
subcategories
number[]
IDs de las categorías hijas
seo_title, seo_description
{es?, ...}
google_shopping_category
string | null
created_at, updated_at
string
4.5 Ejemplo de product
Con la función por defecto, ese producto se guarda como:
Fijate que color quedó "M" porque el primer atributo de la tienda es Talle.
5. Qué tiene que devolver
El objeto que devuelve parse se guarda como un item. No hay un esquema obligatorio: podés agregar cualquier campo y queda disponible para filtros, reglas, recomendaciones y templates. Estos son los campos que GoPersonal ya sabe interpretar:
id
string
Identidad del item. Obligatorio. Tiene que ser el mismo ID que envían los eventos de tu tienda (vista de producto, agregar al carrito, compra); si no coinciden, los eventos no se atribuyen al item
active
1
Se fuerza siempre a 1 en Tiendanube (ver sección 2)
name
string
Nombre visible
description
string
Texto o HTML
url
string
Link del producto en emails y widgets
imgs
Array<{url: string}>
La imagen principal es imgs[0].url
price
number
Precio de venta actual
regular_price
number
Precio de lista, para mostrar tachado
discount_tag
string | null
Etiqueta de descuento lista para mostrar, por ejemplo "23% off"
category
string
Categoría o path; se usa en filtros y en el listado de categorías
category_ids
string
IDs separados por , o |. GoPersonal genera automáticamente la lista category_ids_list para filtrar
brand
string
Marca, para filtros
sku
string
Código SKU, para cruzar con otras fuentes
sku_list
string[]
IDs de las variantes del producto, para atribuir eventos que llegan con ID de variante
cualquier otro
libre
Se guarda tal cual
Reglas que conviene respetar:
idsiempre como string y con una estrategia estable. Si cambiás la estrategia, se generan items duplicados: los viejos quedan inactivos pero no se borran.Sin valores que cambien solos (fechas, números al azar). GoPersonal compara cada item con su versión anterior para actualizar solo lo que cambió; un valor que varía en cada corrida obliga a reescribir todo el catálogo.
Los precios de la API son texto: convertilos con
parseFloaty cubrí el casonull.
6. Ejemplo de función personalizada
Multi-idioma, atributos por nombre (sin depender del orden), precio más bajo entre variantes, stock total, categoría más específica y tags como lista:
Como active no se puede poner en 0 desde la función, un campo propio como in_stock es la forma de excluir productos sin stock en filtros y recomendaciones.
7. Cómo probar la función antes de guardarla
Con Node.js instalado podés ejecutar tu función contra el ejemplo de la sección 4.5, o contra productos reales de tu tienda si tenés un access token, con la misma semántica que usa GoPersonal (sin console dentro de la función):
Guardá tu función en
parse.js.Guardá uno o más productos en
products.jsoncomo un array:[ { ...producto... } ].Ejecutá:
Para probar con productos reales, reemplazá el archivo por una descarga de la API:
Revisá que cada objeto tenga id como string y los campos que esperás. Recién después pegá la función en la integración; la próxima sincronización la usa.
8. Prompt listo para pedir cambios
Copiá este bloque, completá lo que está entre <...> y pegá debajo las secciones indicadas de esta guía. Sirve igual para escribir la función desde cero.
Last updated