---
title: "How do I sell digital and physical products in one checkout?"
description: "Sell digital templates, courses, and physical prints in one Medusa checkout: how mixed carts ship, how digital items auto-fulfill, and how it compares."
url: https://medusajs.com/kb/digital-products/digital-and-physical-products-one-checkout
last_updated: 2026-10-29T06:55:50Z
topic: "digital-products"
type: "concept"
applies_to: "Medusa v2.x (multiple shipping methods per request since v2.16.0)"
related:
  - "https://medusajs.com/kb/digital-products/merchant-of-record-vs-own-store.md"
  - "https://medusajs.com/kb/digital-products/license-keys-download-links.md"
  - "https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md"
  - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md"
sources:
  - "https://docs.medusajs.com/resources/recipes/digital-products"
  - "https://docs.medusajs.com/resources/recipes/digital-products/examples/standard"
  - "https://docs.medusajs.com/resources/commerce-modules/product/selling-products"
  - "https://docs.medusajs.com/resources/storefront-development/checkout/shipping"
  - "https://docs.medusajs.com/resources/commerce-modules/cart/concepts"
  - "https://docs.medusajs.com/resources/commerce-modules/fulfillment/shipping-option"
  - "https://docs.medusajs.com/resources/infrastructure-modules/file"
  - "https://docs.medusajs.com/resources/infrastructure-modules/file/s3"
  - "https://www.lemonsqueezy.com/pricing"
  - "https://docs.lemonsqueezy.com/help/getting-started/prohibited-products"
  - "https://www.paddle.com/pricing"
  - "https://www.paddle.com/help/start/intro-to-paddle/what-am-i-not-allowed-to-sell-on-paddle"
  - "https://apps.shopify.com/digital-downloads"
  - "https://help.shopify.com/en/manual/products/digital-service-product/digital-downloads"
  - "https://medusajs.com/pricing.md"
---

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

> 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 `requires_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](https://docs.medusajs.com/resources/recipes/digital-products/examples/standard) splits the order after checkout:

1. A custom route, `POST /store/carts/{id}/complete-digital`, runs Medusa's `completeCartWorkflow`, 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 `digital_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.

| Piece | What it does | Status |
| --- | --- | --- |
| Cart, payment, tax, promotions | One checkout for all items | Native |
| Shipping profiles and options | Carrier rates for prints | Native |
| Digital Product Module | Data models for digital products, their files, and digital orders, linked to product variants | Official guide |
| File Module with the S3 provider | Stores paid files as private and previews as public | Native |
| Digital fulfillment provider | Fulfills digital items without shipping | Official guide |
| Download email | Sends links through a Notification Module provider | Official guide |
| My downloads page | Customer-only page in the Next.js Starter Storefront | Official guide |
| Course access, license keys | Gate lessons or issue keys after purchase | Custom |

## 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 `retrieveFile`, which returns presigned URLs. The S3 provider's `download_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.

| Option | Physical prints in the same order | Digital delivery | Platform fee |
| --- | --- | --- | --- |
| Lemon Squeezy | No, physical goods are prohibited | Built in | 5% + 50¢ per transaction |
| Paddle | No, physical products are prohibited | Built for software sellers | 5% + 50¢ per checkout transaction |
| Shopify | Yes | Free Shopify Digital Products app, up to 50 files and 5 GB per variant | Shopify plan pricing |
| Medusa | Yes | Official guide you build on | 0% 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.

## Documentation

- [Digital Products tutorial](https://docs.medusajs.com/resources/recipes/digital-products/examples/standard)
- [Digital Products recipe](https://docs.medusajs.com/resources/recipes/digital-products)
- [Checkout: adding multiple shipping methods](https://docs.medusajs.com/resources/storefront-development/checkout/shipping)
- [S3 File Module Provider](https://docs.medusajs.com/resources/infrastructure-modules/file/s3)

## Related

- [Merchant of record or your own store for digital products?](https://medusajs.com/kb/digital-products/merchant-of-record-vs-own-store.md)
- [How to add license keys and secure download links](https://medusajs.com/kb/digital-products/license-keys-download-links.md)
- [Should I use Shopify or build a custom store?](https://medusajs.com/kb/build-vs-buy/shopify-vs-custom-store.md)
- [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md)
