Replacing a $30K Digital Asset Manager with $600 of Cloudflare

Seven winery brands needed one place for trade partners to download labels, bottle shots, and tech sheets. The commercial options quoted above $30,000 a year. I built it on Cloudflare Workers instead, and it runs for roughly $600.

Annual cost
~$600from $30,000+ quoted
Brands served
7one portal each
Downloads
5,852381 unique users

The problem

Distributors, retailers, and on-premise accounts constantly need brand assets: a high-resolution label for a shelf talker, a bottle shot for a menu, a tech sheet for a buyer meeting. At a seven-brand wine company, those requests all landed in the same place — the marketing and web team's inbox.

The existing process was email and shared drives. Someone would ask for the current Cabernet label, a person would go find it, and a 40MB file would go out as an attachment or a link that expired. Nobody could tell which version was current. Nobody could tell what had been downloaded, by whom, or whether a partner was still using artwork from two vintages ago.

The obvious fix is a digital asset management platform, and there are good commercial ones. The quotes came back above $30,000 a year. For a company where the entire web budget had to cover hosting, e-commerce, and a team, a five-figure line item for file storage with a login screen was not going to survive a budget review — and honestly, it shouldn't have.

What I actually needed

Working backwards from the requests we were already fielding, the real requirements were narrower than what the commercial products sell:

What I did not need was most of a commercial DAM: approval workflows, InDesign plugins, AI tagging, rights management for a media library we didn't have. The gap between what was for sale and what we needed was the whole argument for building it.

How it's built

The entire thing runs on Cloudflare's platform, which is what makes the economics work. There is no origin server, no VM, and nothing to patch.

R2 is the piece that decides the cost. Traditional object storage bills for egress, so a DAM — a product whose entire purpose is people downloading big files — is exactly the workload that makes those bills unpredictable. R2 charges for storage and operations but not egress, which turns a variable cost that scales with the thing you want to happen into a flat, forecastable one.

The trade assets portal showing a grid of winery brand cards, each with a logo and an asset count, above a filterable list of downloadable brand files.
The trade portal. Each brand gets its own entry point and its own visual identity.

The part that mattered more than the savings

The cost reduction is the headline, but the analytics turned out to be the more useful outcome.

Once every download was logged, we could answer questions the old process made impossible. Which brands do partners actually request assets for? Which SKUs get pulled before a selling season? Which accounts are active and which have gone quiet? Which assets has nobody touched in a year, so we can stop maintaining them?

An analytics dashboard with summary tiles for total downloads and unique users, alongside tabs breaking activity down by asset, category, winery, and recent activity.
Downloads, unique users, and storage by brand, with exportable reports.

That reporting was not in the original brief. It became the feature people asked about, because it converted a support burden into a source of information about partner behaviour that the business did not previously have.

What it cost, honestly

The ~$600/year figure is infrastructure: Workers, R2 storage, D1, and the domain. It does not include my time to build it, and any comparison that ignores that is not a fair one.

The reason the trade still works is that the build was bounded. This is a well-understood problem — store files, serve files, log the serving — and the platform primitives do most of the heavy lifting. There was no novel infrastructure to design and nothing to keep running once it shipped. The maintenance cost since launch has been close to zero, which is the actual test of whether a build-versus-buy decision was correct.

I would give different advice for a different shape of problem. If we had needed approval chains, per-market rights, or deep creative-tool integration, the commercial products earn their price and I would have said so.

Where it went next

The pattern generalised. I later rebuilt it as Trade Pourtal, a multi-tenant version with custom-domain branding, role-based access control, version history, and audit logging — the same core idea, productised so it isn't tied to one company's brand list.


Working on something similar? If you're weighing a commercial platform against a focused build, I'm happy to talk through where the line actually falls.

Get in touch →