> ## Documentation Index
> Fetch the complete documentation index at: https://docs.topsort.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Product Feed

> Integra tu catálogo de productos con Topsort usando un product feed

export const IntegrationsCard1AEs = () => {
  return <>
      <style>{`
        .integrations-card-1a-es {
          display: flex;
          flex-direction: column;
          background-color: #f0f2f4;
          border: 1px solid rgba(0, 0, 0, 0.08);
          border-radius: 12px;
          padding: 1.25rem 1.5rem;
          gap: 0.25rem;
          color: #25253b;
          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02);
          transition: box-shadow 0.2s ease, border-color 0.2s ease, transform 0.2s ease;
          margin-top: 2rem;
        }

        .integrations-card-1a-es:hover {
          box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
          border-color: rgba(0, 0, 0, 0.12);
        }

        .dark .integrations-card-1a-es {
          background-color: #25253b;
          color: #f6f8fa;
          border-color: rgba(255, 255, 255, 0.08);
          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
        }

        .dark .integrations-card-1a-es:hover {
          box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
          border-color: rgba(255, 255, 255, 0.12);
        }

        .integrations-card-1a-es-avatar-row {
          display: flex;
          margin-left: 14px;
          flex-wrap: wrap;
        }

        .integrations-card-1a-es-avatar {
          width: 44px;
          height: 44px;
          border-radius: 50%;
          border: 2px solid #f0f2f4;
          margin-left: -14px;
          object-fit: cover;
          box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);
          pointer-events: none;
          cursor: default;
        }

        .dark .integrations-card-1a-es-avatar {
          border-color: #25253b;
          box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
        }

        .integrations-card-1a-es h2 {
          margin: 0;
          line-height: 1.25;
          font-size: clamp(1.25rem, calc(0.875rem + 1.25vw), 1.75rem);
          font-weight: 700;
          letter-spacing: -0.025em;
          color: #111827;
        }

        .dark .integrations-card-1a-es h2 {
          color: #f9fafb;
        }

        .integrations-card-1a-es-subtitle {
          font-size: 0.9375rem;
          font-weight: 500;
          line-height: 1.5;
          color: #4b5563;
          margin: 0;
        }

        .dark .integrations-card-1a-es-subtitle {
          color: #d1d5db;
        }

        .integrations-card-1a-es p {
          margin: 0;
          line-height: 1.5;
          font-size: 0.875rem;
          color: #374151;
        }

        .dark .integrations-card-1a-es p {
          color: #d1d5db;
        }

        .integrations-card-1a-es a {
          color: #0500ff;
          text-decoration: none;
          font-weight: 500;
          transition: color 0.15s ease;
        }

        .integrations-card-1a-es a:hover {
          color: #0400cc;
        }

        .dark .integrations-card-1a-es a {
          color: #8280ff;
        }

        .dark .integrations-card-1a-es a:hover {
          color: #a19fff;
        }

        @media (max-width: 640px) {
          .integrations-card-1a-es-avatar {
            width: 38px;
            height: 38px;
            margin-left: -12px;
          }

          .integrations-card-1a-es-avatar-row {
            margin-left: 12px;
          }
        }

        @media (min-width: 1280px) {
          .integrations-card-1a-es p {
            font-size: 0.6875rem;
            line-height: 1.4;
            letter-spacing: -0.01em;
          }

          .integrations-card-1a-es h2 {
            font-size: clamp(1rem, calc(0.75rem + 1vw), 1.25rem);
          }

          .integrations-card-1a-es-subtitle {
            font-size: 0.75rem;
          }
        }
      `}</style>
      <div className="integrations-card-1a-es">
        <div className="integrations-card-1a-es-avatar-row">
          <img src="/images/integration-team/agustin.webp" alt="" loading="lazy" className="integrations-card-1a-es-avatar" />
          <img src="/images/integration-team/amelia.webp" alt="" loading="lazy" className="integrations-card-1a-es-avatar" />
          <img src="/images/integration-team/bernardita.webp" alt="" loading="lazy" className="integrations-card-1a-es-avatar" />
          <img src="/images/integration-team/borumy.webp" alt="" loading="lazy" className="integrations-card-1a-es-avatar" />
          <img src="/images/integration-team/felipe.webp" alt="" loading="lazy" className="integrations-card-1a-es-avatar" />
          <img src="/images/integration-team/gui.webp" alt="" loading="lazy" className="integrations-card-1a-es-avatar" />
          <img src="/images/integration-team/javiera.webp" alt="" loading="lazy" className="integrations-card-1a-es-avatar" />
          <img src="/images/integration-team/linn.webp" alt="" loading="lazy" className="integrations-card-1a-es-avatar" />
          <img src="/images/integration-team/marcio.webp" alt="" loading="lazy" className="integrations-card-1a-es-avatar" />
          <img src="/images/integration-team/mateus.webp" alt="" loading="lazy" className="integrations-card-1a-es-avatar" />
          <img src="/images/integration-team/max.webp" alt="" loading="lazy" className="integrations-card-1a-es-avatar" />
          <img src="/images/integration-team/rodrigo.webp" alt="" loading="lazy" className="integrations-card-1a-es-avatar" />
        </div>

        <h2>¿Necesitas ayuda con tu integración de Topsort?</h2>

        <p className="integrations-card-1a-es-subtitle">
          Habla con nosotros, el equipo de ingeniería de integraciones.
        </p>

        <p>
          Contáctanos a través de <strong>tu canal de mensajería dedicado</strong> o en{" "}
          <a href="mailto:support@topsort.com">support@topsort.com</a>.
        </p>

        <p>
          Si aún no eres cliente,{" "}
          <a href="https://www.topsort.com/book-a-demo">agenda una demo</a> con nuestro
          equipo de ventas.
        </p>
      </div>
    </>;
};

Un product feed te permite compartir tu catálogo con Topsort, sincronizar datos y mantener campañas actualizadas. Durante el proceso de integración puedes proporcionarnos la URL de tu product feed y nos aseguraremos de que tu catálogo permanezca actualizado. Nuestra plataforma soporta varios formatos:

* Google Product Data Specification.
* Tab separated values (TSV).
* Comma separated values (CSV).

<Frame>
  <img src="https://mintcdn.com/topsort/HTqrDOAU92Pz87gg/images/ad-server/catalog/product-feed.svg?fit=max&auto=format&n=HTqrDOAU92Pz87gg&q=85&s=8871159c49704007c2959ce535bec21c" alt="Topsort fetches data from a product feed" width="480" height="150" data-path="images/ad-server/catalog/product-feed.svg" />
</Frame>

Si tu catálogo de productos ya está en una plataforma de terceros como Algolia o VTEX, podemos integrarnos directamente con ellos para actualizaciones y sincronización, asegurando que la información del producto sea precisa. Para instrucciones detalladas sobre cómo configurar estas conexiones y requisitos específicos para cada plataforma, consulta la sección "Integraciones de Terceros - Partners" de nuestra documentación.

## Google Product Data Specification

Comparte tu catálogo con Topsort usando feeds de productos de Google existentes. Soportamos la [Google Product Data Specification](https://support.google.com/merchants/answer/7052112?hl=en).

## TSV y CSV

Soportamos compartir tu catálogo usando feeds TSV y CSV. Las instrucciones en esta sección aplican a ambos formatos.

<Note>
  **¿Qué formato deberías usar?**

  Recomendamos que uses TSV sobre CSV. CSV es más propenso a errores debido a que las comas a menudo están presentes en los datos del catálogo.

  **Si el nombre de tu producto o nombre de categoría contiene comas, debes usar TSV.**
</Note>

### Columnas Soportadas

| Nombre                    | Requerido                     | Por Defecto                                                  | Descripción                                                                                                                           |
| :------------------------ | :---------------------------- | :----------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------ |
| `id`                      | sí                            | -                                                            | Identificador único para cada producto.                                                                                               |
| `active`                  | no                            | true                                                         | Si el producto puede ser parte de campañas o subastas. Los productos inactivos se eliminarán de las campañas existentes.              |
| `title`                   | sí                            | -                                                            | Nombre del producto                                                                                                                   |
| `category.0.name`         | sí                            | -                                                            | Nombre de categoría de la categoría principal para este producto.                                                                     |
| `category.0.id`           | no                            | Slug del nombre de categoría                                 | ID de la categoría principal para este producto.                                                                                      |
| `vendor.0.name`           | sí si no usas `seller_name`   | -                                                            | Vendedor del producto. Esta es la entidad que tiene su propio presupuesto para anunciar este producto y compite con otros vendedores. |
| `vendor.0.id`             | sí si no usas `seller_name`   | Slug del nombre de vendedor                                  | ID del vendedor de este producto.                                                                                                     |
| `seller_name`             | sí si no usas `vendor.0.name` |                                                              | Nombre de vendedor del producto, mismo valor que `vendor.0.name`.                                                                     |
| `google_product_category` | sí                            | Categorías proporcionadas en Formato de Taxonomía de Google. |                                                                                                                                       |
| `price`                   | no                            | -                                                            | Precio del producto.                                                                                                                  |
| `image_link`              | no                            | -                                                            | URL a una imagen del producto.                                                                                                        |
| `availability`            | no                            | -                                                            | Estado de stock. Debe ser uno de `in stock`, `out of stock` o `preorder`.                                                             |
| `description`             | no                            | -                                                            | Descripción detallada del producto.                                                                                                   |

Las categorías pueden proporcionarse de varias formas. Pero solo una es requerida.

Puedes asociar un producto con más categorías y vendedores. Consulta la sección a continuación.

### Ejemplos de archivos

#### Ejemplo TSV usando vendor.0.name

```tsv theme={null}
id	name	description	vendor.0.id	vendor.0.name	vendor.0.image_link	category.0.id	category.0.name	category.1.id	category.1.name	image_link	price	availability
1293	Green Mask	Green Mask for removing imperfections, use during night or day	1710000087	Derma Laboratories		10000087	Skin Care	61	Beauty & Health	https://i.postimg.cc/0QxMWmbd/shampoo.png	23935.29	out of stock
1302	Cleanser Gel	N/A	17829100	Shiny Laboratories		10000087	Skin care			https://i.postimg.cc/0QxMWmbd/shampoo.png	16050.42	in stock
```

#### Ejemplo CSV usando vendor.0.name

```csv theme={null}
id,name,description,vendor.0.id,vendor.0.name,vendor.0.image_link,category.0.id,category.0.name,category.1.id,category.1.name,image_link,price,availability
1293,Green Mask,"Green Mask for removing imperfections, use during night or day",1710000087,Derma Laboratories,,10000087,Skin Care,61,Beauty & Health,https://i.postimg.cc/0QxMWmbd/shampoo.png,23935.29,out of stock
1302,Cleanser Gel,N/A,17829100,Shiny Laboratories,,10000087,Skin care,,,https://i.postimg.cc/0QxMWmbd/shampoo.png,16050.42,in stock
```

### Múltiples categorías y vendedores

Los productos pueden asociarse con múltiples categorías y/o vendedores.

Como habrás notado, las columnas de categoría y vendedor contienen índices. Puedes agregar columnas adicionales de categoría y/o vendedor siempre que aumentes el índice apropiadamente.

Por ejemplo, un producto con tres categorías y dos vendedores tendría al menos estas columnas:

```txt theme={null}
category.0.id
category.1.id
category.2.id
vendor.0.id
vendor.1.id
```

### Formato de Taxonomía de Google

Alternativamente, puedes usar el [Formato de Taxonomía de Google](https://support.google.com/merchants/answer/7052112?hl=en#product_category) como nombres de categorías. Esto te permite describir relaciones jerárquicas más complejas.

Por ejemplo, esta jerarquía:

```txt theme={null}
Apparel & Accessories > Clothing > Dresses
```

Resultará en tres categorías:

```json theme={null}
[
  {
    "id": "apparel-and-accessories",
    "name": "Apparel & Accessories",
    "path": "apparel_and_accessories"
  },
  {
    "id": "clothing",
    "name": "Clothing",
    "path": "apparel_and_accessories.clothing",
    "parentId": "apparel-and-accessories"
  },
  {
    "id": "dresses",
    "name": "Dresses",
    "path": "apparel_and_accessories.clothing.dresses",
    "parentId": "clothing"
  }
]
```

<Note>
  El campo `path` es preferido para nuevas integraciones. El campo `parentId` sigue siendo completamente compatible — no hay planes de eliminarlo.
</Note>

## Alojar tu product feed

Tu product feed debe ser continuamente accesible para Topsort para que podamos mantener nuestros datos actualizados.

Actualmente podemos acceder a product feeds públicos o feeds protegidos usando [Basic HTTP Authorization](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization).

Además, usa los [headers de respuesta ETag](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) para ayudarnos a determinar si un product feed ha sido actualizado desde la última obtención.

## Eliminar productos

Los productos pueden "eliminarse de forma suave" configurando la propiedad `active` en `false`. Esto puede hacerse tanto [vía la API](/en/api-reference/catalog-api/upsert-products) como vía el product feed.

Los productos inactivos no se incluirán en nuevas campañas o subastas y se eliminarán de cualquier campaña activa de la que formen parte.

Para eliminar permanentemente productos del sistema de Topsort, [usa la API](/en/api-reference/catalog-api/delete-products).

## Slugs generados

Cuando las categorías o vendedores no tienen un ID, generamos uno al vuelo.

<Warning>
  **Preferible usar IDs explícitos**

  Se recomienda proporcionar los IDs explícitamente en tu product feed, estos IDs se usan como referencias al gestionar campañas y subastas.

  Si usas IDs generados necesitarás usar el mismo algoritmo en el lado del marketplace para crear tales referencias.
</Warning>

Estos IDs usan un **slug** derivado del nombre. Un slug es una cadena formateada en kebab case que es adecuada para inclusión en URLs.

Por ejemplo, `Hello world` se convierte en `hello-world`.

El formato está basado en la biblioteca [npm slugify](https://www.npmjs.com/package/slugify).

## Herramientas para desarrolladores

Los marketplaces que envían su catálogo mediante un product feed pueden abrir **Dev Tools > Catálogo** en el Panel de Administración del marketplace para monitorear el estado de la ingesta sin abrir un ticket de soporte.

La pestaña Catálogo muestra las métricas clave de sincronización de un vistazo:

* **Hora de la última sincronización**: cuándo se ejecutó la sincronización de catálogo más reciente
* **Duración media de la sincronización**: cuánto suelen tardar las sincronizaciones
* **Tasa de éxito**: en las últimas 14 ejecuciones
* **Ejecuciones de sincronización recientes**: cada ingesta con cuántos registros se procesaron u omitieron

Con esta vista, los equipos de ingeniería pueden confirmar que los feeds se ejecutan según lo previsto y detectar rápidamente fallos o ejecuciones con muchos registros omitidos.

<IntegrationsCard1AEs />
