How do I sell digital and physical products in one checkout?

Type
Concept
Applies to
Medusa v2.x (multiple shipping methods per request since v2.16.0)
Updated

Short answer

Medusa sells digital templates and physical prints in one cart and one order. Prints use a shipping profile and carrier rates; digital items get a separate digital shipping option. Medusa's Digital Products tutorial then fulfills only the digital items after checkout and emails secure download links, while prints go through normal fulfillment.

How one Medusa checkout handles templates, courses, and prints

Medusa can put digital templates and physical prints in the same cart and the same order because it decides per item whether something needs shipping. For each variant, Medusa first checks the inventory item's Copy to clipboardrequires_shipping flag, then whether the product has a shipping profile. A shipping profile is a group of products that ship the same way, such as "Standard" for prints and "Digital" for downloads.

A Medusa cart can hold several shipping methods, one per shipping profile. That lets the customer pick a carrier rate for the prints while the digital items use a digital shipping option. Adding several shipping methods in one Store API request is available since Medusa v2.16.0.

What happens to each item after payment

Medusa's Digital Products tutorial splits the order after checkout:

  1. A custom route, Copy to clipboardPOST /store/carts/{id}/complete-digital, runs Medusa's Copy to clipboardcompleteCartWorkflow, so a normal Medusa order is created with every item in it.
  2. The workflow filters the order items whose variant is linked to a digital product, creates a digital product order, and creates a fulfillment for only those items.
  3. It emits a Copy to clipboarddigital_product_order.created event. A subscriber sends the customer an email with download links through the Notification Module and marks the digital fulfillment as delivered.
  4. The prints stay unfulfilled in the same order and go through your normal fulfillment flow in the Medusa Admin or a fulfillment provider.

Which parts are built in and which you add

Medusa's digital product support is an official guide with example code, not a core module. The table shows where each piece comes from.

PieceWhat it doesStatus
Cart, payment, tax, promotionsOne checkout for all itemsNative
Shipping profiles and optionsCarrier rates for printsNative
Digital Product ModuleData models for digital products, their files, and digital orders, linked to product variantsOfficial guide
File Module with the S3 providerStores paid files as private and previews as publicNative
Digital fulfillment providerFulfills digital items without shippingOfficial guide
Download emailSends links through a Notification Module providerOfficial guide
My downloads pageCustomer-only page in the Next.js Starter StorefrontOfficial guide
Course access, license keysGate lessons or issue keys after purchaseCustom

What to adapt from the tutorial for a mixed cart

The tutorial tests checkout with a digital product only, so a mixed templates-and-prints store needs a few changes:

  • Shipping step. Medusa returns shipping options based on the shipping address, not the cart's items. Show carrier options only when the cart has items that require shipping, and add one shipping method per profile.
  • Link expiry. The emailed links come from the File Module's Copy to clipboardretrieveFile, which returns presigned URLs. The S3 provider's Copy to clipboarddownload_file_duration defaults to 3600 seconds, so point the email at the downloads page as well.
  • Repeat buyers. The tutorial's download route only searches the customer's first digital order. Loop over all of them before you ship it.

How Medusa compares with Lemon Squeezy, Paddle, and Shopify

Lemon Squeezy and Paddle are merchants of record: they sell to the customer for you and handle sales tax and VAT. Neither accepts physical products, so they cannot run a templates-and-prints checkout. Fees are as of October 2026.

OptionPhysical prints in the same orderDigital deliveryPlatform fee
Lemon SqueezyNo, physical goods are prohibitedBuilt in5% + 50¢ per transaction
PaddleNo, physical products are prohibitedBuilt for software sellers5% + 50¢ per checkout transaction
ShopifyYesFree Shopify Digital Products app, up to 50 files and 5 GB per variantShopify plan pricing
MedusaYesOfficial guide you build on0% GMV, Medusa Cloud from $29 per month or free to self-host

Shopify handles mixed orders well: its Digital Products app delivers digital items after payment while physical items follow your normal fulfillment. Medusa fits when the delivery itself is the product, such as course access, license keys, or custom file rules, and you want that logic in your own backend.

When Medusa is not the right choice

  • No developer on the team. Medusa's digital delivery is code you add. Shopify with its Digital Products app gets you a working mixed store without code.
  • Digital only, and you want someone else to own global tax. Lemon Squeezy or Paddle as a merchant of record removes VAT registration and filing work that Medusa leaves with you.
  • A handful of downloads and no plans to customize. The setup work in the tutorial is larger than the problem.

Common questions

Can Lemon Squeezy or Paddle sell physical products?

No. As of October 2026, Lemon Squeezy lists physical goods of any kind as prohibited, and Paddle lists physical products as prohibited. A store that sells templates and prints together needs a platform that supports shipping, such as Medusa or Shopify.

Does Medusa support digital products out of the box?

Not as a core module. Medusa provides a Digital Products recipe and a step-by-step tutorial with example code that adds a digital product module, private file storage, a digital fulfillment provider, and a customer downloads page.

Where does Medusa store downloadable files?

Medusa stores files through its File Module. For production, the docs recommend the S3 File Module Provider, which works with AWS S3 and S3-compatible storage and returns presigned download URLs for files.

Do download links from Medusa expire?

With the S3 File Module Provider, yes. The File Module returns presigned URLs whose lifetime is set by the provider's download_file_duration option, which defaults to 3600 seconds.