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

# Product catalog

> The read-only copy of your store's products that Senderz keeps in sync, and what it powers in emails, segments and automations.

The product catalog is a copy of your store's products kept inside Senderz. It holds each product's title, image, SKU, price, inventory, collections, variants and status.

You never edit it. Senderz pulls it from your connected store and refreshes it on a schedule, so the product data used in your emails and reports matches what is actually in your store.

<Note>
  **The catalog is sync-only.** There is no create, edit or delete in Senderz. If
  a product looks wrong, fix it in your store and the next sync will pick it up.
</Note>

## Where it lives

Open **Products & Coupons** in the **Content** group of the sidebar. The page has two top tabs: **Products** and **Coupon Library**.

The **Products** tab is the catalog, and it has three views of its own: **Items**, **Categories** and **Product feed**. A **Sync now** button sits in the page header.

Coupons are a different feature on the same page. See [Coupons](/en/messaging/coupons).

## Which stores fill the catalog

Only two store platforms sync products today.

<CardGroup cols={2}>
  <Card title="Shopify" icon="shopify" href="/en/integrations/shopify">
    Full catalog sync, including variants, options, collections, images and
    inventory.
  </Card>

  <Card title="WooCommerce" icon="plug" href="/en/integrations/woocommerce">
    Full catalog sync. Product categories become collections. Ratings are
    imported.
  </Card>
</CardGroup>

<Warning>
  **Konimbo, Magento, Wix and plain WordPress do not sync products.** Those
  integrations still send orders, customers and events, but the catalog stays
  empty. Anything that reads the catalog, such as the Product block picker or a
  dynamic product source, has nothing to draw on until you connect Shopify or
  WooCommerce.
</Warning>

If your Shopify store was connected before product sync existed, it keeps the permission set it was installed with. Reconnect the store and approve the full list so Senderz can read products. See [Permissions Senderz requests](/en/integrations/shopify).

## The Items tab

A table of every synced product, newest change first.

| Column          | What it shows                                                            |
| --------------- | ------------------------------------------------------------------------ |
| **Product**     | Image, title and the primary SKU                                         |
| **Price**       | A single price, or a range when variants differ                          |
| **Inventory**   | Total units across variants, or a dash when the store does not report it |
| **Collections** | The first collection, plus a count of the rest                           |
| **Updated**     | The product's status and when it last changed                            |

Click any column header to sort. Click a row to open the product detail panel.

### Filters

Four controls sit above the table.

<AccordionGroup>
  <Accordion title="Status" icon="circle-dot">
    **Active**, **All**, **Draft** or **Archived**. The tab opens on **Active**,
    so drafts and archived products are hidden until you ask for them.

    Archived is a Shopify status. WooCommerce products arrive as either Active or
    Draft.
  </Accordion>

  <Accordion title="Collection" icon="tag">
    Narrow to one collection. The list is built from the collections your
    products actually belong to.
  </Accordion>

  <Accordion title="Updated" icon="clock">
    **Any time**, **Last 7 days**, **Last 30 days** or **Last 90 days**. Narrows
    to products that changed recently.
  </Accordion>

  <Accordion title="Search" icon="magnifying-glass">
    Matches on product name and SKU, including variant SKUs.
  </Accordion>
</AccordionGroup>

When nothing matches, the empty state offers a **Reset filters** button.

### The product detail panel

Clicking a row opens a panel on the side with everything Senderz holds for that product.

* Price and total inventory
* Vendor, type and tags
* Description
* Collections
* Options and their values, such as Size or Colour
* Every variant with its own SKU, price and in-stock state
* Sync history: when the store last changed it, when Senderz last synced it, and when it first arrived
* **Open in store**, which opens the product on your storefront

Nothing in this panel is editable.

## The Categories tab

A grid of every collection your products belong to, each with a product count.

This list is derived from the products themselves. Senderz does not sync a separate collection list, so a collection with no products in it never appears here.

Click a collection to jump back to **Items** filtered to that collection. The count here includes drafts and archived products, while **Items** opens on Active only, so the two numbers can differ.

## The Product feed tab

The status of the sync itself.

<CardGroup cols={2}>
  <Card title="Store" icon="store">
    Which connected store the catalog is coming from.
  </Card>

  <Card title="Products" icon="box">
    How many products Senderz currently holds.
  </Card>

  <Card title="Last synced" icon="clock-rotate-left">
    When the last sync finished, or **Never**.
  </Card>

  <Card title="Sync frequency" icon="arrows-rotate">
    Every hour.
  </Card>
</CardGroup>

Below that, **Product feed IDs** lists each connected catalog with its identifier. That identifier is what the **Catalog** picker on a Dynamic content block refers to, so this is where you look it up when you have more than one store connected.

If no store is connected, the tab replaces all of this with a link to **Integrations**.

## How and when it syncs

<Steps>
  <Step title="When you connect a store">
    Connecting Shopify or WooCommerce starts a full catalog sync straight away.
  </Step>

  <Step title="Every hour">
    Senderz re-syncs automatically. After the first run it only asks your store
    for what changed, so an hourly sync is cheap even on a large catalog.
  </Step>

  <Step title="When you click Sync now">
    Use the header button on the Products tab, or the same button on the Product
    feed tab, to force a run immediately.
  </Step>
</Steps>

<Info>
  **Sync now needs the owner or admin role.** Everyone in the workspace can read
  the catalog. Only owners and admins can trigger a sync.
</Info>

If a sync is already running, **Sync now** tells you so rather than queueing a second one.

## What the catalog powers

The catalog is not just a browsing screen. Several features read from it.

<CardGroup cols={2}>
  <Card title="Product blocks in emails" icon="envelope" href="/en/messaging/templates">
    **Add from catalog** in a Product block opens a picker with your real
    products. Pick individual products, or fill the block from a whole
    collection.
  </Card>

  <Card title="Dynamic content" icon="wand-magic-sparkles" href="/en/messaging/templates">
    The **Random products** source reads the catalog directly. The behaviour
    based sources, such as products in cart or viewed products, use the catalog
    to fill in each product's current image, price and link.
  </Card>

  <Card title="Segments by category" icon="filter" href="/en/audience/segments">
    When an order arrives, Senderz looks up each purchased product's collections
    in the catalog and stores them on the purchase. That is what makes
    **category** and **category ID** usable as filters on the ordered product
    event.
  </Card>

  <Card title="The contact profile" icon="user" href="/en/audience/contacts">
    The **Recent products** card on a contact uses the catalog to fill in
    product images and links that the tracking event did not carry.
  </Card>
</CardGroup>

The Senderz AI assistant can also read the catalog when you ask it about products, collections or sync status.

### Prices refresh when a campaign sends

A Product block stores a copy of each product's title, price, compare-at price, image and link. When a **campaign** sends, Senderz re-reads those values from the catalog so a stale price does not go out.

Any field you typed over by hand is left alone. Use **Reset to catalog values** on a product item to give the field back to the catalog, or **Refresh** to pull the latest values into the builder while you work.

<Warning>
  Automations do not do this send-time refresh. A Product block inside an
  automation keeps the values it had when you built it, so refresh it in the
  builder after a price change.
</Warning>

## Limits worth knowing

<AccordionGroup>
  <Accordion title="Products deleted in your store are not removed" icon="trash">
    A sync only adds and updates. If you delete a product in your store, its row
    stays in the Senderz catalog. Archiving it in Shopify instead is the cleaner
    option, because the archived status does sync through.
  </Accordion>

  <Accordion title="A single sync run covers up to 5,000 products" icon="gauge-high">
    That is enough for an ordinary hourly run, which only carries what changed.
    It is a real ceiling on the very first sync of a catalog larger than 5,000
    products. Compare the **Products** count on the Product feed tab against your
    store to check.
  </Accordion>

  <Accordion title="WooCommerce variable products sync at the product level" icon="layer-group">
    Senderz stores one entry per WooCommerce product with the product's own price
    and stock. Per-variation SKUs and per-variation prices are not imported.
    Shopify variants do sync individually.
  </Accordion>

  <Accordion title="Ratings only come from WooCommerce" icon="star">
    WooCommerce supplies each product's average rating and review count, so the
    **Ratings** option on a Product block can render. Shopify products carry no
    rating, so that row stays hidden for them.
  </Accordion>

  <Accordion title="Sorting applies to the page you are looking at" icon="arrow-down-a-z">
    The Items table loads 24 products at a time. Clicking a column header
    reorders those 24, not the whole catalog. Filter first, then sort.
  </Accordion>

  <Accordion title="Sync now syncs one store" icon="store">
    If you have both a Shopify and a WooCommerce store connected to the same
    workspace, **Sync now** runs the Shopify sync. The hourly automatic sync
    covers both.
  </Accordion>

  <Accordion title="Collections filled into a Product block are a snapshot" icon="camera">
    Filling a Product block from a collection copies the products in it at that
    moment. Products added to the collection afterwards do not appear in the
    block on their own. Re-fill the block to pick them up.
  </Accordion>
</AccordionGroup>
