The catalog is what Personyze recommends from: titles, prices, images, availability — and the attribute names in it are the ones you reference in widgets, filters and targeting. Products and content feeds share the same structure and options; everything below applies to both.
What the catalog enables
- Recommendation algorithms have items to rank and rich fields to display.
- Interaction events attach to real products (the ids must match).
- Filters and targeting can use any field you include — brand, category, margin, tags.
Ways to load it
| Route | When |
|---|---|
| Live feed URL | Your existing product feed (Google Shopping format works) — Personyze re-reads it on a schedule, so stock and prices stay current. The recommended default. |
| Spreadsheet upload | Fine for a first setup or a stable catalog; re-upload to update. All upload sources and scheduling: uploading feeds & data files. |
| Platform sync | Shopify and WooCommerce / WP sitemap sync with a toggle. |
| REST API | Push and update items programmatically: products / articles. POST merges on internal_id, so re-sending is safe. |
Which fields matter
- Required in practice:
internal_id(the key everything joins on),title, item URL, image, price,is_in_stock. - Recommended: category (enables category logic and hierarchy), brand, sale price.
- Anything else you send becomes a field — usable in card design, filters and targeting. More data means richer widgets; start with the required set and grow.

Editing and verifying
The catalog viewer (Settings → Recommendations → Products catalog, or the wizard’s Catalog step) shows what arrived — check images render, prices parse and stock flags look sane. Individual fields can be edited in place; conditional prices are managed here too.
Common pitfalls
- IDs don’t match interactions — the feed’s
internal_idmust equal what your interaction tracking reports (SKU vs id mixups are the classic). - Relative image URLs — use absolute URLs so widgets can render them anywhere.
- Out-of-stock handling — keep items in the feed with
is_in_stock=0rather than deleting, so history and filters stay intact.