在 Adobe Stock、Vecteezy 和 Dreamstime 統一定價:鮮少有人提及的中繼資料取捨
Setting One Price Across Adobe, Vecteezy And Dreamstime: The Metadata Tradeoffs Nobody Mentions
Adobe Stock、Vecteezy 和 Dreamstime 可統一定價,但 CSV 格式各異,須為每個平台分別生成中繼資料。三者分別要求 5、4、15 欄;上載追蹤表可防止重複提交。AI 生成素材亦須遵守各平台的披露規定,合規工具包包含 CSV 產生器和追蹤工具。
Last February I had 40 vector files ready to go. I built one CSV, copied it three times, and uploaded to Adobe Stock, Vecteezy, and Dreamstime in one sitting. Adobe rejected the whole batch in about four minutes. Vecteezy flagged a duplicate-content warning on the same files Dreamstime accepted. I lost a full evening to re-uploads and learned that "one price, one listing, three platforms" is a metadata problem before it is a pricing problem.
Here is what actually works, and what nobody tells you.
The headers are not compatible, and that is the whole problem
Adobe Stock wants a 5-column CSV. Vecteezy wants 4 columns. Dreamstime wants 15. If the header row does not match exactly, the upload rejects before a human ever sees your file. I know this because I tested it: a Vecteezy CSV uploaded to Adobe fails instantly, no partial credit, no "did you mean" hints.
So the idea of one master spreadsheet is wrong. What you need is one source of truth and three renderers. In my pipeline, make_metadata.py reads a folder of assets plus an optional titles.json with real titles and keywords, then writes the exact header each platform demands. Adobe gets its 5 columns, Vecteezy its 4, Dreamstime its 15. Same asset, same price, three different shapes. The script uses the Python standard library alone, no installs, which matters when you are running on a small box.
Pricing one price across three platforms is fine. Metadata per platform is not
The price itself is the easy part. You set a license price on Dreamstime, you set credit pricing on Adobe, Vecteezy has its own contribution tiers. Those live on the platform dashboards, not in the CSV. What trips people is trying to smuggle pricing or bundle info into metadata fields the platforms do not use. Extra columns get stripped or rejected. Keywords get truncated at different limits per platform, so a 49-keyword Adobe listing becomes a truncated mess elsewhere.
My rule now: price lives in one place, my own ledger. Metadata is a per-platform projection of that ledger. I never hand-edit a platform CSV after generation, because then the ledger and the platform disagree, and six months later I cannot reconstruct what I actually published.
Double-posting is the fastest way to get flagged
This one cost me real anxiety. I re-ran a batch script once, forgot which files had already gone up, and posted duplicates. Duplicate submissions are one of the fastest ways to get an account flagged on stock platforms, and the review queues do not warn you before the fact.
The fix is dumb and effective: a ledger. upload_tracker.py keeps a plain text record of every asset marked done. Before any batch, I run pending against my item list and upload only what it shows. Re-running the pipeline can never double-post because the tracker is checked, not my memory. It is a few hundred lines of standard library code and it has prevented every repeat of that February evening since.
AI-generated content has its own disclosure rules
If your assets are AI-generated, and mine partly are, each platform has its own disclosure requirements on submission, and getting this wrong is a policy violation, not a style choice. Adobe requires you to mark generative AI content at upload. Dreamstime and Vecteezy have their own rules. My metadata generator carries a flag per asset so the disclosure is consistent across all three columns of my workflow, and I keep the generation cost per image in the same ledger so I know my real margin before I price anything. If you do not track your per-image generation cost, you are pricing on vibes.
Small server lessons that apply to metadata too
The whole pipeline runs on 1 vCPU and 2 GB RAM, no GPU. Two habits carried over from image rendering into the metadata side. First, one process at a time: I never fan out batch jobs in parallel on a single core, it just thrashes. Second, measure peak memory, not average, with resource.getrusage(RUSAGE_SELF).ru_maxrss. Metadata generation is light, but the render and packaging steps are not, and gc.collect() between assets keeps peak RSS under the ceiling. Render previews at 60 dpi when inspecting, 300 only for finals.
The folder layout that keeps this sane
One fixed structure, no exceptions: assets/ for raw output, output/ for submission-ready files plus the CSVs, packs/ for finished product zips, research/ for notes and scrape logs. I once deleted my research folder to "clean up" and immediately needed it for a follow-up product. Keep it forever. Disk is cheaper than redoing work.
Where this ended up
After packaging 39 products and about 856 MB of output, I pulled the metadata and tracking layer out of the parent pipeline and cleaned it up. That is the compliance metadata kit: the three platform CSV generators with the exact Adobe 5-column, Vecteezy 4-column and Dreamstime 15-column headers, the upload tracker, plus a Markdown-to-PDF converter and a packaging script that zips products and renders a 1280x720 cover and 600x600 thumbnail. Only two third-party packages, Pillow and reportlab, and the two metadata scripts need nothing but Python 3.9. It validated on the same 1 vCPU / 2 GB box, and there are 300+ pages of research behind the rules the scripts enforce.
It is not magic. It is the boring layer that stops rejections and duplicate posts so you can spend your evenings making art instead of fixing CSV headers.
Building digital products? Free guides & kits for digital product sellers.
來源:DEV Community · dev.to