Metadata and Compliance: Five Fatal Mistakes That Get Assets Rejected

Five rejection-causing metadata and compliance mistakes independent creators make—plus automated fixes.
Based on firsthand creator experience, this article covers five common reasons digital assets get rejected: CSV header column counts that don't match platform requirements, file-name fallbacks used as titles, untracked duplicate submissions, undeclared AI-generated content, and the lack of a fixed archiving structure. Fixes include per-platform standard-library header scripts, explicit real-title JSON, a plain-text upload ledger, low-resolution pre-checks plus AI declarations, and a fixed folder structure. The core takeaway: move metadata and compliance checks ahead of the generation workflow.
Metadata and Compliance: Five Fatal Mistakes That Get Assets Rejected
One creator had 60 vector files rejected within a minute of submission—all because their CSV header had one extra column. That lesson reveals an underappreciated truth: on digital asset platforms, metadata and compliance details often become bigger roadblocks than the work itself. Drawing on firsthand practitioner experience, this article lays out the common mistakes that get assets rejected and the reusable fixes for them.

Headers Are a Hard Requirement, Not a Suggestion
According to the original author, the three main platforms they submit to have different CSV requirements: Adobe requires 5 columns, Vecteezy requires 4, and Dreamstime requires 15. If the header doesn't exactly match the platform's requirements, the file simply won't be ingested—and the system returns only a generic error that doesn't say which column is wrong.
The author's initial approach was to build metadata by hand in a spreadsheet, then reuse the same sheet across platforms. Manually editing between different formats is exactly how extra columns sneak in. The fix isn't complicated: a script called make_metadata.py that uses only the Python standard library, reads the files in a folder, and outputs the exact header for each platform. The author runs it three times with the --platform parameter, producing three correct CSVs from the same folder. This kind of "boring" automation is precisely the key to avoiding low-level errors.
File Names Are Not Titles
The second rejection reason the author ran into on Vecteezy was lazy titles. When no real title is provided, the script falls back to the file name converted to title case, so floral_frame_04.jpg becomes "Floral Frame 04." Reviewers see this as low-quality metadata, and in the author's experience, low-quality metadata correlates strongly with rejection—while also badly hurting search discoverability, which is the whole point of metadata in the first place.
The effective approach is to prepare a JSON file with real titles and keywords for each asset and pass it in explicitly. A batch of 40 assets takes about ten minutes, but it's the difference between "barely passing" and "ready to submit." The author kept the file-name fallback logic because it's useful for a first pass, but treats it as a placeholder, not a final state. If you automate this pipeline, keep the placeholder step intentionally so you can identify which assets still need real metadata before submitting.
Duplicate Publishing Gets Accounts Banned Faster Than Poor Work
Early on, the author re-ran upload batches after partial failures and forgot which entries had already been submitted successfully, resulting in about a dozen assets being published twice. Duplicate submissions are one of the fastest ways to get an account flagged, and platforms don't care whether it was an accident.
The solution is a plain-text ledger. upload_tracker.py is extremely simple: pending shows unfinished items, done marks them complete, status gives an overview—and it relies only on the standard library. The rule the author now follows is: the ledger is the single source of truth, not memory or the platform dashboard. Every batch job checks the ledger before executing, and re-runs never republish the same file. This habit costs nothing yet eliminates every recurrence of that mistake.
Upload Tracker: In batch submission scenarios, maintaining a plain-text ledger is the lowest-cost way to prevent duplicate publishing. The ledger typically records each file's unique identifier (such as file name or hash), submission status (pending/done), and timestamp. The script queries the ledger before any upload action and skips entries already marked done. This approach doesn't depend on delayed data from the platform dashboard or on human memory, and it effectively prevents duplicate submissions caused by re-running batches. For independent creators, a standard-library script of a few dozen lines is enough to implement it—yet it minimizes account risk.
AI-Generated Content Has an Extra Compliance Layer
If any part of an asset comes from an AI image generator, the platform requires you to declare it. Adobe has a dedicated generative AI content checkbox, and submitting AI work without declaring it is a policy violation—not a style choice. Beyond the declaration, the work itself must pass review: no garbled text, no malformed hands, no recognizable trademarks or people. The author's rejection rate on raw AI output was so high that they started inspecting every file at low resolution before submission—which also fits their server budget. On a machine with 1 vCPU and 2 GB of memory, previewing at 60 dpi instead of 300 dpi is faster.
On the budget side, AI image generation isn't free when used at scale and is often the biggest expense in the pipeline. The author runs everything else on a free tech stack at zero cost, using otherwise idle hardware. So plan your generation batches to avoid paying repeatedly for assets that get rejected over fixable metadata problems.
Generative AI Content Declaration: On platforms like Adobe Stock, when submitting assets that contain AI-generated elements, authors must check the "generative AI" marker in the metadata. This marker isn't optional—it's part of platform policy, designed to make asset provenance transparent to buyers and to mitigate copyright and ethical risks. Submitting without declaring it, once detected by automated systems or human review, is treated as a policy violation and can lead to account penalties rather than a one-time rejection. Moreover, platforms are tightening their review standards for AI content, focusing especially on recognizable trademarks, people's likenesses, and generation artifacts (such as garbled text and malformed limbs). Creators should inspect each file at low-resolution preview before submitting, which not only catches flaws early but also saves server resources.
Package and Archive First, Submit Later
The last compliance-related habit is maintaining a fixed folder structure: assets/ for raw output, output/ for submission-ready files with metadata CSVs, packs/ for finished zips with covers, and research/ for notes. The author once deleted the research folder to "clean up" and immediately regretted it, because those notes were the raw material for the next three products.
On a small server, run only one process at a time, call gc.collect() between assets, and measure peak memory with ru_maxrss rather than guessing. This pipeline packaged 39 products in about 856 MB of output on 1 vCPU and 2 GB of memory with no GPU. None of these practices are clever, but they're all habits that prevent rejections and crashes.
The author has codified these lessons in a Pipeline Starter Kit containing four scripts that generate CSVs in Adobe's 5-column, Vecteezy's 4-column, and Dreamstime's 15-column formats, track uploads to avoid duplicates, and handle product packaging. According to the author, these scripts have been validated against roughly 19,000 lines of pipeline code and over 300 pages of research rules.
gc.collect() and ru_maxrss in Memory Management: When batch-processing assets on resource-constrained servers (such as 1 vCPU/2 GB memory), Python's garbage collection may not release memory held by large objects in time, causing subsequent processes to crash from out-of-memory errors. Explicitly calling gc.collect() forces collection of objects not cleaned up automatically, such as circular references—especially useful after finishing each asset, as it effectively lowers peak memory. Meanwhile, ru_maxrss (obtained via the resource module) measures a process's peak resident set size, helping developers evaluate memory usage with data rather than guesswork, so they can adjust batch sizes or optimize code. Combined, these two habits let low-spec machines reliably complete packaging tasks.
Practical Takeaways
The core of all these lessons comes down to one point: move metadata and compliance checks ahead of the generation workflow, not after it. Header matching, real titles, an upload ledger, AI declarations, and a fixed directory structure—none are complicated on their own, but together they form a defense line against rejection. For independent creators, automating these "boring" steps protects time and budget far better than chasing smarter generation techniques.
One-line Summary
Five mistakes that get independent creators rejected over metadata and compliance details—plus automated fixes.
Paragraph Summary
Drawing on firsthand practitioner experience, this article summarizes five common mistakes that get files rejected on digital asset platforms: CSV header column counts that don't match platform requirements, falling back to file names as titles, untracked duplicate submissions, undeclared AI-generated content, and the lack of a fixed archiving structure. The author notes that while none of these mistakes is complicated on its own, together they seriously undermine account safety and search discoverability. Fixes include using standard-library scripts to generate exact per-platform headers, explicitly providing real-title JSON files, maintaining a plain-text upload ledger, pre-checking AI assets at low resolution and declaring them, and fixing the folder structure with process-by-process packaging. The core takeaway: move metadata and compliance checks ahead of the generation workflow, and let "boring" automation protect your time and budget.
Related articles

AI Is Not a Replacement: Human-AI Collaboration Through the Lens of Factory Root Cause Analysis
Starting from factory root cause analysis, this article explains how AI accelerates evidence chain construction rather than replacing human experts, exploring the pragmatic implementation logic and business value of 'AI supporting people rather than replacing them.'

AI Agent Decision Auditing: Building an Evidence Chain in Regulated Workflows
Starting from a Reddit discussion, this article analyzes three core issues in AI agent decision auditing within regulated workflows: what fields audit records should contain, how to handle feedback latency for erroneous decisions, and how to continuously calibrate LLM judge consistency with human judgment.

Apple Opens Multiseat Subscription Purchasing: App Subscriptions Can Now Be Sold in Bulk to Businesses and Schools
Apple opens multiseat purchasing for auto-renewable subscriptions: businesses and schools can bulk-buy via Apple Business and Apple School Manager, adding or removing seats anytime. Enabled by default in App Store Connect—developers should verify settings; group purchasing sandbox testing opens October 2026.