# Ebay Post Listing

> Post a prepared eBay listing using the browser — fills the eBay form from listing.json, stops before final publish. Use when the user says "post this listing", "publish to eBay", "put it on eBay", or wants to push a prepared listing live.

- Skill: `glebmish/ebay-post-listing` (Agent Skill)
- Install (CLI): `npx skillmds@latest add glebmish/ebay-post-listing`
- Raw SKILL.md: https://api.skillmd.com/api/skills/glebmish/ebay-post-listing/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: glebmish (https://skillmd.com/u/glebmish)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/glebmish/ebay-post-listing

---


# Post eBay Listing

Open eBay in the browser, fill the listing form from `listing.json`, stop at preview.

## Input

User specifies which listing to post (directory name under `listings/`, may be passed as `$ARGUMENTS`). If not specified, list available directories and ask.

A listing is ready to post if it has `listing.json` but no `published.json`.
A listing has pending updates if `listing.json` differs from `published.json`.

## Prerequisites

**Chrome extension conflicts:** The Claude in Chrome extension uses Chrome's debugger API for screenshots and clicks. Other extensions (especially Grammarly, LastPass, MetaMask, AdBlock, NordVPN, React DevTools) can block this and cause "Cannot access a chrome-extension:// URL" errors. If you hit these errors, tell the user to disable conflicting extensions or open a clean Chrome window with `google-chrome --disable-extensions`.

## New Listing Flow

1. **Read `listing.json`** from the specified listing directory. Also `ls` the `photos/` directory.

2. **Open the eBay prelist page** in a new tab. Default to `https://www.ebay.co.uk/sl/prelist`; use the seller's local eBay domain instead (`.com`, `.de`, `.com.au`, etc.) if they specified one, or if you can tell from `listing.json`'s currency / language that another locale is intended. The prelist page has a search box — type the item title (or keywords) and click Search.

3. **eBay prelist flow** (3 steps before reaching the full form):
   - **Search results page:** eBay suggests a category. Click "Continue without match" at the bottom (unless a catalogue match is exact).
   - **Condition dialog:** A modal appears asking for condition. Select the closest match (New / New other / Used / For parts). There is no "Like New" option — select "Used" and add condition notes later in the form.
   - **Full form loads:** Title is pre-filled from the search. eBay auto-fills some item specifics (Brand, Colour, Clamp Diameter, etc.) based on the search terms.

4. **Fill the full form in this order:**

   **a) Title** — Update if needed to match `listing.json` exactly (use `form_input` on the title textbox).

   **b) Condition notes** — If `condition.notes` exists in `listing.json`, find the condition description/notes text field in the Required section (near the Condition dropdown). Click the Condition dropdown, and look for a text area to enter condition notes. Type the notes from `listing.json`.

   **c) Item specifics** — The form has Required, Recommended, and Additional sections.
   - Recommended section has dropdowns and "Frequently selected" quick-pick links (e.g., "Drop Bar", "42 cm"). Click these when they match.
   - Click "More recommended" to expand hidden fields (Handlebar Type, Colour, Clamp Diameter, Number of Items, Item Length, Item Width, Model, etc.).
   - For dropdown fields, click to open, then search or select. Use "Add custom value" for values not in the list.
   - The Model field and MPN are free-text inputs.
   - Map `listing.json` specs to eBay fields: e.g., "6061-T6 Alloy" → "Aluminium", "Road Drop Bar" → "Drop Bar", Width → Item Length.
   - For multi-value fields (e.g., Compatible Bike Type), check if multiple values apply and select all relevant ones.
   - Skip fields that don't map cleanly rather than guessing.

   **d) Photos** — Click "Upload from computer". This opens a native OS file dialog that **cannot be automated**. Tell the user to navigate to the `photos/` directory and select the files. Provide the full path. Wait for user confirmation.

   **e) Description** — Click in the rich text editor area and type the description from `listing.json`.

   **f) Pricing** — The form defaults to eBay's recommended price. Click "Change" next to Pricing to expand the full pricing editor.
   - Triple-click the price field to select all, then type the new price.
   - Tab out to trigger recalculation.
   - For `fixed_with_offers` strategy: ensure Buy It Now is on and "Allow offers" is enabled. Click "More options" under pricing to find the Allow Offers toggle.
   - For `auction` strategy: toggle Auction on and set the starting bid.

   **g) Returns** — Always set to "No returns accepted". Scroll to the Delivery section and find the returns/listing preferences area. If returns are set to anything else, change them.

   **h) Shipping, location** — Use eBay's defaults (Simple Delivery, buyer pays). Dismiss any info popups ("Got it").

5. **Click "Preview"** at the bottom of the form. NEVER click "List it for free" / "List item" / "Publish".

6. **Report back** to the user what was filled and what was skipped.

7. **Wait for user confirmation.** The user reviews in Chrome and publishes manually. When they confirm, ask them to paste the eBay listing URL.

8. **Scrape the live listing and create `published.json`:**

   a) **Navigate to the eBay listing URL** the user provided.

   b) **Scrape the listing page** to capture what actually went live:
   - Condition as shown on eBay
   - Price and offer status
   - Item specifics table (all key-value pairs as displayed)
   - Postage: service name, cost, who pays
   - Collection: enabled/disabled, cost
   - Returns policy
   - Location
   - Delivery estimate

   c) **Build `published.json`** — start with a copy of `listing.json`, then add:
   ```json
   {
     "ebay_url": "https://www.ebay.co.uk/itm/...",
     "ebay_item_id": "394754829351",
     "ebay_details": {
       "condition_ebay": "Used",
       "returns": "No returns accepted",
       "postage": "Standard Tracked Delivery, buyer pays £2.94",
       "collection": "Click & Collect, £2.26",
       "location": "London, United Kingdom",
       "duration": "Good 'Til Cancelled",
       "listed_date": "2026-03-22",
       "item_specifics_submitted": {
         "Brand": "Bontrager",
         "Material": "Aluminium",
         "...": "..."
       }
     }
   }
   ```

   d) **Also update `listing.json`** with `ebay_url` and `ebay_item_id` (but NOT `ebay_details` — that's only in `published.json`).

## Update Flow

When `published.json` exists and differs from `listing.json`:

1. **Read both files** and identify what changed.

2. **Open the existing listing** using `ebay_url` from `published.json`. Click "Revise listing" or similar edit action.

3. **Update only the changed fields.** If photos changed, handle the photo manager.

4. **STOP at preview. Do NOT click publish.**

5. **Report changes made.** On user confirmation, re-scrape the live listing and update `published.json` (same scrape process as step 8 above).

## Error Handling

- **Not logged into eBay:** Tell the user to log in, wait for them to confirm, then retry.
- **Can't fill a field:** Skip it, report what was missed so the user can complete manually.
- **CAPTCHA or unexpected form state:** Report clearly and let the user handle it.

## Rules

- **Don't click the final publish/list button.** Publishing is irreversible — that's always a manual user action.
- **Fill exactly what's in `listing.json`.** Don't improvise or add fields not in the data. The seller reviewed and approved this content.

