DEV Community

Cover image for 49 Products, 0 Sales: The Distribution Lesson Nobody Tells Makers

49 Products, 0 Sales: The Distribution Lesson Nobody Tells Makers

Last March I sat in front of my sales dashboard at 11pm and counted again. 49 products live across three marketplaces. Zero sales. Not "slow sales", zero. I had spent six months building the machine and almost no time asking whether anyone wanted what the machine made.

This post is the honest postmortem. If you are a maker with a pipeline and an empty sales column, this is the distribution lesson I learned the expensive way.

Production was never the bottleneck

I had convinced myself that the hard part was making things. So I built it all: a prompt engine, batch rendering, packaging. The pipeline ran on a 1 vCPU, 2 GB RAM server with no GPU, one process at a time, gc.collect() after every asset. It worked. It packaged 39 products, 856 MB of finished output, backed by roughly 19,000 lines of pipeline code and 300+ pages of research.

None of that produced a single sale. Because production is the part every maker can already do, or can automate. Distribution is the part that actually decides whether money arrives.

The marketplaces are a discovery engine, not a vending machine

My first assumption was that uploading to Adobe Stock, Vecteezy and Dreamstime meant distribution. It does not. It means inventory. Stock sites surface maybe a fraction of new uploads, and they surface them based on metadata quality, not upload volume.

That is where I lost months. Adobe's upload CSV has a 5-column header, Vecteezy wants 4 columns, Dreamstime wants 15. Get one column wrong and the file rejects instantly, before a human ever sees it. I burned whole batches on header mistakes and re-uploaded duplicates because nothing tracked what had already gone out. Double-posting is also the fastest way to get an account flagged, which I learned the nerve-wracking way.

The fix was boring: a script that writes exactly the header each platform demands and nothing else, and a ledger that remembers every posted file so a re-run can never double-post. That solved the mechanics. It did not solve sales, because mechanics were never the problem.

49 products in one niche is worse than 5 in five niches

Here is the number that stung. I made 49 products in essentially one visual style, for one buyer type. When nobody searched for it, all 49 failed together. Diversification is not just about more shots, it is about independent bets. Ten products across sticker packs, template bundles, and stock vectors can fail independently. Mine were one bet repeated 49 times.

The pipeline made this worse, not better. Automation amplifies whatever assumption you feed it. My assumption was "people want this style". The machine faithfully produced 856 MB of proof that I had never validated that.

Distribution starts before the asset exists

What actually works, based on what moved after I changed approach:

  1. Search demand first. Before generating anything, check what buyers actually search for on each platform. The keyword fields in those CSVs are not decoration, they are the entire discovery mechanism. A title-cased filename as a title is fine for a first pass, but it must be replaced with real search terms before submission.
  2. Channel fit. The same asset is not equally sellable everywhere. Vecteezy buyers, Adobe buyers and Dreamstime buyers want different things at different price points. The 15-column Dreamstime CSV exists for a reason, they want more information because their buyers filter harder.
  3. Keep your research. My scrape logs and keyword notes, the stuff I almost deleted to "clean up", turned out to be the raw material for the products that eventually sold. Delete your research folder and you delete your next product.
  4. Package like a product, not a file. A zip with a real 1280×720 cover and a 600×600 thumbnail converts. A bare file does not. This is a small lift with a visible effect.

What I would tell the March version of me

Build the pipeline, it is worth it. But budget your time 20% production, 80% validation and distribution. Validate one product idea with real search data before you batch-render a hundred. Treat the marketplace CSV headers as contracts, not chores. And never let a script produce more than you have evidence people want.

The irony is that the failure forced me to build the parts I had skipped: the metadata writers, the upload ledger, the packager that turns a Markdown doc into a styled PDF product with one command. Those four scripts, make_metadata.py, upload_tracker.py, md2pdf.py and pack_product.py, are the packaging layer that finally let me ship properly instead of just producing. Two of them need nothing but the Python standard library, the other two need only Pillow and reportlab.

They will not do your distribution thinking for you. Nothing will. But they remove every mechanical excuse between "I made something" and "it is listed correctly on three platforms".

See the kit


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

Top comments (0)