Last spring I had 39 products of art sitting in folders and zero of it for sale. Art was done. What blocked me for two weeks: CSV headers, double-upload scare, PDF that looked like printout.
Worst night: re-ran batch script at 1 a.m. because I thought first run failed. It hadn't. Same 40 files queued twice on same channel. Double-posting is fastest way to get contributor account flagged. Spent next morning checking dedupe. It held. Then I wrote ledger so it could never happen again.
That ledger is now one of four scripts. Here is what each fixed, with numbers.
Header is gate, not art
All three stock channels reject wrong CSV header instantly. Not "review comes back with notes". Instant rejection, before human sees work.
Counts:
- Adobe Stock: 5 columns
- Vecteezy: 4 columns
- Dreamstime: 15 columns
make_metadata.py writes exact header each platform demands, nothing else. Point it at folder:
python make_metadata.py ./my-assets --platform adobe --out metadata.csv --ext .jpg No titles file? Filename gets title-cased, used as title. Fine for first pass, replace before submit. Reviewers read titles. Pass --titles titles.json when real titles and keywords exist.
Stdlib only. No pip install. Metadata is your only bottleneck? This one script closes it.
Ledger that makes double-posting impossible
upload_tracker.py. Plain ledger, three commands:
python upload_tracker.py pending items.txt # what is NOT done yet python upload_tracker.py done "asset-001.jpg" python upload_tracker.py status Re-run batch as often as you like.
Building digital products? Free guides & kits for digital product sellers.
