In the latest episode of Core Intuition, Daniel Jalkut talks about switching from PayPal to Stripe as the payment method for his Mac app MarsEdit. This sparked a discussion on the corresponding Slack team about the pros and cons of different ways to handle selling your digital products.

European VAT rules, accounting and other distractions make this harder than you think!

In this article, I will outline the common payment options for digital products and their individual advantages and disadvantages. This is from the perspective of a Mac developer, but apart from the licensing aspect, it applies to all other digital products as well, including SaaS subscriptions and online courses.

Note that I am neither a lawyer nor an accountant; these are just my personal recommendations.

Having people send you cash or checks in the mail

Fees: None (I guess)

This used to be the state of the art in accepting payments — in 1992.
In 2017, it is the fastest way to kill your business.


  • That warm, fuzzy feeling when someone really goes through the hassle of putting cash in an envelope with postage and going to the post office, just to buy your software.
  • No third-party dependencies (other than your local mail provider).


  • Everything else. Let’s move on.

Having people send you money via PayPal or Stripe

Fees: 2.9 % + 30 ¢/transaction (Stripe, PayPal, Braintree)

You could either just have a PayPal “send me money” link on your website, or create a payment form with an automated process that delivers your license code.

This might be the option that naturally comes to mind, but keep in mind that you are still responsible for creating proper invoices and charging (and deducting) VAT in countries that charge it, including about all EU countries — which also charge varying VAT rates per country.

If you are based in the US, you might get away with ignoring the EU’s VAT rules altogether, but I don’t recommend that. You would be in good company there — looks like Panic and The Omni Group have just that approach — but I still don’t recommend it. (I’m German. We really like to avoid risks.)


  • The cheapest way to accept payments online.
  • Just one dependency that is also easy to switch out in case you need to.


  • You are responsible for proper handling of VAT, which is a mess. Read this article if you’d like to learn more.
  • You’d also be responsible for creating proper invoices and accounting for your payments. You might get away in just booking the lump sums sent to you every month by Strip/Paypal/Braintree, but in some cases you might need to have every individual transaction in your books. If unsure, talk to an accountant.
  • You also need to implement the whole licensing system yourself. This can be a lot of work. (See the bottom of the article for some pointers on how to deal with that.)
  • In the case of PayPal: You have to deal with PayPal, which is a terrible company (Source, Source).

Having people send you money via Stripe, but letting someone else deal with that whole VAT mess

Fees: 2.9 % + 30 ¢/transaction (Stripe) plus $31/month (Taxamo), $31/month (Octobat) or €29/month (Quaderno)

If you ask me, this is a much better approach. VAT is such a complex matter that it’s really hard to get right, and as with all taxes it is something you don’t want to mess up. With some services (such as Quaderno), you might also have some of the accounting and invoicing done for you.


  • Much less work in terms of VAT/invoicing/accounting.


  • You probably still need to sign up for an EU VAT ID and file your VATMOSS return yourself. (Not 100% sure about that, though.)
  • You now need to manage two services.
  • Slightly more expensive.
  • Still have to deal with licensing yourself. (Again, see the bottom of the article for some pointers on how to deal with that.)

Having a reseller handle payments, invoicing and VAT for you — but with your own licensing system

Fees: 5 % + 50 ¢/transaction (Paddle, affiliate link), slightly more with FastSpring, $10/month plus 3.5 % + 30 ¢/transaction (Gumroad)

In this case, your reseller acts as your Merchant of Record. This means that they are the actual business taking your customers payment, and thus responsible for creating a proper invoice, dealing with VAT, and so on. At the end of the month, you just get a nice lump sum transferred into your bank account, which also makes your accounting easier.

This is actually the option I use: I use Paddle, which lets me avoid dealing with all the payment stuff, and combine it with a completely homegrown licensing system. That way, I retain full flexibility in terms of pricing, discounts and licensing. I can offer paid upgrades, limited-time licenses and whatever else the business requires. And in case there’s a problem with one reseller, it is still fairly easy to switch to another one as just the payment-handling part (but not the licensing) is affected.

To be honest, Paddle isn’t terrific, either. Their checkout process looks nice and is very straightforward, but they have been slow in implementing new features and there are a few edge cases I’d like to have handled differently. I’d say they definitely are the service that sucks the least, though 😉 FastSpring is fairly similar to their service, though, but costs a bit more. (Their pricing page no longer shows their pricing, but it used to be around either 8.9 % or 5.9 % + 95 ¢/transaction).

Gumroad might look like the cheapest option, but keep in mind that their service was not built for selling Mac apps or subscriptions. So while it might be possible to make these work with Gumroad, you’ll likely have to jump through more hoops than with Paddle or FastSpring to accomplish the same goals.


  • VAT, invoicing, accounting all done for you.
  • You are still able to switch resellers, as you are not locked into a particular licensing system.


  • Still more expensive, but I’d say it’s worth it.
  • Still have to deal with licensing yourself. (See below for tips…)

Using a reseller and their existing licensing system

Fees: Same as above — 5 % + 50 ¢ (Paddle)

This is the most convenient option, most similar to the Mac App Store. Just plug in an SDK and have that deal with all payment and licensing issues.

For example, the reseller Paddle also offers an SDK to handle licensing for you. To be honest, I tried to use their system but found their licensing system way too inflexible for my needs (unless you replace most parts with your own, custom solution, in which case you could just build the whole thing yourself).

However, you could also use a third-party licensing system such as DevMate. In fact, DevMate was recently acquired by Paddle. Given that DevMate was originally developed by the great people at MacPaw, makers of the Setapp service), I would imagine their system to be in much better shape than the original Paddle SDK.

However, in either case you are locked fairly tightly to a specific reseller when you use their licensing system. DevMate might still be compatible with FastSpring, but I would still be a bit worried in case you’d ever want to switch resellers or migrate to a different licensing system.


  • Very easy and worry-free, almost drop-in.
  • VAT, invoicing, accounting all done for you.
  • No need to worry about licensing, either.


  • Fairly tight lock-in. Switching to a different reseller (and a different licensing system) would be painful.

These are the payment options that I could think of. I went with a combination of Paddle for payments, invoicing and VAT handling plus my own, homegrown, licensing system.

For most Mac developers, it would be wise to combine a reseller such as Paddle or FastSpring with an open source licensing system such as CocoaFob (also see my Python-based CocoaFob license generator and server) or Aquatic Prime. Both are fairly easy to integrate. This lets you avoid worrying about all the payment problems, while retaining full control of the licensing system. (Alternatively, my friend Christian Tietze wrote a book on how to sell your Mac app with FastSpring.)

What payment and licensing systems do you use? Are there any points I missed? Let me know with a tweet to @daniel_a_a!