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

# Marketplace Publishing

> Step-by-step guide to publishing a catalog to the B2B Marketplace Hub — from settings to analytics to conflict management.

## Overview

This guide walks through the complete lifecycle of publishing a catalog to the Marketplace Hub: configuring settings, setting pricing, going live, monitoring engagement, managing subscribers, handling sync conflicts, and unpublishing.

***

## Prerequisites

Before publishing, ensure your catalog meets minimum quality standards:

* [ ] At least **Silver** pipeline stage completed (normalized data)
* [ ] Catalog has a descriptive **name** and **description**
* [ ] A **category** is assigned
* [ ] At least **10 products** (recommended: 50+)
* [ ] Cover image or representative product images present

<Tip>
  Catalogs with Gold scores above 70 convert browsers to subscribers at a 3× higher rate. Run the Analyze batch before publishing.
</Tip>

***

## Step 1 — Configure marketplace settings

1. Open your catalog → **Settings** tab
2. Scroll to the **Marketplace** section
3. Fill in:
   * **Display name** — how the catalog appears in the Hub (can differ from internal name)
   * **Short description** — 140 characters, shown on catalog cards
   * **Long description** — full description shown on the catalog detail page
   * **Category** — primary category for browse/filter
   * **Tags** — up to 10 tags for search relevance
   * **Cover image** — uploaded or auto-selected from top product

***

## Step 2 — Set pricing

Navigate to **Settings** → **Marketplace** → **Pricing**.

### Free catalog

Set pricing to **Free**. Anyone with an Alana account can clone or subscribe at no cost.

### Paid catalog

1. Select **Paid**
2. Choose pricing model:
   * **One-time** — single payment for perpetual access
   * **Monthly subscription** — recurring fee for continued sync access
3. Enter the price (USD)
4. A Stripe product and price are created automatically via the Alana → Stripe integration
5. Consumers will see a Stripe Checkout flow before they can clone or subscribe

<Note>
  You must have a connected Stripe account in your workspace to offer paid catalogs. Go to **Settings** → **Integrations** → **Stripe** to connect.
</Note>

***

## Step 3 — Publish the catalog

1. Navigate to your catalog → **Marketplace** tab
2. Review the preview — this is how your catalog will appear in the Hub
3. Click **Publish to Hub**
4. The catalog is immediately visible in the Hub browse feed

### Via API

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST "https://app.alana.shopping/api/hub/catalogs" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "catalogId": "CATALOG_ID",
      "displayName": "Spring 2026 Apparel",
      "description": "500+ SKUs of curated spring apparel from top European brands.",
      "category": "apparel",
      "tags": ["spring", "2026", "european", "fashion"],
      "pricing": { "model": "free" }
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://app.alana.shopping/api/hub/catalogs', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${apiKey}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      catalogId,
      displayName: 'Spring 2026 Apparel',
      description: '500+ SKUs of curated spring apparel from top European brands.',
      category: 'apparel',
      tags: ['spring', '2026', 'european', 'fashion'],
      pricing: { model: 'free' },
    }),
  });
  const { hubCatalogId } = await response.json();
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      "https://app.alana.shopping/api/hub/catalogs",
      headers={"Authorization": f"Bearer {api_key}"},
      json={
          "catalogId": catalog_id,
          "displayName": "Spring 2026 Apparel",
          "description": "500+ SKUs of curated spring apparel from top European brands.",
          "category": "apparel",
          "tags": ["spring", "2026", "european", "fashion"],
          "pricing": {"model": "free"},
      }
  )
  hub_catalog = response.json()
  ```
</CodeGroup>

***

## Step 4 — Monitor analytics

Track catalog performance from **Marketplace** → **Analytics**.

| Metric                 | Description                               |
| ---------------------- | ----------------------------------------- |
| **Views**              | Total preview opens (unique + repeat)     |
| **Clones**             | One-time copies made                      |
| **Active subscribers** | Workspaces with live subscriptions        |
| **Revenue**            | Total collected (paid catalogs only)      |
| **Version history**    | Each published version with change counts |

### Via API

<CodeGroup>
  ```bash curl theme={null}
  curl "https://app.alana.shopping/api/hub/catalogs/CATALOG_ID/analytics" \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    `https://app.alana.shopping/api/hub/catalogs/${catalogId}/analytics`,
    { headers: { 'Authorization': `Bearer ${apiKey}` } }
  );
  const analytics = await response.json();
  console.log(`${analytics.activeSubscribers} active subscribers`);
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      f"https://app.alana.shopping/api/hub/catalogs/{catalog_id}/analytics",
      headers={"Authorization": f"Bearer {api_key}"}
  )
  analytics = response.json()
  print(f"{analytics['activeSubscribers']} active subscribers")
  ```
</CodeGroup>

***

## Step 5 — Manage subscribers

View all subscribers from **Marketplace** → **Subscribers** tab.

For each subscriber you can see:

* Workspace name and ID
* Current version they're on
* Sync strategy (auto/manual)
* Last sync timestamp
* Subscription status (active/paused/cancelled)

<Note>
  You cannot force-push updates to subscribers. They control when syncs happen based on their chosen strategy.
</Note>

***

## Step 6 — Handle sync conflicts

When subscribers have `manual_review` conflict resolution, conflicts appear in their conflict queue. As a publisher, you can view which fields are most commonly contested via analytics.

If you want to communicate breaking changes (e.g., you're renaming SKUs or restructuring categories), use the **Changelog** field when publishing a new version:

1. Make your catalog changes
2. Before publishing the new version, add a **Version changelog** message
3. Subscribers receive this message with the version notification

***

## Step 7 — Unpublish (delist)

To remove your catalog from the Hub:

1. Navigate to the catalog → **Marketplace** tab
2. Click **Unpublish**
3. Confirm the action

**What happens to subscribers:**

* The catalog disappears from the Hub browse feed immediately
* Existing subscribers retain their local data
* Pending syncs are cancelled
* New clones and subscriptions are blocked
* Paid subscribers receive a notification

### Via API

<CodeGroup>
  ```bash curl theme={null}
  curl -X DELETE "https://app.alana.shopping/api/hub/catalogs/CATALOG_ID" \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```

  ```javascript JavaScript theme={null}
  await fetch(`https://app.alana.shopping/api/hub/catalogs/${catalogId}`, {
    method: 'DELETE',
    headers: { 'Authorization': `Bearer ${apiKey}` },
  });
  ```

  ```python Python theme={null}
  import requests

  requests.delete(
      f"https://app.alana.shopping/api/hub/catalogs/{catalog_id}",
      headers={"Authorization": f"Bearer {api_key}"}
  )
  ```
</CodeGroup>

***

## Publishing checklist

* [ ] Silver pipeline completed on all products
* [ ] Gold scores above 65 for key products (recommended)
* [ ] Display name and description filled
* [ ] Category and tags configured
* [ ] Pricing model selected and Stripe connected (if paid)
* [ ] Cover image uploaded
* [ ] Preview reviewed — looks correct in Hub card
* [ ] Published and visible in Hub browse feed
* [ ] Analytics tab accessible and showing data
