Skip to main content

amazon-listing

Amazon listing CRUD via the category flat-file (Add Products via Upload). Create a variation family (parent + colour/size children), update attributes, change parent-child relationships, and delete SKUs โ€” all in one template round trip. Also covers the end-to-end sourcing flow: a supplier link (e.g. 1688) โ†’ extract product data โ†’ local GPU-free OCR of detail images โ†’ generate title / bullet points / description โ†’ bilingual review with the user โ†’ propose the parent-child structure โ†’ fill the template โ†’ upload โ†’ read the processing report. Load this BEFORE any browser-use action on sellercentral.amazon.<tld>/listing/upload or when the task is to create / edit / delete a listing from a product link.

Jump to install

Source facts

Repository
zpoint/vibe-seller
Last source activity
July 3, 2026 at 10:08
Detected SKILL.md language
English
Stars
68
Forks
14

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
6 files

Showing SKILL.md

SKILL.md
Source instructions ยท Read-only preview
name
amazon-listing
description
Amazon listing CRUD via the category flat-file (Add Products via Upload). Create a variation family (parent + colour/size children), update attributes, change parent-child relationships, and delete SKUs โ€” all in one template round trip. Also covers the end-to-end sourcing flow: a supplier link (e.g. 1688) โ†’ extract product data โ†’ local GPU-free OCR of detail images โ†’ generate title / bullet points / description โ†’ bilingual review with the user โ†’ propose the parent-child structure โ†’ fill the template โ†’ upload โ†’ read the processing report. Load this BEFORE any browser-use action on sellercentral.amazon.<tld>/listing/upload or when the task is to create / edit / delete a listing from a product link.
allowed-tools
Bash(browser-use:*)
requires
["amazon-shared"]
# Amazon โ€” Listing CRUD (flat-file upload) > **PREREQUISITE:** read `../amazon-shared/SKILL.md` for login, Ziniao > auto-fill / OTP, marketplace TLDs, hamburger navigation, and the > capture rule (live data โ†’ `/tmp/<task>/`, never `knowledge/`). Amazon's **Add Products via Upload** takes a category **flat-file template** โ€” a macro-enabled `.xlsm` whose `Template` sheet is a wide table (one column per attribute). One upload creates or edits a whole **variation family** (a Parent plus N colour/size Children) at once. This is the batch equivalent of the per-SKU web wizard, and the default for anything touching more than one variant. Two references, load what the task needs: - **`references/template-round-trip.md`** โ€” the download โ†’ inspect โ†’ fill โ†’ upload โ†’ read-feedback loop, the operation column (create/update/partialupdate/delete), and the parent-child cluster. Load for **any** listing CRUD. - **`references/1688-sourcing.md`** โ€” turning a supplier link into a filled template: page extraction, local no-GPU OCR of detail images, AI-generated copy, the **bilingual review** step, and image handling. Load when the task starts from a **product link**. ## Work it like a human: upload โ†’ read the report โ†’ fix โ†’ repeat The template, its required fields, valid values, and even the upload mechanics **change per product type and over time**. Do not follow a fixed recipe from memory. Run the loop a human runs: 1. **Download a FRESH template** for the exact product type โ€” Amazon's own error messages say "download the latest template". Never reuse a stale one. 2. **`inspect` it.** The field set / required fields / valid values for THIS category are the ground truth, not this doc. 3. **Fill, upload, then download the processing report** and run `parse-feedback REPORT.xlsm`. It reads the summary tables **and the per-cell comments (ๆ‰นๆณจ) on the report's `Template` tab** โ€” where Amazon writes the precise, field-level verdict per SKU โ€” and prints `sku=โ€ฆ field=โ€ฆ : MESSAGE`. 4. **For each ERROR line, fix exactly the field it names** โ€” set it to a value from the template's own valid set (`inspect --field NAME`). Do not reinterpret or theorise a root cause; act on the report's words. (If a WARNING names a key defining attribute like material/pattern, fix it too โ€” that's often what unblocks new-ASIN creation.) 5. **Re-upload and repeat until only expected noise remains** (see the main-image rule below). 6. **Final verify โ€” the two sources of truth, not the feed count:** the **downloaded report** shows 0 blocking errors, AND the **Manage Inventory page** shows the family (parent's "Variations (N)", each child a real ASIN โ€” not `-` โ€” with title / description / bullets). The fixes listed below are **examples this loop surfaced on real templates** โ€” priors that speed up diagnosis, not a checklist that replaces reading the actual report. ### Verification: trust inventory, not the feed count The report's "records processed / 0 errors" means the **feed was accepted**, not that a live listing exists. A record *with* errors can still create an incomplete stub; a clean feed can leave a suppressed listing. **Always confirm on Manage Inventory** (or `skucentral?mSku=<sku>` **without** `&condition=New` โ€” that param false-negates incomplete listings). Confirm the SKU has an ASIN, and for a family that the parent shows **"Variations (N)"**. ### Priors that recur across categories - **Upload a tab-delimited `.txt`, not the `.xlsm`.** `fill` writes the `.txt` next to the `.xlsm` for you โ€” upload that. An openpyxl-saved `.xlsm` triggers a **90502 FATAL** ("worksheet template type not supported for Excel upload"). - **Children are NOT minimal.** Each child needs the full required set its category asks for (e.g. `item_name`, `target_gender`, `age_range_description`, and any compound-attribute sub-fields), plus its differentiator + offer โ€” not just `parent_sku` + colour. - **Enum case is exact** (`UAE/KSA`, not `uae/ksa`). `fill` canonicalises a value to the template's own casing when the field has a valid set. - **Compound attributes come as a set** โ€” e.g. Apparel Size needs `apparel_size_class` + `apparel_size_system` + `apparel_body_type` + `apparel_height_type` together; a partial set errors (99001/99022). - **Own-country only** โ€” in the generator, select the store's **single** marketplace (multi-marketplace disables Listing Preferences and adds offer blocks you don't need). Fill only that marketplace's offer. - **Main image is not required by default** โ€” we do **not** upload images from here (the seller adds them separately). So a `18320` ("main image is missing") error is *expected noise*, not a blocker; don't chase it, and don't hotlink a supplier CDN URL into `main_image_url` (Amazon can't fetch a referer-protected 1688/alibaba URL anyway). "Done" = every error resolved **except** the image one. - **A buyable child that `8560`s ("doesn't match any ASINs โ€ฆ include standard_product_id")** โ€” Amazon is refusing to *mint a new ASIN* for it. Two cases, decided by whether that child's ASIN already exists: - **ASIN already exists** (you're re-submitting, or a prior create left a catalog ASIN โ€” note a `delete` removes your SKU/offer but **not** the catalog ASIN): don't try to create โ€” **match** it. Set `operation: update`, `external_product_id` = the existing ASIN, `external_product_id_type: asin`. This is the reliable fix and what resolves a variation child that won't join its family. - **Genuinely new ASIN, GTIN-exempt brand** (leave `external_product_id` blank): the exemption alone is not enough โ€” the report also warns which **key defining attributes are missing** (e.g. `material_type`, `pattern_name`); fill exactly those from the template's valid values so the ASIN can be minted. Either way, set `update_delete` on **every** row including children โ€” never leave a child's operation blank. - **Offer/price is per-marketplace, and only `our_price` matters.** The buyable offer is one block per marketplace: `purchasable_offer[marketplace_id=<MKT>]#1.our_price#1.schedule#1.value_with_tax` (+ `fulfillment_availability#1.quantity`). Of the many price columns only `our_price` is needed. Fill the block for the marketplace you're selling on; **verify it in THAT marketplace's Pricing view** โ€” the feed "N/N successful" count does not reflect price, and quantity can apply while price shows `--` if you set a different marketplace's column. - **A multi-marketplace account's template bundles every marketplace's offer columns** (e.g. a Europe account yields both SA + AE columns even when you select one) โ€” a truly single-country template may not be downloadable there. "Clean single-country" then means: fill only the intended marketplace's offer block, leave the others blank. ## The two scripts ```bash S=<skills>/amazon-listing/scripts PY=<project-venv>/bin/python3 # needs openpyxl + rapidocr-onnxruntime ``` - **`listing_bulk.py`** โ€” deterministic template writer. It keys every field by its **field API name** (the row that contains `item_sku`), which is identical in every console language, so it is locale-robust the same way `amazon-ads/ads_bulk.py` is. - `inspect TEMPLATE.xlsm [--field NAME]` โ€” dump the field set, which fields are Required, the accepted enum tokens, and the variation cluster. **Run this first on every fresh template** โ€” the column set and valid values differ per product type. - `fill TEMPLATE.xlsm --spec SPEC.json --out OUT.xlsm` โ€” write parent/child rows, set the operation column per row, validate enums and required fields against the template's own metadata sheets, and preserve the workbook (macros, signature row) verbatim. - `parse-feedback REPORT` โ€” extract Amazon's verdict: the summary tables **and the per-cell comments (ๆ‰นๆณจ) on the report's `Template` tab**, emitted as `sku=โ€ฆ field=โ€ฆ : MESSAGE`. The ๆ‰นๆณจ are the precise, field-level fixes โ€” the engine of the self-correct loop. - **`ocr_1688.py`** โ€” local, GPU-free OCR (rapidocr-onnxruntime) of the supplier's detail images, where the spec table / size chart live. ## Operation rules (the in-sheet `update_delete` column) The operation is **chosen per row in the sheet**, not inferred: | `operation` in spec | `update_delete` cell | Use when | |---|---|---| | `create` (default) | *blank* | new SKU. **No ASIN** โ†’ this is the default. | | `update` | `Update` | full re-submit of an existing SKU's attributes. | | `partialupdate` | `partialupdate` | change only the fields present; leave others as-is. | | `delete` | `delete` | remove the SKU. Needs only `sku` + `operation`. | Rule of thumb: **no ASIN yet โ†’ create; the ASIN already exists โ†’ update and match it** (put the ASIN in `external_product_id` with `external_product_id_type: asin`). The operation column is authoritative, so set it **explicitly on every row, children included** โ€” a blank child operation is a common cause of a child failing to join its family. ## End-to-end flow (product link โ†’ live listing) 1. **Extract** the product from the supplier link (see `1688-sourcing.md`): page data + OCR of detail images. 2. **Generate** an Amazon title, 5 bullet points, and a long description from the extracted data. 3. **Bilingual review** โ€” present the generated copy to the user in **both the user's language and the target marketplace language**, plus the **proposed parent-child structure** (which variation theme, which children). Wait for the user's confirmation / edits. This is the one genuinely interactive step; do not skip it. 4. **Download** the category template for the product type (into `~/.vibe-seller/downloads/<slug>/`), `inspect` it. 5. **Fill** a spec (parent + children) and produce the `.xlsm`. 6. **Upload the `.txt` and run the self-correct loop** (see "Work it like a human" above): `parse-feedback` the report, fix exactly the field each ๆ‰นๆณจ names, re-upload, repeat, and **verify on Manage Inventory + the Pricing view** โ€” not the feed count. Stop when the only remaining error is the image (`18320`). ## Sourcing login The supplier site (1688) needs a login for some bulk specs, but the core product data is reachable without it. When a login **is** needed, the login is a QR scan โ€” **ask the user to scan it** (do not attempt to authenticate on their behalf). Say which QR and wait.
View on GitHub