> ## 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

> Integrate your product catalog with Topsort using a product feed

export const IntegrationsCard1A = () => {
  return <>
      <style>{`
        .integrations-card-1a {
          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:hover {
          box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
          border-color: rgba(0, 0, 0, 0.12);
        }

        .dark .integrations-card-1a {
          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:hover {
          box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
          border-color: rgba(255, 255, 255, 0.12);
        }

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

        .integrations-card-1a-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-avatar {
          border-color: #25253b;
          box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
        }

        .integrations-card-1a 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 h2 {
          color: #f9fafb;
        }

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

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

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

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

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

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

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

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

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

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

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

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

          .integrations-card-1a-subtitle {
            font-size: 0.75rem;
          }
        }
      `}</style>
      <div className="integrations-card-1a">
        <div className="integrations-card-1a-avatar-row">
          <img src="/images/integration-team/agustin.webp" alt="Agustin - Integrations Team Member" loading="lazy" className="integrations-card-1a-avatar" />
          <img src="/images/integration-team/amelia.webp" alt="Amelia - Integrations Team Member" loading="lazy" className="integrations-card-1a-avatar" />
          <img src="/images/integration-team/bernardita.webp" alt="Bernardita - Integrations Team Member" loading="lazy" className="integrations-card-1a-avatar" />
          <img src="/images/integration-team/borumy.webp" alt="Borumy - Integrations Team Member" loading="lazy" className="integrations-card-1a-avatar" />
          <img src="/images/integration-team/felipe.webp" alt="Felipe - Integrations Team Member" loading="lazy" className="integrations-card-1a-avatar" />
          <img src="/images/integration-team/gui.webp" alt="Gui - Integrations Team Member" loading="lazy" className="integrations-card-1a-avatar" />
          <img src="/images/integration-team/javiera.webp" alt="Javiera - Integrations Team Member" loading="lazy" className="integrations-card-1a-avatar" />
          <img src="/images/integration-team/linn.webp" alt="Linn - Integrations Team Member" loading="lazy" className="integrations-card-1a-avatar" />
          <img src="/images/integration-team/marcio.webp" alt="Marcio - Integrations Team Member" loading="lazy" className="integrations-card-1a-avatar" />
          <img src="/images/integration-team/mateus.webp" alt="Mateus - Integrations Team Member" loading="lazy" className="integrations-card-1a-avatar" />
          <img src="/images/integration-team/max.webp" alt="Max - Integrations Team Member" loading="lazy" className="integrations-card-1a-avatar" />
          <img src="/images/integration-team/rodrigo.webp" alt="Rodrigo - Integrations Team Member" loading="lazy" className="integrations-card-1a-avatar" />
        </div>

        <h2>Need help with your Topsort integration?</h2>

        <p className="integrations-card-1a-subtitle">
          Talk to us, the integrations engineering team.
        </p>

        <p>
          Reach us via <strong>your dedicated messaging channel</strong> or at{" "}
          <a href="mailto:support@topsort.com">support@topsort.com</a>.
        </p>

        <p>
          If you're not a customer yet,{" "}
          <a href="https://www.topsort.com/book-a-demo">book a demo</a> with our
          sales team instead.
        </p>
      </div>
    </>;
};

A product feed allows you to share your catalog with Topsort, synchronize data and maintain campaigns up-to-date. During the integration process you can provide us with the url of your product feed and we will ensure your catalog remains up to date. Our platform supports several formats:

* 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>

If your product catalog is already on a third-party platform like Algolia or VTEX, we can integrate directly with them for updates and synchronization, ensuring the product information is accurate. For detailed instructions on setting up these connections and specific requirements for each platform, please refer to the "3rd Party Integrations - Partners" section of our documentation.

## Google Product Data Specification

Share your catalog with Topsort using existing Google product feeds. We support the [Google Product Data Specification](https://support.google.com/merchants/answer/7052112?hl=en).

## TSV and CSV

We support sharing your catalog using TSV and CSV feeds. The instructions in this section apply to both formats.

<Note>
  **Which format should you use?**

  We recommend you use TSV over CSV. CSV is more error prone due to commas often being present in the catalog data.

  **If your product name or category name contains commas, you must use TSV.**
</Note>

### Supported Columns

| Name                      | Required                       | Default                                        | Description                                                                                                                    |
| :------------------------ | :----------------------------- | :--------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------- |
| `id`                      | yes                            | -                                              | Unique identifier for each product.                                                                                            |
| `active`                  | no                             | true                                           | Whether the product can be part of campaigns or auctions. Inactive products will be removed from existing campaigns.           |
| `title`                   | yes                            | -                                              | Name of the product                                                                                                            |
| `category.0.name`         | yes                            | -                                              | Category name of the primary category for this product.                                                                        |
| `category.0.id`           | no                             | Slug of category name                          | ID of the primary category for this product.                                                                                   |
| `vendor.0.name`           | yes if not use `seller_name`   | -                                              | Vendor of the product. This is the entity that has their own budget to advertise this product and competes with other vendors. |
| `vendor.0.id`             | yes if not use `seller_name`   | Slug of vendor name                            | ID of the vendor of this product.                                                                                              |
| `seller_name`             | yes if not use `vendor.0.name` |                                                | Vendor name of the product, same value as `vendor.0.name`.                                                                     |
| `google_product_category` | yes                            | Categories provided in Google Taxonomy Format. |                                                                                                                                |
| `price`                   | no                             | -                                              | Product price.                                                                                                                 |
| `image_link`              | no                             | -                                              | URL to an image of the product.                                                                                                |
| `availability`            | no                             | -                                              | Stock status. Must be one of `in stock`, `out of stock` or `preorder`.                                                         |
| `description`             | no                             | -                                              | Detailed description of the product.                                                                                           |

Categories can be provided in several ways. But only one is required.

You can associate a product with more categories and vendors. See the section below.

### File examples

#### Example TSV using 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
```

#### Example CSV using 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
```

### Multiple categories and vendors

Products can be associated with multiple categories and/or vendors.

As you might have noticed, the category and vendor columns contain indices. You can add additional category and/or vendor columns as long as you increase the index appropriately.

For example, a product with three categories and two vendors would have at the very least these columns:

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

### Google Taxonomy Format

Alternatively, you can use [Google's Taxonomy Format](https://support.google.com/merchants/answer/7052112?hl=en#product_category) as category names. This allows you to describe more complex hierarchical relationships.

For example, this hierarchy:

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

Will result in three categories:

```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>
  The `path` field is preferred for new integrations. The `parentId` field remains fully supported — there are no plans to remove it.
</Note>

## Hosting your product feed

Your product feed needs to be continuously accessible to Topsort so that we can keep our data up to date.

We can currently access public product feeds or feeds that are protected using [Basic HTTP Authorization](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization).

In addition, use the [ETag Response headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) to help us determine if a product feed has been updated since last fetch.

## Deleting products

Products can be "soft deleted" by setting the `active` property to `false`. This can be done both [via the API](/en/api-reference/catalog-api/upsert-products) and via the product feed.

Inactive products will not be included in new campaigns or auctions and will be removed from any active campaigns they are part of.

To permanently delete products from Topsort's system, [use the API](/en/api-reference/catalog-api/delete-products).

## Generated slugs

When categories or vendors don't have an ID, we generate one on the fly.

<Warning>
  **Prefer to use explicit IDs**

  It's recommended to provide the IDs explicitly in your product feed, these IDs are used as references when managing campaigns and auctions.

  If you use generated IDs you will need to use the same algorithm on the marketplace side to create such references.
</Warning>

These IDs use a **slug** derived from the name. A slug is a kebab case formatted string that is suitable for inclusion in URLs.

For example, `Hello world` becomes `hello-world`.

The format is based on the [npm slugify](https://www.npmjs.com/package/slugify) library.

<IntegrationsCard1A />
