Appearance
Products catalog
Products is the Sales Platform's own catalog: products with prices, photos, variants and per-warehouse stock, managed in the app or imported from a file, exported to marketplaces as feeds, and — once Catalog search is switched on — searchable by your assistant with live prices and stock.
In the app
Catalog → Products in the sidebar, app.mychatbot.app/products. Admins only. Orders share the Catalog group — see Orders.
This is a different thing from the Products card on the Knowledge page (a small YAML list) and from Product Feed / Product Spreadsheet sources — those load a catalog only into search. See Getting inventory in for that path and for how indexing works.
At a glance
| You need | Where | Result |
|---|---|---|
| Products in the app | Create product, or Import (Google Sheet, CSV, XML/YML) | Rows with SKU, price, photos, stock |
| The assistant to find them | AI assistant card → Configure catalog sync | search_catalog_product + get_product_info tools |
| Feeds for marketplaces | Export & integrations card | Google Merchant Center, Prom.ua, Rozetka, generic XML |
| Stock per warehouse | Warehouses (toolbar) + Accept goods / Write off / Transfer between warehouses | In stock / Reserved / Available per warehouse |
| Orders to move stock | Orders | Reserve on Confirmed, ship on Delivered |
The list
Header: Import, Create product, and Export (XML or CSV of every product matching the current filters — fetched in pages of 200, "Exporting N of M…").
Filters (all kept in the URL, so a filtered view is shareable): search ("Search by name, SKU, barcode..."), category, warehouse, status, sales channel, brand, and under Filters colour, size, condition, gender and a created-date range. Sort by Created, Updated, Price, Name or SKU. Rows per page 25 (default), 50, 100.
| Column | Notes |
|---|---|
| SKU / ID, Photo, Product name, Category, Warehouse, Stock, Reserve, Price, Sales channel, Status, Updated, Actions | All shown by default; hide any except Product name and Actions in the column settings (Reset / Done) |
| Row actions | Edit, Duplicate (name and SKU get a copy suffix), Delete |
| Selection | Tick rows → Delete selected (N) — deletes one by one, so a failure part-way leaves the earlier deletions in place |
| Toolbar stock actions | Accept goods, Write off, Transfer between warehouses (the transfer needs two warehouses and stock on the source). With no warehouse yet, the dialog starts with an inline create warehouse form |
Two filter quirks: the Warehouse filter narrows only the page you are looking at (the total and page count ignore it), and Sales channel filters by where a product came from (its source), not by the marketplaces it is exported to.
Stat cards
| Card | Counts |
|---|---|
| Total products | Everything in the catalog |
| Active, Out of stock, Low stock, Under moderation | Products in that status, with the share of the catalog |
| Total in stock | Units across all warehouses (in pcs). Stock lines whose warehouse was deleted still count here but have no row in the warehouse block |
| Warehouses | Total, with how many are active |
Counts are as of the end of the chosen date range (cumulative, not "created in the period"); the change badge compares with the day before the range starts, so All time shows no badges. Status badges are approximate — "Status deltas are approximate — only total products is exact" — because status history is not versioned. There is no "sales for period" card: order lines are snapshots and do not point back to catalog products.
Below the cards: Warehouse stock (units and share per warehouse), Status distribution (always the six statuses in a fixed order — Active, Out of stock, Low stock, Under moderation, Draft, Archived), Export & integrations, and AI assistant.
The product card
/products/<id>; Create product opens a blank one. Sections: Basic information, Product description, Characteristics, Custom fields, Product photos, Warehouse / stock, Prices & sales, Export & sales channels, Variants / options, Change history, plus the sidebar Automation & sync, Reminders & tasks, Additional information.
| Rule | Detail |
|---|---|
| Required | Product name, SKU, and a Retail price above 0 |
| Statuses | Active, Out of stock, Low stock, Under moderation, Draft (default for new products), Archived |
| Prices | Retail price, Old price, Discount price, MAP, VAT / Tax, Currency (UAH by default). Prices are stored in the smallest unit; the form shows and accepts ordinary currency |
| Descriptions | Short (160 characters) and full (5 000) |
| Photos | Up to 50; JPG / PNG / WEBP, 10 MB each; add by upload or by URL. The first photo becomes the main one. On a brand-new product photos show Pending save and upload after the first save; "Product saved, but some photos failed to upload. Save again to retry." |
| Channel visibility | All channels / Prom only / Website only |
| Unsaved changes | "Save product changes?" — Leave without saving / Stay on page |
| Change history | Created, status changes, photos added, and every stock movement with its order reference. Entries are written in Ukrainian regardless of the interface language |
| Reminders & tasks | Per-product to-dos with due dates (Overdue / Due today). Saving them does not trigger a catalog re-sync |
Variants and custom fields
- Variants: Color, Size, SKU (required), Price (> 0), Stock, Status, and up to 50 custom fields per variant.
- Custom fields on the product: up to 50, keys up to 64 characters without dots, values up to 512 characters; the account's existing keys are suggested. Deleting a key removes it from every product that has it — "Field … will be removed from N product(s)."
Warehouses and stock
Each product holds one line per warehouse: In stock, Reserved, and Available for sale (always in stock − reserved, never entered by hand). Rules the stock editors enforce: reserve cannot exceed in-stock, a write-off cannot exceed available, transfers need two different warehouses, and a warehouse left at 0 / 0 is removed from the product. Every stock write takes the same account-wide lock as order fulfilment, so a busy moment may answer "Stock is being updated right now, please try again."
Warehouses (toolbar): Name, Address, Active. Deleting one keeps the products' stock lines — "Stock lines on products are not removed and will keep counting toward total stock, but disappear from warehouse breakdown."
Orders reserve, ship and release this stock automatically — see Orders → What a status does to stock.
Import
Import → /products/import. Sources: a Google Sheet (via the Google picker) or a CSV / XML / YML upload up to 10 MB. XLSX is refused ("Save as CSV (UTF-8) and upload again."); XML/YML is converted in the browser (the repeating offer / product / item element is detected, and YML category ids become names).
- Preview the first 10 rows; Reload preview after fixing the file.
- Map columns — auto-detected, editable. Targets: the core fields (SKU, Product name (required), Brand, Category, Status, Retail price, Currency, Source), the description / characteristic / pricing fields, Photos (comma-separated URLs), tags, note, product URL, and custom fields (unique keys, ≤ 64 characters, no dots). "Unmapped columns are ignored — they will not be imported."
- Import — progress shows Processed and "Now importing …"; the result shows Total processed, Successfully imported, Created, Updated, Failed, an Import warnings (N) list (first 200) and Rejected rows (N) with the row number and reason.
Products are upserted by SKU
"Products are upserted by SKU. Empty cells do not clear existing data — only filled fields are updated." SKU matching ignores case and spacing. With no SKU column mapped, every row creates a new product — re-importing the same file duplicates the catalog. Prices in the file are ordinary currency (1 299,50 and 1,299.50 both work); photo URLs are downloaded into the CDN once and not re-downloaded on the next import; an unknown status is a warning and the row keeps the default status.
Export to marketplaces
The Export & integrations card generates feed files: Google Merchant Center (RSS with the g: namespace), Prom.ua, Rozetka and a generic XML (all YML-style). Set the Store URL first (required for GMC — feed links are built from it), enable a channel, Generate, then Copy URL.
| Shown | Meaning |
|---|---|
| Not generated / Generating… / Synced / Error | Feed state |
| N in feed, N skipped | Products written vs. left out; Updated … is the last generation time |
| Skip reasons | No price set, No name, No link (check store URL), Draft / archived |
Products in Active, Low stock and Out of stock (and legacy rows with a blank status) are included; Draft, Archived and Under moderation are not.
How the assistant sees the catalog
The AI assistant card — "Catalog search" — reads The assistant cannot see this catalog yet until you Configure catalog sync. Until then the assistant has no catalog tools at all; the catalog exists only for your team.
| Setting | Default |
|---|---|
| Catalog language | English |
| Agentic search — "Let the assistant run multi-step searches and comparisons" | Off |
| Index product photos — "Lets customers search the catalog with a photo" | Off |
| Knowledge base | Chosen automatically (your only knowledge base, otherwise Default); shown as "Knowledge base: …" once set. The account's assistants are bound to it on first enable |
Status pill: Off, Syncing…, Synced, Error. Every catalog change queues a re-sync that a background worker runs within a few minutes, rebuilding the whole feed (that is also how deletions reach the index). A sync stuck for more than 90 minutes is treated as dead and restarted; the page stops polling after 30 minutes without progress.
What is indexed: name, description, categories, main image, product URL, and the attributes (SKU, brand, status, article, colour, material, gender, GTIN, MPN, size, weight, condition, country of origin, tags, custom fields, and the variants' colours, sizes and custom values). Draft, Archived, Under moderation and nameless products are left out.
Price and stock are never in the index
The search index is deliberately descriptive only. The assistant gets two tools: search_catalog_product to find candidates (text or photo, with attribute filters), and get_product_info, which reads the live product row for price, per-warehouse stock and availability — it is instructed to call it before quoting either. A stale index can therefore never quote a stale price. See Search tools reference.
Turning the sync off deletes the indexed catalog and the assistant loses product search; switching it back on requires a full re-index.
Use cases
- Shop without a marketplace — manage products here, connect Orders with Stripe, and let the assistant search the catalog and take orders that reserve stock.
- Feed several marketplaces from one place — import from your supplier's YML, keep prices in one catalog, and hand each marketplace its feed URL.
- Two warehouses — accept goods into each, let orders reserve from the warehouse named on the line, and read Warehouse stock for the split.
Test it
- Create product with a name, SKU and price; save, add a photo, and confirm Change history records both.
- Create a warehouse, Accept goods for 10 units, then in Orders create an order for 2 and move it to Confirmed — the product shows Reserved 2; move it to Delivered — In stock 8.
- Configure catalog sync, wait for Synced, and ask the assistant for the product in a test chat — it should find it and quote the price from
get_product_info. - Enable the generic XML channel with a store URL, Generate, and open the URL — the product is in the feed; set it to Draft and regenerate — it is counted under skipped as Draft / archived.
- Re-import the sample CSV twice: the second run reports Updated, not Created, and the total does not grow.
See also
- Getting inventory in — feeds, spreadsheets and files that load a catalog into search only.
- How search works and Search tools reference — what the assistant does with the index.
- Catalog capacity & pricing — the indexed-products meter.
- Orders — the order side of stock.
- Image search — what Index product photos enables.
