Intempt Docs

Product Catalog Ingestion via API

Two methods for importing your product catalog into Intempt's Recommendations engine — catalog source feeds and direct API ingestion.

Product Catalog Ingestion via API

Intempt provides two methods for ingesting product data into the Recommendations engine. Both ensure your product information stays accurate, up-to-date, and usable for recommendations and personalization.

MethodBest for
Catalog Source (JSON/XML feed)Large catalogs, Shopify/WooCommerce, scheduled syncs
Direct API ingestionProgrammatic syncs, webhooks, custom backends

Method 1 — Catalog Source Integration (JSON or XML)

Use this when your product catalog is available as a publicly hosted JSON or XML feed.

Recommended for:

  • Shopify and WooCommerce stores
  • Catalogs with more than 1,000 products
  • Nightly or cron-based sync jobs

Minimum Required Fields

FieldDescription
idUnique product identifier
titleProduct name
descriptionTextual description
linkProduct page URL
image_linkImage URL
priceProduct price

Feed Format

The feed must be a top-level JSON array, with one object per product:

[
  {
    "id": "123",
    "title": "Product Name",
    "description": "Details...",
    "link": "https://example.com/product",
    "image_link": "https://example.com/image.jpg",
    "price": "19.99"
  },
  {
    "id": "124",
    "title": "Second Product",
    "description": "More details...",
    "link": "https://example.com/product2",
    "image_link": "https://example.com/image2.jpg",
    "price": "29.99"
  }
]

Do not wrap the array in an object (for example { "products": [ ... ] }). Field mapping cannot read the product fields from a wrapped feed, so the source cannot be created.

Setup Steps

Step 1 — Connection

  1. Go to Catalog → Sources
  2. Click Create catalog source
  3. Enter a name, and your JSON or XML feed URL
  4. Enable authentication only if your feed requires it
  5. Click Next

Step 2 — Map fields

Source FieldIntempt Field
idid
titleTitle
linkLink
descriptionDescription
image_linkImage
pricePrice

Optional fields: categories, tags, brand, variants, custom fields.

Enable Sync Field for any field you want Intempt to ingest, then click Create source.

Managing Sources

Once created, Intempt automatically fetches updates, updates existing product records, and keeps the catalog in sync. You can edit the feed URL, authentication credentials, or field mappings at any time.

To delete a source: Catalog → Sources → dropdown → Delete.


Method 2 — Direct API-Based Product Ingestion

Use the Track API to push product data programmatically from WooCommerce, Shopify webhooks, or custom backend systems.

Critical Rule

If productId is provided, you do not need to send userId or profileId.

Including productId switches Intempt into catalog ingestion mode — no user profile is created, no profile merging is triggered. The product is stored directly in the catalog.

Correct Payload

Send a POST to the Track Data endpoint. Each product goes inside the payload array of a track entry:

POST https://api.intempt.com/v1/{orgName}/projects/{projectName}/sources/{sourceId}/track?apiKey={apiKey}
{
  "track": [
    {
      "name": "Products",
      "payload": [
        {
          "productId": "123",
          "data": {
            "title": "Wine Bottle",
            "price": 150,
            "quantity": 4,
            "categories": [
              { "id": 2300, "name": "Closed Reflex", "slug": "closed-reflex" },
              { "id": 2151, "name": "Optics", "slug": "optics" }
            ],
            "images": [
              { "id": 11689, "src": "https://example.com/image1.jpg", "name": "image1.jpg" },
              { "id": 11690, "src": "https://example.com/image2.jpg", "name": "image2.jpg" }
            ],
            "tags": [
              { "id": 10, "name": "Featured" },
              { "id": 14, "name": "Best Seller" }
            ]
          }
        }
      ]
    }
  ]
}

A successful request returns 201 Created, and the product appears under Catalog → Products. A body without the track array is rejected with 400 Bad Request.

Use price for the product price. Other field names, such as amount, are not shown as the price in the catalog.

The data object supports any nested product structure: categories, tags, images, metadata, product attributes, custom fields, and variant data.

Wrong Payload — Causes Anonymous Users

Do not wrap products inside an event structure:

{
  "eventTitle": "Products",
  "data": {
    "products": [ ... ]
  }
}

This causes Intempt to create a user profile for every event, resulting in hundreds of anonymous users.

Summary — Right vs Wrong

Use
Correct{ "track": [ { "name": "Products", "payload": [ { "productId": "...", "data": { ... } } ] } ] }
Incorrect{ "eventTitle": "...", "userId": "...", "data": { "products": [...] } }

On this page