# How to Sell Digital Downloads: Delivery Mechanics

> The operational guide to selling digital downloads: packaging files, expiring links, license keys, VAT on digital goods, refunds, and failed-delivery recovery.
- **Author**: Deepak Jangir
- **Published**: 2026-09-19
- **Category**: Digital Products, Payments
- **URL**: https://dodopayments.com/blogs/en/sell-digital-downloads

---

The first support ticket almost every digital seller receives is some version of "my download link doesn't work." The second is "I paid but never got the email." Neither is a marketing problem or a pricing problem. They are fulfilment problems, and they are what actually determines whether selling digital downloads is a business or a part-time helpdesk job.

To sell digital downloads properly you need five things working together: a packaged file that is safe to hand over, hosting that serves it without exposing your storage, a delivery link that expires but can always be regenerated, a tax treatment that matches the buyer's country, and a refund policy written for goods that cannot be returned. This guide covers each one as an operational mechanism rather than a concept.

This is deliberately not a "what should I sell" or "where should I sell" article. If you are still choosing a product, start with our roundup of [digital products to sell online](https://dodopayments.com/blogs/digital-products-to-sell). If you have the product and are choosing a checkout, compare the options in [best platforms to sell digital products](https://dodopayments.com/blogs/best-platform-sell-digital-products). This article picks up after both decisions: what happens between a successful payment and a customer holding your file.

## Four Ways to Deliver a Digital Download

Every delivery method is a trade-off between convenience and control. Picking the wrong one is the root cause of most piracy and support complaints.

| Delivery model | How it works | Revocable after refund? | Best for |
| :------------- | :----------- | :---------------------- | :------- |
| Hosted file + expiring link | Platform stores the file, mints a short-lived signed URL per request | No, once downloaded | Ebooks, templates, presets, design assets |
| External URL | Link points to your own storage or drive | Only if you gate it yourself | Large files, video courses, multi-GB datasets |
| License key | Buyer receives a key your software validates at runtime | Yes | Desktop apps, plugins, CLIs, paid extensions |
| Account-gated access | Buyer logs into your app; content never leaves your server | Yes | Course platforms, member libraries, SaaS tools |

The important column is the third one. A file that has been downloaded is gone. If your product needs to stop working after a refund or a chargeback, a raw file download cannot enforce that on its own, and you need to pair it with a key or an account.

## What Happens Between Payment and Download

A working fulfilment pipeline has four stages, and each one is a place where orders get lost.

1. The payment succeeds and the processor confirms it, not just the browser.
2. An entitlement is created that links the buyer to the product they bought.
3. A delivery artifact is issued: a signed download URL, a license key, or both.
4. The buyer is notified by email and can retrieve the artifact again later without contacting you.

Stage four is the one most homegrown setups skip. If the only copy of the download link lives in an email that expires, every expired link becomes a support ticket. Dodo Payments handles this with a [customer portal](https://docs.dodopayments.com/features/customer-portal) that mints fresh signed URLs on demand, so a buyer returning a month later gets a working link without you touching anything.

The other common failure is trusting the browser. If you release the download on the checkout success page alone, anyone who reaches that URL gets the file, and buyers who close the tab during redirect get nothing. Fulfilment should be triggered by a server-side payment event, which is what [webhooks](https://docs.dodopayments.com/developer-resources/webhooks) exist for.

## Preparing and Packaging Files for Sale

Package once, deliberately, before you ever list the product. Repackaging after launch means past buyers hold a different version than new ones.

- Bundle into a single archive where possible. One ZIP produces one support question; eleven loose files produce eleven.
- Include a plain-text README with install steps, version number, and your support email. This deflects a surprising share of tickets.
- Ship a license statement inside the archive stating what the buyer may and may not do with the file, especially for commercial use.
- Version the filename, not just the contents. `brand-kit-v2.3.zip` tells you and the buyer exactly what they have.
- Strip metadata you did not intend to ship, such as client names in design files or credentials in example config.

File size drives the hosting decision more than anything else. Platform-hosted delivery usually has a per-file ceiling, and Dodo Payments caps hosted uploads at 500 MiB. Anything larger, such as a video course or a full dataset, belongs on your own storage with an external URL attached to the product instead.

If you are packaging software rather than media, our guide to [digital product ideas for developers](https://dodopayments.com/blogs/digital-product-ideas-developers) covers how build artifacts, boilerplates, and extensions differ in packaging requirements.

## Secure File Hosting and Expiring Download Links

Never serve a digital download from a public, guessable URL. A static path like `/downloads/course.zip` will be found, indexed, and shared.

The standard mechanism is the presigned URL: a temporary, cryptographically signed link to private storage that stops working after a set window. The file itself is never publicly listable, and the link cannot be extended by the person holding it. Dodo's [digital product delivery](https://docs.dodopayments.com/features/digital-product-delivery) issues presigned URLs valid for roughly 15 minutes, refreshed on every fetch from the confirmation email or the portal.

Two rules follow from how presigned URLs work, and both are routinely misunderstood:

- Do not store the URL. Store the entitlement, and resolve a fresh URL when the customer asks for one. A saved URL is a dead URL.
- A presigned URL is unauthenticated inside its window. Anyone holding it during those minutes can download. Short windows limit the blast radius; they do not eliminate it.

For genuinely sensitive material, the stronger pattern is account-gated hosting where the request itself is authenticated, rather than a signed link to an open storage bucket.

Programmatically, resolving a customer's current download links looks like this:

```typescript
const grants = await client.entitlements.grants.list("ent_files_abc", {
  customer_id: "cus_abc123",
});

for (const grant of grants.items) {
  for (const file of grant.digital_product_delivery.files) {
    console.log(file.filename, file.download_url, `expires in ${file.expires_in}s`);
  }
}
```

## How to Stop Download Link Sharing and Piracy

Start from an honest premise: you cannot make a downloadable file unshareable. Once bytes are on a buyer's disk, they can be copied. What you can do is make casual sharing inconvenient enough that it stops being the path of least resistance, and make commercial redistribution legally clear-cut.

Controls that genuinely help:

- Short link expiry, so a link pasted into a public forum is dead within minutes.
- Download attempt caps per order, which stops one purchase from serving a whole community.
- Per-buyer watermarking on PDFs and media, embedding the purchaser's email or order ID in the artifact.
- An explicit licence file in the bundle, which turns redistribution into a documented breach rather than an ambiguity.
- Runtime validation for anything executable, covered in the next section.

Controls that mostly waste your time: DRM on ordinary documents, aggressive IP-based blocking that breaks for travelling and mobile buyers, and password-protected archives whose password travels alongside the file.

Piracy pressure also varies by distribution channel. Selling through your own storefront gives you more control than distributing through channels you do not own, which is part of the calculation in [selling digital goods outside the app store](https://dodopayments.com/blogs/digital-goods-outside-app-store).

## License Keys for Software Downloads

For software, the download is not the product. The right to run it is. That makes license keys the correct primitive, because a key can be checked, limited, and revoked long after the installer has been copied.

A workable licensing setup needs four decisions:

- Activation limit. One activation for single-user apps, three to five for team licences. Publish the number so buyers are not surprised.
- Expiry behaviour. Perpetual with a support window, or time-limited and renewable. These produce very different renewal mechanics.
- Validation point. Network-connected products should validate server-side rather than trust a cached local activation.
- Revocation path. When a refund or cancellation happens, the key must be disabled without shipping a new build.

Dodo's [license keys](https://docs.dodopayments.com/features/license-keys) expose activate, validate, and deactivate endpoints that are public and require no API key, so a desktop app or CLI can call them directly without embedding your API credentials in a binary that ships to customers. Revocation is driven by the same payment events as the rest of fulfilment, so a refunded order disables the key without manual cleanup.

License keys and file delivery are complementary rather than alternatives. The usual pattern for paid desktop software is to ship the installer as a hosted file and gate the actual features behind a key validated at startup.

## Automating Order Fulfilment

Manual fulfilment survives about thirty orders. After that, every sale you process by hand is a delivery you might forget at 2am.

The automation boundary is the webhook. Your system should react to server-confirmed events rather than user-facing redirects:

| Event | What fulfilment should do |
| :---- | :------------------------ |
| `payment.succeeded` | Issue the entitlement and send the delivery email |
| `refund.succeeded` | Revoke the grant so no new download URLs are minted |
| `subscription.active` | Grant access for the billing period |
| `subscription.cancelled` | Revoke access at the end of the paid term |
| `entitlement_grant.revoked` | Disable in-app features tied to the key |

Two implementation details matter more than the rest. Verify webhook signatures, because an unauthenticated fulfilment endpoint is a free-product endpoint. And make handlers idempotent, because delivery systems retry, and a retried `payment.succeeded` should not send a second key or a second email.

If you are wiring a checkout for the first time, our walkthroughs on [embedding a checkout widget](https://dodopayments.com/blogs/embed-checkout-widget-website) and [building a checkout page without code](https://dodopayments.com/blogs/build-checkout-page-no-code) cover the front-end side. For sellers moving off a single-gateway setup, [one-time payments without Stripe Checkout](https://dodopayments.com/blogs/one-time-payments-without-stripe-checkout) covers the alternatives.

## VAT and Sales Tax on Digital Downloads

Digital downloads are taxed where the buyer is, not where you are. That single rule is what makes selling downloads internationally harder than it looks, because it means a solo seller with buyers in thirty countries has potential obligations in thirty tax regimes.

The practical consequences:

- In the EU, VAT on electronically supplied services is charged at the customer's local rate from the first sale, with no domestic-style registration threshold for foreign sellers. Our [EU VAT guide](https://dodopayments.com/blogs/eu-vat-saas-guide-2026) and [VAT compliance for digital products](https://dodopayments.com/blogs/vat-compliance-digital-products) cover the registration mechanics.
- In the US, taxability of digital goods is decided state by state, and states disagree about whether a downloaded ebook is taxable at all. See [sales tax on digital goods by state](https://dodopayments.com/blogs/sales-tax-digital-goods-by-state) and [US sales tax for SaaS](https://dodopayments.com/blogs/us-sales-tax-saas).
- Many other jurisdictions run their own digital services tax regimes with their own registration rules and filing calendars.

There are two ways to deal with this. You register, collect, file, and remit yourself, which is viable if you sell in a small number of markets. Or you sell through a [merchant of record](https://dodopayments.com/blogs/what-is-a-merchant-of-record), which becomes the legal seller and assumes the tax liability on your behalf. Dodo Payments operates as a merchant of record and handles tax compliance in 190+ countries as part of the transaction fee rather than as a separate subscription. [Merchant of record for digital creators](https://dodopayments.com/blogs/merchant-of-record-digital-creator) walks through what that changes day to day.

Separately from tax, check whether your jurisdiction requires business registration to sell at all. [Do you need a business license to sell digital products](https://dodopayments.com/blogs/business-license-sell-digital-products) covers the common cases.

## Refund Policy for Files That Cannot Be Returned

A refund on a digital download is not a return. The buyer keeps the file. Your policy has to be written with that asymmetry acknowledged rather than pretended away.

What tends to work:

- State the window plainly, in days, on the product page and in the confirmation email.
- Refund on the merits, not on the file. Arguing that a customer still has the bytes does not win disputes and costs you goodwill.
- Pair refunds with revocation for anything revocable. Refunding a licensed app should disable the key, even though the installer stays on disk.
- Publish a clear support path before the refund path. Most refund requests for templates and courses are unresolved confusion, not regret.

The economics matter here. A processed refund costs $1 on Dodo Payments and returns the transaction fee handling to a clean state, while a chargeback costs $30 and counts against your dispute ratio regardless of whether you eventually win it. That gap is the entire argument for making refunds easy and visible. Our comparison of [chargebacks and refunds](https://dodopayments.com/blogs/chargeback-vs-refund) explains the difference, and [handling refunds and chargebacks as a solo founder](https://dodopayments.com/blogs/handle-refunds-chargebacks-solo-founder) covers the process at small scale. The [refunds documentation](https://docs.dodopayments.com/features/refunds) covers the API and dashboard flow.

## Handling Failed and Lost Deliveries

Deliveries fail routinely, and almost always for mundane reasons. Design for the four common ones rather than treating each as an incident.

- The email never arrived. Filters, typos, and corporate gateways account for most of these. A self-serve portal where the buyer can retrieve the order by email address removes you from the loop.
- The link expired. Expected behaviour, not a bug, provided regeneration is self-serve. If it is not, expiry is just a slow-motion support queue.
- The download broke mid-transfer. Common on large files and mobile connections. Allowing repeat downloads within the entitlement is the fix.
- The payment succeeded but no entitlement was created. This is the genuine failure, and it is usually a dropped or unverified webhook. Log every fulfilment event with its order ID so you can answer "did this buyer ever get a grant" in seconds.

Build the diagnostic before you need it. A simple internal lookup from email or order ID to entitlement status, grant history, and last delivery attempt turns a twenty-minute investigation into a ten-second answer.

## Where This Sits in Your Stack

Fulfilment tooling is usually bought, not built, because the hard parts are signed-URL infrastructure, key validation uptime, and tax registrations rather than application logic.

Dodo Payments includes storefront, license keys, and digital product delivery at no extra cost within its [Distribution](https://dodopayments.com/distribution) product, so delivery is not a separate line item on top of processing. Pricing is 4% + 40c for US domestic cards and wallets, with international transactions adding 1.5%, and no fixed monthly or setup fees. Full details are on the [pricing page](https://dodopayments.com/pricing).

If you are currently on a creator platform and weighing a move, the trade-offs are laid out in [Gumroad alternatives](https://dodopayments.com/blogs/gumroad-alternatives), [Payhip alternatives](https://dodopayments.com/blogs/payhip-alternatives), and [SendOwl alternatives](https://dodopayments.com/blogs/sendowl-alternatives). Sellers planning to host other creators' products should read [building a digital product marketplace](https://dodopayments.com/blogs/build-digital-product-marketplace), since multi-seller fulfilment adds payout and liability questions on top of everything here.

## FAQ

### How do I stop people from sharing my digital download links?

Use short-lived presigned URLs so a shared link dies within minutes, cap download attempts per order, and watermark PDFs or media with the buyer's email or order ID. For software, ship a license key validated at runtime instead of relying on the file itself, since a downloaded file can always be copied.

### Do I have to charge VAT on digital downloads sold internationally?

Usually yes, at the buyer's local rate, and in the EU there is no foreign-seller threshold before the obligation starts. You can register and file in each jurisdiction yourself, or sell through a merchant of record such as Dodo Payments, which becomes the legal seller and handles tax compliance in 190+ countries.

### What should I do when a customer says their download link expired?

Treat it as normal rather than exceptional and make regeneration self-serve. A customer portal that mints a fresh presigned URL on demand solves it without your involvement, which is why the portal, not the confirmation email, should be the canonical place a buyer retrieves their files.

### Should I offer refunds on digital downloads if the buyer keeps the file?

Yes, in most cases. A refund costs $1 on Dodo Payments while a chargeback costs $30 and counts against your dispute ratio regardless of outcome, so a visible refund path is cheaper than a contested one. For revocable products, pair the refund with license key revocation so in-app access ends even though the installer remains on disk.

### Do I need license keys if I only sell templates and ebooks?

No. License keys matter when something must be validated or revoked at runtime, which applies to software rather than static files. For templates, ebooks, and design assets, expiring links plus a clear licence statement in the bundle covers the realistic threat model.

## Conclusion

Selling digital downloads well comes down to treating fulfilment as a system rather than an afterthought. Package the file once and version it, serve it from private storage behind expiring links, give buyers a self-serve way to fetch those links again, drive every grant and revocation from server-confirmed payment events, and decide early whether you are registering for tax yourself or selling through a merchant of record.

Get those five right and the support load stays near zero as volume grows. Get them wrong and every additional sale adds a little more manual work, which is the one thing digital products were supposed to avoid.
---
- [More Digital Products articles](https://dodopayments.com/blogs/category/digital-products)
- [All articles](https://dodopayments.com/blogs)