I Read Every Adobe Rejection Reason. Most of Them Are One Rule
Description and use
Automating metadata, CSV generation, and upload tracking reduced platform rejections to image quality issues only.
Problem
Frequent rejections from Adobe and other platforms due to metadata and upload errors, despite high-quality images.
Outcome
Rejections dropped from almost all assets to only image quality issues; 39 finished products produced from a 60‑asset batch, 856 MB of output, and a 19,000‑line pipeline with 300+ pages of research notes.
Workflow
- 1. Read all rejection emails and categorize reasons into a spreadsheet.
- 2. Identify that most rejections stem from metadata errors (title, keywords, filename).
- 3. Create a titles.json file with human‑written titles and keywords per asset.
- 4. Write make_metadata.py to generate platform‑specific CSV headers and metadata rows.
- 5. Use make_metadata.py with --platform flag to produce adobe.csv, vecteezy.csv, dreamstime.csv.
- 6. Implement upload_tracker.py to log pending, done, and status of uploads, preventing duplicate submissions.
- 7. Add memory‑management steps to the generation pipeline: single‑process execution, gc.collect(), peak RSS monitoring, subprocess rendering, and low‑dpi preview checks.
- 8. Package the scripts into a starter kit with dependencies Pillow and reportlab.
- 9. Submit batches using the generated CSVs and tracker to ensure compliance and avoid rejections.
Evidence
most of them trace back to one rule about metadata, not about the art.
I stopped letting the pipeline invent titles. Now there is a titles.json file, one real title and one real keyword set per asset, written by a human who looked at the image.
I wrote one script, make_metadata.py, that takes a folder of files and emits the exact header each platform demands, nothing else.
The fix is a dumb ledger. upload_tracker.py is a plain file that remembers what you have already posted.
One process at a time. Never fan out image jobs in parallel on a single core.
A batch that used to die at asset 30 now runs to the end.
- Record date: 2026-10-12T13:41:59.605Z