Hosted · MoR · creator platform

Migrate from Gumroad to DashCommerce

Difficulty
Moderate — plan a week
Timeline
2-4 weeks for a typical creator catalog
Data loss risk
Low for catalog · Medium for active subscribers

Who this migration is for

This guide is for creators who have outgrown Gumroad. That’s a narrower population than the internet suggests.

If you’re a solo creator doing less than roughly $10,000/month in revenue, DashCommerce is probably not worth it. Gumroad’s 10% fee on that volume is $1,000/month — real money, but almost certainly less than the time-cost of running your own commerce stack, handling international tax, managing Stripe webhooks, and chasing down edge cases when a customer’s download link expires wrong. Gumroad is selling operational simplicity and Merchant-of-Record protection. Both are genuinely valuable. If you’re reading this guide because you feel some general dissatisfaction with Gumroad, stop reading and go ship your next product. Gumroad is fine.

If you’re above that threshold and the 10% fee is starting to sting; if you want a custom checkout design Gumroad’s hosted flow can’t give you; if you need source control because you’re building a real brand rather than a product page; if you have engineering help (your own or hired); if you want to own the stack — keep reading. This guide was written for you.

What Gumroad is really selling

Three things, packaged together.

Hosted simplicity. One login. No infrastructure. The checkout works. File delivery works. Receipts go out. Refunds fire. None of these are trivial to build or operate, and Gumroad handles all of them invisibly.

Merchant of Record globally. This is the big one, and it’s underappreciated. Gumroad is the legal seller on every transaction. When a customer in Germany buys your ebook, Gumroad collects German VAT, remits it to the right authority, and issues a VAT-compliant invoice. When a customer in California buys, Gumroad handles California sales tax if thresholds are met. You don’t register anywhere, you don’t file anywhere, you don’t think about it. You just get a net payout.

Discover traffic. Gumroad’s internal network effect. Your product shows up in the Gumroad product feed, in category pages, in recommendations. For some creators this drives meaningful organic traffic; for others it’s noise. Check your Gumroad analytics honestly before deciding how much this matters to you.

All three go away when you leave. Price them in before you scope the migration.

What you’re leaving behind

Merchant of Record. You become the legal seller on every transaction the moment you cut over. Depending on your customer geography and volume, this may mean EU VAT registration, UK VAT registration, US state sales tax registrations, and GST registrations. Stripe Tax will calculate the right rate at checkout for roughly 0.5% of transactions, but the registrations, filings, and remittance are your responsibility.

Discover. Gumroad’s internal traffic network stops driving to you. Whatever fraction of your sales came from “someone browsing Gumroad found my product” is now zero. Replace it with SEO, audience channels, or paid acquisition.

Hosted infrastructure. No more “Gumroad sent the receipt.” Now your system has to send the receipt, and the download link has to not break, and the subscription renewal webhook has to fire and create the right database row. DashCommerce handles all of this in code — but it’s your code running on your hosting on your domain.

Zero ops. Gumroad charges 10% partly because they run a business so you don’t have to. Post-migration, you run that business.

The affiliate program. Gumroad’s built-in affiliates go away. Replace with Rewardful, Tolt, or similar connected to Stripe.

What you gain

Zero platform fee. You pay Stripe’s processing (2.9% + 30¢ in the US) and nothing to DashCommerce. On $10,000/month in revenue, that’s roughly $700/month back in your pocket; on $100,000/month, $7,000/month. At some point this pays for an engineer’s time, which is when the math of leaving starts to work.

Design control. Your checkout, your product pages, your post-purchase flow — all your design, your brand, your copy. Gumroad’s hosted checkout is good but it’s Gumroad’s, not yours.

Source control. Every line of @dashcommerce/core is MIT on GitHub. Fork it, audit it, extend it. If you need behavior Gumroad won’t build, you build it.

Integration with your content. DashCommerce lives inside your EmDash CMS project. Your blog, your courses, your landing pages, and your product catalog share a content model and a frontend. No more embedding Gumroad widgets into a separate WordPress blog.

Edge-native deployment. Cloudflare Workers, Vercel, Netlify, or any Astro-capable host. Fast everywhere, scales without drama.

Customer data ownership. Email addresses, purchase history, subscription state — all in your database. You export them whenever you want, in whatever shape you want.

The MoR problem

This deserves its own section because it’s the single most underestimated cost of leaving Gumroad.

When Gumroad is Merchant of Record, the transaction looks like this to tax authorities: the customer bought from Gumroad. Gumroad collected the tax. Gumroad remitted the tax. You received a net payout from Gumroad, not from the customer. Your tax obligation is essentially “report the payout as income on your home-country tax return.” Simple.

When you’re the Merchant of Record, the transaction looks like this: the customer bought from you. You collected the tax (or should have). You remit the tax. You are the registered taxpayer in every jurisdiction where you have nexus.

The thresholds matter. EU VAT applies to all digital sales to EU consumers from outside the EU, regardless of volume — there is no de minimis for digital goods under the EU’s OSS scheme. UK VAT applies to digital sales above £85,000 in UK-located revenue, but you may be required to register from the first sale depending on scheme choice. US state sales tax varies by state — economic nexus thresholds start at $100,000 in some states and lower in others. GST applies in Australia, Canada, New Zealand, and a growing list of other countries for digital services sold to local consumers.

Stripe Tax will calculate the correct tax rate at checkout and record it per transaction. It does not register you anywhere, file returns for you, or remit on your behalf. Those remain your responsibility.

Talk to an accountant who specializes in digital goods and international tax before cutover — not after. This is the single biggest reason not to leave Gumroad if you’re small; the operational cost of being your own MoR can easily exceed the 10% fee you were trying to save.

Migrating the catalog

The catalog migration itself is the easy part. Export from Gumroad’s API or dashboard. Transform the JSON into the shape @dashcommerce/core expects. Feed it through dashcommerce-merge-seed.

Most Gumroad products map directly to DashCommerce’s digital-download product type — title, description, price, currency, file. Memberships and recurring products map to subscription with Stripe billing intervals. Bundles map to multi-product subscription records. Variants (different license tiers for software, different edition types for ebooks) map to DashCommerce variants.

The edge cases: pay-what-you-want pricing (DashCommerce supports a minimum price with optional overpayment), license-key generation (Gumroad has a built-in API; DashCommerce ships a webhook hook point where you generate and attach keys via your own code), custom fields on checkout (DashCommerce supports arbitrary form fields via the checkout configuration).

Start with five products as a dry-run. Confirm the admin shows them correctly, the storefront renders them, and test-mode checkout completes. Then run the full catalog import.

Migrating active subscriptions

This is the hardest part.

Gumroad’s active memberships are tokenized against Gumroad’s Stripe platform account. The saved payment methods, the subscription records, the cus_ and pm_ and sub_ IDs — they all live on Gumroad’s Stripe account, not yours. There is no cryptographic path to transfer them to your direct Stripe account; Stripe’s API does not permit this by design.

Your two real options:

Re-auth on first renewal. Import the subscriber list into DashCommerce with their email, membership tier, and next renewal date. When a subscriber’s renewal date approaches, send an email 7-14 days ahead: “We’re moving to a new billing system; please re-enter your card to continue your subscription.” Include a link to a DashCommerce-hosted payment page. Customers who re-auth continue their subscription cleanly. Customers who don’t re-auth silently churn. Expect 5-15% of subscribers to take the re-auth as a reason to cancel. This is real and you should factor it into your migration business case.

Dual-run through one billing cycle. Keep Gumroad memberships active for one more cycle. Existing members renew on Gumroad one more time. New signups go to DashCommerce. At each member’s next renewal, re-auth them onto your system. This doubles operational overhead for a month but smooths the churn hit.

Most creators combine both. Do not promise subscribers “seamless transition” — it isn’t seamless, and saying otherwise damages trust when the re-auth email arrives.

Keeping file delivery secure

DashCommerce’s digital-download product type serves files the same way Gumroad does: signed URLs with a short TTL.

The flow after purchase: webhook from Stripe confirms payment, DashCommerce generates a signed download URL tied to the customer and file, the URL is emailed and also available in the customer account portal, the URL expires after the configured TTL (default is 24 hours), and clicks after expiration regenerate a fresh URL via the portal.

Storage backend is configurable. For most creators Cloudflare R2 (cheap, zero egress fees) or AWS S3 (mature, well-supported) is the right choice. Re-upload each Gumroad-hosted file to your storage backend during migration and update the corresponding DashCommerce product record. Do not hotlink Gumroad’s URLs — they’re scoped to Gumroad’s auth and will break the moment your account status changes.

Test this end-to-end in staging before cutover: buy a product in Stripe test mode, confirm the email delivers, confirm the link downloads the file, confirm the link expires on schedule, confirm the portal regenerates.

SEO and existing buyer access

You have two SEO realities to plan for.

URLs you can control. If you used a custom domain pointed at Gumroad, reclaim it for DashCommerce and pre-stage 301 redirects from every old path (typically /l/{slug}) to the new DashCommerce product URL. Encode redirects at the edge — Cloudflare Workers routes, Vercel rewrites, Netlify _redirects — not in Astro middleware. Keep redirects in place for at least 12 months.

URLs you can’t control. Links to gumroad.com/{creator} and gumroad.com/l/{slug} stay on Gumroad’s domain and resolve to Gumroad’s pages. When your product is set to “not for sale,” Gumroad shows a basic landing page noting the product is unavailable; they do not redirect to you. The practical plan: email your full customer list before cutover announcing the move, pin a notice on your social channels, update every backlink you can reach, and accept that some cold inbound traffic from old links will go to a Gumroad dead-end. Over time Google reconsolidates search authority to your new domain as you build inbound links.

Existing buyer access. Keep your Gumroad account active for at least 90 days after cutover so customers who bought via Gumroad can re-download from their Gumroad library. For longer-term access, export the customer list from Gumroad before cutover, import into DashCommerce with order records marked as “migrated,” and email everyone a link to claim access on your new system. Make the claim flow frictionless: email + matching purchase record = account created with access to their downloads.

When NOT to do this migration

  • You’re a solo creator under $10,000/month and Gumroad is working. The math doesn’t work; stay.
  • You don’t have engineering help and don’t want to become your own ops team. The operational overhead is real.
  • You’re unwilling to talk to an accountant about international tax registrations. The MoR problem is not optional; it’s the single biggest post-cutover liability.
  • Discover traffic is a meaningful fraction of your sales and you don’t have a plan to replace it. Inventory this honestly.
  • You’re mid-launch or mid-promotion cycle. Do not migrate during a marketing push; migrate during a quiet month.
  • You want to save the 10% fee and have no other reason. Fee-savings alone rarely justify the migration for small creators; you’ll save money on fees and lose more on the time spent.
  • You’d rather ship your next product than spend three weeks on commerce infrastructure. This is usually the correct instinct. The best migration is the one you don’t have to do.
Migration plan

Order of operations

  1. 01

    Decide if you actually need to leave

    Before anything else, answer one question honestly: are you leaving Gumroad because it's limiting your business, or because you've read a Twitter thread that made you feel like you should be? Gumroad's value proposition is operational simplicity — hosted checkout, Merchant-of-Record tax handling, Discover traffic, one login, zero infrastructure. If you're a solo creator selling under roughly $10,000/month, the 10% fee is real money but usually less than the hours you'd spend running your own commerce stack. DashCommerce is the right tool for creators who have outgrown the platform, not for creators who resent paying for something that works. Write down what specifically is broken about Gumroad for you today — fees at volume, checkout design constraints, admin friction, lack of source control — and confirm the answer isn't 'nothing, really.' If it is nothing really, stay.

  2. 02

    Audit your Gumroad catalog

    Log into Gumroad and list everything: every product, every variant or tier, every membership plan with its price point and billing interval, every bundle, every hosted file with its current URL. Note which products rely on Gumroad-specific features you'd have to rebuild — Discover listing, the built-in affiliate program, pay-what-you-want pricing, license keys generated via Gumroad's API. For each membership tier, count active subscribers and note their renewal dates. This audit determines both scope and cutover timing; you want to migrate during a week with few renewals, not during a peak billing window.

  3. 03

    Scaffold DashCommerce + EmDash

    Stand up an EmDash project on a staging subdomain while your Gumroad store continues serving production traffic. Run `npm create @dashcommerce@latest` inside the EmDash project root. The scaffolder installs `@dashcommerce/core` (v0.1.3, MIT), the `@dashcommerce/starter` reference storefront, and `dashcommerce-merge-seed` for data imports. Pick an edge deploy target early — Cloudflare Workers, Vercel, or Netlify. Confirm the default storefront renders and the React admin is reachable. Do not point DNS at anything yet; everything happens on the staging subdomain until cutover.

  4. 04

    Export from Gumroad

    Gumroad offers two export paths: the dashboard CSV export (Products, Customers, Sales pages each have an export link) and the Gumroad API. For catalogs of 50+ products, the API is cleaner — it returns structured JSON with variants, price points, file URLs, and membership tier data. Dump everything to versioned JSON before transforming. Include products, customers, transaction history, and active subscription/membership records with their current billing period end dates. Never transform during export; always export raw, then transform in a separate step so you can re-run transforms without re-pulling data.

  5. 05

    Import catalog via dashcommerce-merge-seed

    Transform your exported Gumroad JSON into the shape `@dashcommerce/core` expects — product type, variants, price per currency, SKU, inventory, description, slug. Most Gumroad products map cleanly to DashCommerce's `digital-download` product type; memberships map to the `subscription` product type with Stripe intervals. Pipe the transformed JSON through `dashcommerce-merge-seed`. The CLI is idempotent, so re-run it as often as you need during development without duplicating rows. Start with five products as a dry-run before trying the full catalog; pay-what-you-want pricing and custom fields are the most common transform bugs.

  6. 06

    Upload digital files and wire signed downloads

    Gumroad hosts your files and serves them via expiring URLs after purchase. DashCommerce does the same thing with a slightly different mechanism: files are stored on your configured storage backend (R2, S3, or filesystem) and delivery links are generated as signed tokens with a short TTL. Re-upload each file to your storage bucket, update the `file` field on the corresponding DashCommerce product record, and confirm the post-purchase download email resolves to a signed URL that expires as expected. Do not attempt to hotlink Gumroad's CDN URLs from DashCommerce — they're scoped to Gumroad's auth and will break.

  7. 07

    Set up Stripe and decide your tax strategy

    This is the step most creators underestimate. Gumroad was your Merchant of Record: Gumroad collected and remitted VAT, US sales tax, and GST worldwide as the seller on record. DashCommerce is not a Merchant of Record. You are. Connect your own direct Stripe account (`sk_live_*` and `pk_live_*` issued to you, not to any platform). Decide how to handle tax: Stripe Tax will calculate the correct tax rate per transaction for around 0.5% of transaction volume, but you remain legally the seller and the registered taxpayer. For EU VAT, UK VAT, US state sales tax, and GST jurisdictions, you may need local registrations. Consult an accountant before cutover, not after.

  8. 08

    Plan subscription migration carefully

    Active Gumroad memberships are tokenized against Gumroad's Stripe platform account, not yours. The tokens cannot be transferred verbatim to your direct Stripe account. Two realistic options: (a) accept that members will re-authorize payment methods on first renewal after cutover, communicate the change 7-14 days ahead via email and an in-portal banner, and expect a 5-15% retention dip; (b) dual-run both systems through one full billing cycle — let existing members renew one more time on Gumroad, and sign up new members on DashCommerce. Most creators combine both. Do not promise 'your subscription will continue seamlessly' — it will not, and saying so erodes trust when the re-auth email arrives.

  9. 09

    Redirect old Gumroad links

    Your Gumroad URLs today are `gumroad.com/l/{slug}` or `{creator}.gumroad.com/l/{slug}` or, if you used a custom domain, `{yourdomain}/l/{slug}`. You cannot redirect `gumroad.com` URLs — that's Gumroad's domain. If you used a custom domain pointed at Gumroad, reclaim it and pre-stage 301 redirects from every old path to the new DashCommerce product URL before DNS cutover. Encode redirects at the edge (Cloudflare Workers routes, Vercel rewrites, Netlify `_redirects`), not in Astro middleware. Keep redirects in place for at least 12 months. For the `gumroad.com/{creator}` URLs you can't control, post a pinned link on your social channels, email your customer list, and update every backlink you can reach.

  10. 10

    Cut over and monitor

    Cutover is DNS change plus a Gumroad setting change — set each Gumroad product to 'not for sale' (don't delete them; existing customers may need to re-download). Stripe webhooks should already be pointed at your DashCommerce endpoint from staging testing. Monitor the first 72 hours: download email delivery, receipt emails, subscription renewal webhooks, and any support tickets about missing files or broken links. Keep your Gumroad account active for at least 90 days post-cutover for support lookups and existing-customer download access.

FAQ

Migrating from Gumroad — FAQ

Should a solo creator actually do this migration?
Probably not, if you're under roughly $10,000/month in revenue. Gumroad's 10% fee on that volume is $1,000/month — real money, but almost certainly less than the time-cost of running your own commerce stack, handling tax registrations in multiple jurisdictions, managing Stripe webhooks, and debugging edge cases on your own. Gumroad sells operational simplicity and Merchant-of-Record protection, and for a solo creator those are legitimately worth paying for. DashCommerce makes sense when you've outgrown Gumroad — you want a custom checkout, you're hitting platform-fee pain at scale, you want source control, you have (or can hire) engineering help. Below that threshold, the honest recommendation is to stay on Gumroad and get back to making things.
What about tax — Gumroad was Merchant of Record for me?
You are the seller now. Gumroad's MoR setup meant Gumroad was the legal seller on every transaction and handled VAT, GST, and US sales tax worldwide on your behalf. DashCommerce is software you install into your own site; it is not a Merchant of Record. Stripe Tax (around 0.5% of transactions) will calculate the correct tax rate per sale, but you are the registered taxpayer. Depending on where your customers live and your annual volume into each jurisdiction, you may need EU VAT registration, UK VAT registration, US state sales tax registrations, and GST registrations. This is the single biggest operational cost of leaving Gumroad and the reason the migration is not worth it for smaller creators. Talk to an accountant who understands digital goods before you cut over.
Can I keep my gumroad.com/creator URL working?
No. `gumroad.com` is Gumroad's domain and you have no control over its routing. Existing inbound links to `gumroad.com/{creator}` or `gumroad.com/l/{slug}` will continue to resolve to Gumroad's own pages unless Gumroad agrees to redirect them, which they do not. If you used a custom domain pointed at Gumroad, you can reclaim it and pre-stage 301 redirects to your new DashCommerce URLs. For the Gumroad-hosted URLs themselves, plan for social announcements, an email to your customer list, and manual outreach to update backlinks you can reach. Accept that some old inbound links will go to a Gumroad page saying the product is no longer for sale.
Does DashCommerce support the same file-delivery model as Gumroad?
Yes. DashCommerce's `digital-download` product type serves files via signed tokens with a configurable TTL — functionally the same pattern Gumroad uses. After purchase, the customer receives an email with a signed download URL that expires; if they click it after expiration, the customer portal regenerates a fresh signed URL on demand. Files live on your configured storage backend (Cloudflare R2, AWS S3, or local filesystem) rather than Gumroad's CDN. Re-upload your files during migration and point each DashCommerce product record at the new storage path. This part is typically the easiest step of the migration.
How do I migrate active subscribers?
Active Gumroad memberships are tokenized against Gumroad's Stripe platform account, not your direct Stripe account. There is no cryptographic way to transfer saved payment methods from one Stripe account to another — Stripe does not permit this by design. Your options are (a) re-auth: customers enter their card again on first renewal after cutover, which you communicate 7-14 days ahead and which typically costs 5-15% of subscribers who take it as a reason to cancel; (b) dual-run: keep Gumroad memberships renewing one more cycle while new signups go to DashCommerce, then migrate at each member's next renewal via re-auth. Most creators combine both. Do not claim the transition will be invisible — it will not be, and promising otherwise damages trust.
Will Gumroad's Discover traffic transfer?
No. Gumroad Discover is a network effect that only exists on gumroad.com. When you leave, you lose whatever organic traffic Discover was sending you. For some creators this is a meaningful loss — Gumroad's product feed can drive discovery you're not paying for. Inventory that traffic honestly before you migrate. If Discover is a significant fraction of your sales, your migration business case needs to account for replacing it through SEO, paid acquisition, or your own audience channels. For many creators Discover sends a trickle, not a river, and the loss is minor — check your Gumroad analytics before deciding.
What about Gumroad's affiliate program?
Gumroad ships a built-in affiliate program where your customers can share a link and earn a percentage. DashCommerce does not have a built-in affiliate system. The typical replacement is Rewardful or Tolt connected to your Stripe account — both are affiliate-tracking SaaS products that hook into Stripe webhooks to attribute purchases and handle payouts. Budget a few hours to set up and roughly 1-2% of affiliate-driven transactions as an ongoing cost. If affiliates drive meaningful revenue for you today, include this in your migration scope rather than discovering it post-cutover.
Is this worth the effort?
It depends. Worth it if: you're over $10K/month and the 10% fee is measurable pain; you want a custom checkout design Gumroad's hosted flow can't give you; you need source control for audit, compliance, or because you want to fork your own stack; you run (or can hire) engineering; you're building a brand, not a product page. Not worth it if: you're a solo creator happy with Gumroad's simplicity; you don't want to think about tax; you'd rather spend this month writing a new course than configuring Stripe webhooks; the 10% fee is less than the time you'd spend on ops. There is no shame in staying. The best migration is the one you don't have to do.
Try it

Start the migration today.

Scaffold a DashCommerce project, test the checkout in Stripe sandbox, then cut over gumroad when you're confident.

on npm · npm create @dashcommerce@latest