| name | marketing-agent |
| description | Use whenever a used-machinery dealer needs to post a machine across multiple marketplaces (eBay, equipt.com, exapro.com, machinepoint.com, surplusrecord.com, machineryvalues.com, MachineTools.com, IronPlanet, etc.) without spending an hour bouncing between sites. Takes one set of machine inputs (brand, model, year, photos, dimensions, weight, price, condition, location) and generates platform-tailored listings — title, description, category mapping, tags, image set, character-count compliance — for every marketplace the dealer is set up on. Optionally opens each posting URL in sequence so the dealer can paste-and-submit in minutes. Triggers on "post this machine everywhere", "list the Krauss-Maffei", "marketplace listings for the Engel", "where should I post this", "post to ebay and equipt", "build my multi-site listings", "add a new marketplace to my list", or any moment the dealer is staring at the multi-platform posting chore. NOT for outbound buyer outreach (that's sales-agent). |
Marketing Agent
The dealer-side antidote to the "post the same machine 12 times" problem. One input, twelve platform-tailored outputs. Built around a curated marketplace registry the dealer can extend as new sites appear.
When this fires
- "Post the Engel everywhere"
- "Build me eBay + equipt + exapro listings for the Krauss-Maffei"
- "Where can I post a 200-ton IMM — give me the full list"
- "Add a new marketplace — IronPlanet, plastics category"
- "Just give me the eBay listing for this one"
- "What platforms am I missing? I only post on three"
First-run setup
If /mnt/user-data/uploads/.dealer_marketing_config.json doesn't exist, run setup:
- Active marketplaces — show the full registry (see below) and ask which the dealer currently has accounts on. Mark those
active: true. Others stay in the registry as active: false for future activation.
- Per-platform defaults — for each active platform, capture:
- Account username / store URL (for cross-linking)
- Default seller terms text (some platforms support a saved boilerplate)
- Image strategy (some require WebP, some max 8 photos, some prefer 1080×1080)
- Default content style — how does the dealer want titles?
[Year] [Brand] [Model] — [Type], [tonnage/spec], [hours/cycles if known], [location] is the proven default.
- Marketplace credentials — note clearly: this skill does NOT log in for you. Most marketplaces don't have public posting APIs. The skill generates the content; the dealer pastes it. Where APIs do exist (eBay), record the token path for later automation.
{
"platforms": {
"ebay": {"active": true, "store_url": "ebay.com/usr/premier-equipment", "post_url": "https://www.ebay.com/sl/sell"},
"equipt": {"active": true, "store_url": "https://equipt.com/companies/premier-equipment-llc"},
"exapro": {"active": false},
"machinepoint": {"active": true, "store_url": "..."},
"surplusrecord": {"active": true, "store_url": "..."},
"machineryvalues": {"active": false},
"machinetools_com": {"active": true},
"ironplanet": {"active": false},
"facebook_marketplace": {"active": true},
"linkedin_company": {"active": true},
"own_website": {"active": true, "post_url": "https://premier-equipment.example/admin/listings/new"}
},
"title_pattern": "{year} {brand} {model} — {type_pretty}, {primary_spec}, {location}",
"default_disclaimer": "Sold AS-IS, WHERE-IS. Buyer responsible for inspection. Photos and specs as provided by current holder.",
"image_target_size": "1200x900",
"max_photos": 12,
"include_youtube_link": true
}
The marketplace registry
Built into scripts/registry.py. Each entry knows:
| Field | Used for |
|---|
id | stable key |
name | display name |
category | broad (general_industrial, plastics_specific, cnc_specific, auction, social, dealer_directory) |
post_url | where to start a new listing |
auth_required | whether the dealer has to log in (almost always yes) |
title_max_chars | platform limit (eBay 80, equipt ~120, etc.) |
description_format | html, markdown, plaintext |
image_specs | recommended size + max count |
category_hints | dealer-relevant subcategory paths |
notes | quirks ("requires VIN-style serial number", "auto-rejects all-caps titles", etc.) |
equipment_fit | which equipment_types this marketplace specializes in |
Initial seed list (extend as the dealer brings new sites):
- eBay — general; high reach, but most used-IMM buyers don't shop here
- equipt.com — plastics-heavy; strong for IMM, blow molders
- exapro.com — European-leaning; CNC + IMM + general
- machinepoint.com — European, plastics + general industrial
- surplusrecord.com — US, general industrial / heavy
- machineryvalues.com — US, general industrial
- MachineTools.com — CNC-heavy
- IronPlanet — auction-style, heavy + construction
- Facebook Marketplace — local pickup; surprising for smaller machines
- LinkedIn Company Page — soft post, drives inbound RFQs to dealer's own site
- Dealer's own website — always; primary canonical listing
scripts/registry.py::ALL_PLATFORMS is the editable list. To add a new marketplace mid-flight, dealer says "add IronPlanet" and the skill appends a new entry.
Per-listing flow
- Collect machine facts — ideally cross-reference the
imm-spec-agent cache for this brand/model. Otherwise prompt for: brand, model, year, type (IMM/CNC/etc.), tonnage/primary spec, hours/cycles, condition language, location, asking price, included extras (auxiliaries, tooling, parts), photos (paths), the dealer's stock number.
- Decide platforms — defaults to all
active: true platforms whose equipment_fit matches. Dealer can override ("skip eBay this time").
- Generate per-platform content —
scripts/build_listings.py produces, for each platform:
title (within title_max_chars)
description (formatted per description_format)
category_path (recommended)
tags / keywords
images (resized/renamed copies meeting platform specs)
posting_url (the new-listing page)
- Output bundle — a folder under
/mnt/user-data/outputs/listings_<stock>/ with one subfolder per platform containing a LISTING.md (copy-paste ready), an images/ folder, and a top-level INDEX.md showing all posting URLs in a numbered checklist.
- Multi-post workflow — the skill walks the dealer through posting URLs one at a time: "(1) Open the eBay posting URL, paste from
ebay/LISTING.md, upload images from ebay/images/, submit, come back here, say done. (2) Now exapro... " etc. This is the "minutes instead of hours" promise.
- Listing log — append to
/mnt/user-data/uploads/.dealer_marketing_log.jsonl with {stock, platform, posted_at, listing_url}. The dealer can later ask "where did I post the Krauss-Maffei?" and get the full set back.
Generating platform-tailored content
The trick is one canonical content block converted to N platform-specific shapes:
- eBay — short, keyword-heavy title (80 chars). Bullet-point spec list. Stock photos as supplementary, real photos primary. End with
Pickup only / Buyer arranges rigging disclaimer.
- equipt.com — longer title OK. Description supports HTML; structure as: 1-line hook → key specs table → condition statement → location → asking price. Categorize precisely (Plastics → Injection Molding → 100-249 ton).
- exapro — bilingual title (English + auto-translated French/German as keywords). Emphasize export-readiness, container-friendly dimensions.
- machinepoint — European decimals (3.500 not 3,500). Highlight ports.
- MachineTools.com — CNC vocabulary if applicable: spindle taper, X/Y/Z travels, RPM, control type (Fanuc, Siemens, Haas, etc.).
- Facebook Marketplace — short, casual title. Description ≤300 chars. Local pickup framing.
- LinkedIn — soft post — "Just took in a Krauss-Maffei CX 160. Sold as-is, ex-works Cleveland. DM if you want specs." NOT a hard listing.
Anti-patterns
- ❌ Cross-posting the same all-caps eBay title to equipt — equipt auto-rejects all caps and the dealer ends up with two failed listings.
- ❌ Posting to a marketplace that doesn't fit the equipment type (CNC lathe on a plastics-only board) — equipment_fit gates this.
- ❌ Reusing the previous machine's
stock_number — every listing needs a unique stock.
- ❌ Quietly cropping photos — never crop without confirming; some buyers infer condition from corner details.
- ❌ Forgetting the rigging language — every used-machinery listing should say "Buyer responsible for rigging" (or "Rigging quoted separately") to set expectation.
File map
scripts/registry.py — the marketplace registry (extensible)
scripts/build_listings.py — generates platform-tailored content + image sets
scripts/image_prep.py — resize/rename photos per platform specs (Pillow)
scripts/log_post.py — record a successful post + listing URL
references/title_patterns.md — proven title templates by equipment type
references/category_maps.md — platform → category-path mappings for common equipment
Companion skills
imm-spec-agent — source of truth for technical specs; this skill pulls from it
photo-watermark + brand-imprint — every photo going into a listing should be branded
sales-agent — when a marketplace inquiry hits the dealer's inbox, sales-agent picks it up as a lead