Writing Stock Metadata CSVs That Pass Adobe's Five-Column Header Check First Time
Description and use
An automated workflow that generates platform‑specific CSV metadata, enforces header rules, trims keyword limits, and tracks uploads to avoid double‑posting, ensuring first‑try acceptance on Adobe Stock, Vecteezy, and Dreamstime.
Problem
A single incorrect CSV header caused a batch of 40 JPEGs to be rejected by Adobe Stock before review, wasting an entire afternoon.
Outcome
The pipeline runs on a minimal 1 vCPU, 2 GB RAM server, processes metadata with pure Python, and achieves first‑try acceptance on Adobe, Vecteezy, and Dreamstime.
Workflow
- 1. Store raw images in assets/ folder.
- 2. Run make_metadata.py with platform flag to generate CSV with exact header and required columns.
- 3. Supply titles.json for human‑written titles and keywords per asset.
- 4. Use upload_tracker.py to check pending uploads, run upload, and mark done to avoid double‑posting.
- 5. Optionally run md2pdf.py and pack_product.py for packaging.
- 6. Verify CSV passes platform parser before upload.
Evidence
I had written <code>Keywords</code> where Adobe wanted <code>keywords</code>, lowercase, and I had eight columns where Adobe's ingest expects exactly five.
Adobe Stock's CSV ingest is strict. The header row must be five columns: <code>Filename</code>, <code>Title</code>, <code>Keywords</code>, <code>Category</code>, <code>Releases</code>.
I built <code>upload_tracker.py</code> after doing exactly this once: a ledger that records what is done, so <code>pending</code> shows only what has not been posted, and a re‑run cannot double‑post.
- Record date: 2026-10-17T03:41:30.305Z