DEV Community

Cover image for The Pre-Submit Checklist That Cut My Adobe Stock Rejections To Nearly Zero

The Pre-Submit Checklist That Cut My Adobe Stock Rejections To Nearly Zero

Last February I uploaded a batch of 40 vector illustrations to Adobe Stock in one sitting. I was proud of myself. Three days later, 31 of them came back rejected. Not for the art. For metadata. Wrong keywords, a title that read like a keyword dump, one file with a title that was just the filename in lowercase. I sat there with a rejection list longer than my upload list and realized the problem was never going to fix itself.

That was the moment I stopped treating metadata as an afterthought and started treating it as a checklist. Here is what that checklist looks like now, and why my rejection rate dropped to almost nothing.

The CSV header is a gate, not a suggestion

Every stock platform validates the metadata file before a human ever sees your work. Adobe's upload CSV has a fixed 5-column header. Vecteezy uses 4 columns. Dreamstime wants 15. Get one column wrong, in the wrong order, or with the wrong name, and the file is rejected instantly, before review.

I learned this by hand-editing a spreadsheet once and transposing two columns. The whole batch bounced. So I wrote a script, make_metadata.py, that writes the exact header each platform demands and nothing else. No extra columns, no creative formatting. It reads a folder of files and emits the right CSV for Adobe, Vecteezy, or Dreamstime in one command:

python make_metadata.py ./my-assets --platform adobe --out metadata.csv --ext .jpg
Enter fullscreen mode Exit fullscreen mode

The header check is the cheapest rejection to avoid and the most common one. If your CSV is right, you have already eliminated a whole category of failures.

Titles and keywords have rules, and reviewers enforce them

Adobe rejects titles that are keyword strings. "sunset beach ocean waves tropical summer vacation palm trees" is not a title, it is a rejection waiting to happen. A title should be a plain descriptive phrase. Keywords go in the keyword column, most relevant first, because order matters in how the work gets found and reviewed.

My first-pass titles come from the filename, title-cased by the script. That is fine for staging. It is not fine to submit. Before anything goes out the door, I replace the filename titles with real ones and check the keyword list against three questions: does each keyword describe something actually visible in the image, is the most important concept first, and am I under the keyword limit with no filler terms like "background" or "design" doing nothing?

That single review pass, maybe two minutes per asset, killed more rejections than anything else I changed.

Double-posting will get you flagged

This one cost me a scare. I re-ran a batch script after a partial failure and nearly uploaded the same 20 files twice. Duplicate submissions are one of the fastest ways to get an account flagged on any stock platform.

The fix was dumb simple: a ledger. upload_tracker.py is a text-file-backed record of what has been submitted. Before any upload run, I check pending:

python upload_tracker.py pending items.txt
python upload_tracker.py done "asset-001.jpg"
Enter fullscreen mode Exit fullscreen mode

A re-run now physically cannot double-post, because the tracker knows what is already done. It uses nothing but the Python standard library, so it runs anywhere, including the 1 vCPU, 2 GB server this whole pipeline lives on.

Check the art against the technical rules before upload, not after

Adobe's technical requirements are public and boring: minimum resolution, no visible artifacts, correct file format, no watermarks. AI-generated work gets extra scrutiny, and reviewers look closely for mangled hands, garbled text, and duplicated elements. Every AI image I generate costs real money, so a rejection is not just a rejection, it is wasted generation cost on top of wasted review time.

My pre-submit pass is now mechanical: render a low-resolution preview and actually look at it, check dimensions against the platform minimum, confirm the file opens cleanly, and only then does it enter the upload folder. Inspecting a preview at 60 dpi instead of rendering at 300 also keeps memory flat on my tiny server, which matters when the whole box has 2 GB of RAM and no GPU.

The checklist itself, condensed

Before any batch goes out:

  1. CSV generated by script, correct column count for the platform (5 for Adobe, 4 for Vecteezy, 15 for Dreamstime).
  2. Every title is a real descriptive phrase, not a keyword string.
  3. Keywords ordered by relevance, all describing visible content, no filler.
  4. Tracker confirms no asset in this batch was already submitted.
  5. Visual pass on a low-res preview for artifacts, garbled text, and anatomy.
  6. File format and resolution verified against platform minimums.

Six items. It takes maybe fifteen minutes for a batch of 40. It took my Adobe rejections from 31 out of 40 down to single digits, and eventually to nearly zero on routine batches.

None of this is clever. That is the point. The rejections were never about the quality of the art. They were about process, and process is fixable with a checklist and two small scripts.

Where the tools live

This checklist is baked into the compliance metadata kit, built from the same pipeline that packaged 39 finished products, about 856 MB of output, running on that same 1 vCPU, 2 GB server. It includes the exact metadata script that writes the platform-correct headers, the upload tracker that prevents double-posting, and the packaging tools I use to turn finished assets into sellable products. If you are building the same kind of pipeline, it is the tool I wish I had before that February batch.

Get compliance metadata kit


Building digital products? Free guides & kits for digital product sellers.

Top comments (0)