How Do I Sell Physical and Digital Products Together?
VeloCMS lets you mix physical and digital products in one store. Set the product type per item, and attach digital assets at the variant level.
You can sell both physical and digital products from the same VeloCMS store — there's no separate module or toggle to switch between modes. The product type is set per item, so your catalog can have a printed book, a PDF download, and a tote bag sitting side by side.
Read the full transcript
If you want to sell a digital product — presets, an ebook, a template pack — you do not need WooCommerce, and you do not need Shopify. VeloCMS has a real store built in. I'll list a download, wire up the delivery, and follow it from your shop all the way to the buyer's inbox.
It starts under Products, then New. I'll give it a name — Cinematic Lightroom Presets — set the price to twenty-four dollars, and choose Digital as the type. Watch what happens: all the shipping fields disappear, because there's nothing to ship.
A digital product needs one real thing: the actual file. I attach the preset pack right here, and that's the file every single buyer gets automatically. I never touch it again after this — set it once, and it delivers itself forever.
The second it's saved, it's live in your shop — and your shop already matches your theme, not some bolt-on checkout that clashes with your site. Here it is on Salas Film Lab, in exactly the same look as the rest of the blog.
Buyers pay by card through Stripe, or with PayPal — both are built in, no extra plugin to install. They get a clean checkout on your own domain, and you keep the sale instead of handing it to a marketplace.
Here's the part that saves your evenings. The moment a payment clears, VeloCMS emails the buyer a private download link that expires on its own — so nobody's passing your file around, and you're never manually sending anything at midnight.
A real digital store — products, checkout, and automatic delivery — with no WooCommerce and no Shopify. Try it at velocms dot org.
How do I specify that a product is digital?
When creating or editing a product, look for the Product Type selector near the top of the form — Digital, Physical, or Mixed. Digital products work like this today: add the product and its price in Admin -> Products, then paste the link to a file you host yourself on the variant. VeloCMS emails that link to the buyer after payment. Uploading the file inside VeloCMS isn't available yet.
Can a single product have both digital and physical variants?
Yes, and this is one of the more powerful things the variant system supports. Say you're selling a photography course — you might offer a Physical tier (printed workbook shipped to the customer) and a Digital tier (PDF download, instant delivery). Add both as variants, set the product type on the variant row to either Physical or Digital, and paste the link to your PDF on the Digital variant row. At checkout, VeloCMS routes each variant correctly — physical variants go through the shipping flow, digital variants deliver the file link immediately after payment.
Digital orders skip the shipping step at checkout entirely — no address is collected and no shipping zone is required. If a cart contains a mix of physical and digital items, VeloCMS collects a shipping address for the physical items only.
How are digital download links protected?
Every download is a signed URL, not a permanent public link. The link in the delivery email works for 1 hour (5 minutes for files stored privately). When it lapses the customer isn't locked out: clicking the download link again makes VeloCMS verify the purchase and issue a fresh signed URL on the spot, and that re-issue right lasts 7 days from the order. Neither window is configurable — the short-lived links are what stop casual link sharing.
What happens if a customer refunds a digital product?
When you issue a refund on a digital order, VeloCMS revokes download access on that order's items — from that point no new download links are issued for it. A link signed just before the refund keeps working for the rest of its short window (an hour at most) and then dies on its own, so access effectively ends within the hour.