{"id":74125,"plugin_id":"plugin_asdk_app_6ac087af1074819190936c23e8a440b8","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-31T06:10:34.148Z","digest":"5f82c95dc997c9b5582cd300a0d1b91bfca363c87d6c1dfc72cec5d404f14dc9","against":null,"payload":{"description":"Change many Zid products at once. Use for price increases or decreases by percent or from a list, folding payment fees into prices, sale prices, publishing or hiding, categories, names, descriptions and SEO, images, market prices, duplicating or deleting products, or importing a product spreadsheet.","included_files":[],"name":"catalog-bulk-edits","skill_md_contents":"---\nname: catalog-bulk-edits\ndescription: Change many Zid products at once. Use for price increases or decreases by percent or from a list, folding payment fees into prices, sale prices, publishing or hiding, categories, names, descriptions and SEO, images, market prices, duplicating or deleting products, or importing a product spreadsheet.\n---\n\n# Catalog bulk edits\n\nSelects the products, shows every change before it happens, applies it with the\nright tool for its size, and checks the result.\n\n## Ground rules\n\n- The merchant's explicit instructions take precedence over this skill.\n- Show the full change list (product, field, current → new) and apply it after\n  the merchant agrees. When a manage tool answers `confirmation_required`,\n  compare its plan with what the merchant approved: if they match, repeat the\n  call with its `plan_id`; if not, show the plan and ask again.\n- Change only the fields the merchant asked about. Rounding, products with\n  variants, and items already on sale are the merchant's call: ask once, then\n  apply the answer to every row.\n\n## 1. Select the products\n\n`zid_products.list_products` with `pageSize` 100, every page. Filters: `search`\n(name, SKU or barcode), `categoryIds`, `priceMin` and `priceMax`, `isPublished`,\n`inStock`, `hasDiscount`, `productClass`, `updatedFrom`. Details of one product:\n`zid_products.get_product`. Variants of a product: `zid_catalog.list_variants`.\nA product id that returns 404 was deleted: list again rather than retrying it.\n\nDone when the merchant agrees with the list (count, plus a sample for long lists).\n\n## 2. Work out the changes\n\n- **Percent change**: new price = price × (1 + percent), rounded the way the\n  merchant chose. A sale price stays below the price; recalculate it or flag the row.\n- **Folding a payment fee into prices**: new price = price ÷ (1 − r), where r is\n  the fee percentage as a fraction (2.5% → 0.025) from `zid_payments.get_fee_plan`\n  or the merchant. Ask whether a fixed fee or VAT on the fee should be included.\n- **From a list**: match rows to products by SKU, then barcode; list unmatched rows.\n- **Text and SEO**: draft per product in the store's languages, keep facts from\n  the current description, and state only specifications the product data or the merchant gives.\n\n## 3. Apply\n\n| Change | Tool |\n| --- | --- |\n| Name, price, quantity for many products | `zid_products_manage.bulk_update_products` with `products` (`id` and `sku` required, plus `name`, `price`, `quantity`, `isInfinite`) |\n| Sale price, cost, description, SEO, keywords, barcode, weight, one product at a time | `zid_products_manage.update_product` with `productId` and only the changed fields |\n| Publish or hide, VAT, shipping required (store owner only, up to 100 products per call) | `zid_catalog_manage.bulk_update_products` with `productIds` and `published`, `taxable` or `requiresShipping` |\n| Move between categories (store owner only, up to 100 products per call) | `zid_catalog_manage.bulk_move_categories` with `productIds`, `oldCategoryId`, `newCategoryIds` |\n| Add one product to several categories | `zid_products_manage.bulk_add_categories_to_product` with `productId` and `categoryIds` |\n| Prices per market (stores selling in several markets) | `zid_settings.list_markets`, `zid_catalog.list_prices`, then `zid_catalog_manage.update_prices` with `priceUpdates` (up to 100 per call; `salePrice` null removes the sale) |\n| Images | `zid_products_manage.add_product_image` (`productId`, `imageUrl` reachable from the internet, `altText`); order with `zid_products_manage.sort_product_images` |\n| Duplicate, delete, restore | `zid_catalog_manage.bulk_duplicate_products`, `zid_catalog_manage.bulk_delete_products` (to the trash for 60 days), `zid_catalog_manage.restore_products` (returns hidden with zero stock) |\n\nLarge batches go in groups of 100, one group at a time.\n\n## 4. Spreadsheet edits\n\nFor hundreds of rows or many fields at once:\n\n1. `zid_catalog_manage.export_products` emails the merchant the catalog.\n2. The merchant edits it and puts it at a public URL ending in `.csv` or `.xlsx`.\n3. `zid_catalog_manage.import_products` with `fileUrl` and `importMode`:\n   `update_all_fields` updates products matched by SKU with every column (blank\n   cells are ignored unless `deleteEmptyFields` is true); `import_new` adds the\n   rows as new products. `delete_old` deletes every current product first: use\n   it only when the merchant asks for exactly that.\n4. `zid_catalog.get_import_status` until it finishes; report the rows it rejected.\n\n## 5. Verify\n\nRead the changed products again (`zid_products.get_product`, or the list with\nthe same filters) and report changed, unchanged and failed rows with the reason.\n\nDone when every product in the approved change list is reported as changed,\nunchanged or failed.\n\n## Output\n\nThe change table before approval; afterwards, counts of changed, skipped and\nfailed products and the failures with their reasons.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}