Fetch structured FF&E product specs from a list of URLs. Extracts name, brand, dimensions, materials, price, and images into a standardized schedule.
Extract structured FF&E data from a list of product page URLs. Outputs a standardized schedule ready for design specs, procurement, or import into Canoa.
The user provides product URLs in one of these ways:
.txt, .csv, or .md file containing URLs (one per line)If the input format is unclear, ask.
Products are written to the master Google Sheet — the same 33-column schema used by all product skills. When writing to CSV, use the same column order.
Read ../../schema/product-schema.md (relative to this SKILL.md) for the full column reference, field formats, and category vocabulary. Read for CRUD patterns with MCP tools.
../../schema/sheet-conventions.mdSkill-specific column values:
savedbulk-fetchFor each URL:
Use this prompt (or close variant) for each URL:
Extract structured product/furniture specification data from this page. Return a JSON object with these exact fields:
- product_name: Full product name (Title Case)
- description: Short description or tagline (1-2 sentences), or null
- sku: Product ID, SKU, model number, or catalog number, or null
- brand: Manufacturer name (Title Case)
- designer: Designer or design studio name if attributed, or null
- vendor: The retailer/website selling the product (may differ from brand), or null
- collection: Product line or collection name, or null
- category: One of: Chair, Table, Sofa, Bed, Light, Storage, Desk, Shelving, Rug, Mirror, Accessory, Tabletop, Kitchen, Bath, Window, Door, Outdoor Furniture, Textile, Acoustic, Planter, Partition, Other
- width: Numeric width value only (no units), or null
- depth: Numeric depth value only (no units), or null
- height: Numeric height value only (no units), or null
- seat_height: Numeric seat height for seating products, or null
- unit: "in", "cm", or "mm" — whichever the page uses
- weight: Weight as stated with unit (e.g. "45 lbs"), or null
- materials: Comma-separated list of primary materials
- colors_finishes: Comma-separated list of ALL available colors or finish options
- list_price: Numeric price (no currency symbol, no commas), or null
- sale_price: Discounted/sale price if shown, or null
- currency: "USD", "EUR", "GBP", etc.
- lead_time: Delivery estimate as stated, or null
- warranty: Warranty info as stated, or null
- certifications: Comma-separated certifications (GREENGUARD, FSC, BIFMA, etc.), or null
- com_col: "COM", "COL", "COM/COL" if mentioned, or null
- indoor_outdoor: "Indoor", "Outdoor", or "Indoor/Outdoor" if specified, or null
- image_url: URL of the primary product image (largest/hero image)
If this is NOT a product page, return: {"error": "not_a_product_page"}
If dimensions use a combined format like "32 x 24 x 30 in", split them into W x D x H.
If price says "Contact for pricing" or similar, set price to null.
Return ONLY the JSON object, no other text.
Extract all URLs from the user's input. Report count: "Found N product URLs."
Process URLs using WebFetch. Use parallel tool calls — fetch up to 5 URLs simultaneously to maximize speed. Report progress after each batch.
Build a results table. Group into:
Show a summary table in markdown with all successful + partial results. Flag any issues:
Ask the user: "Where should I save this?" Options:
./ffe-fetch-YYYY-MM-DD.csv)Write the output in the chosen format using the 33-column master schema. For Google Sheets, use mcp__google-sheets__update_cells to append rows. Set Clipped At to current timestamp and Source to bulk-fetch.
When saving to CSV, use the CSV header from ../../schema/product-schema.md.
After the batch completes, always report:
Fetched: X/Y successful, Z partial, W failed
List any failed URLs with the reason.