a question answered, a sale keptthe chat needs no cookie bannerunlimited teammatesreply from slack, discord or our phone app

/blog / stories

why we sell through paddle

· by seba · 5 min read

A long white receipt with the word VAT printed at the bottom, next to the green Spookat ghost cat on a light grid.

Spookat sells through Paddle. Paddle is our merchant of record: when you buy a plan, you buy it from Paddle, and Paddle deals with sales tax, invoices, refunds and payment methods. It costs us more per sale than a plain payment processor would. This post explains why two people selling a small monthly plan to the whole internet took that deal, what we gave up for it, and how we wired it so it never touches your site.

two ways to take money

With a payment processor, you are the seller. The processor moves the money from the card to your account. Everything else is yours: which tax to charge in which country, registering for it, filing it, issuing invoices that each country accepts, handling refunds and chargebacks.

With a merchant of record, somebody else is the seller. The merchant of record buys the product from you and resells it to the customer. Its name is on the invoice and on the card statement. The tax on that sale is its job.

Both are legitimate. They fit different companies.

the problem we had

Spookat is a small monthly plan, $4.99 a site on broke af, sold to anyone with a website. A freelancer in Lisbon, a shop in Kraków, a SaaS founder in Austin. Some are companies, some are people buying for a side project.

Selling a digital service across borders comes with tax rules that depend on where the buyer is and whether they’re a business. The EU alone has its own VAT rate in each member country. Other places have their own systems. Each rule is reasonable on its own. Put together, they add up to a part-time job, and on a plan that costs less than a kebab, that job eats the margin.

We’re two people. One builds, one does marketing and everything that isn’t code. Neither of us wanted “tax operations” to become the third job. That settled it faster than any feature comparison.

why not a processor plus a tax tool

We looked at that route. There are good tools that calculate the right tax for every checkout.

Calculating is the easy part, though. The hard part is being the seller of record everywhere you sell. Getting the number right still leaves the registrations, the filings and the letters addressed to you. A tool can help you do that job. It doesn’t take the job away.

A merchant of record does. For our size, that was the whole point.

We compared a few merchants of record too. We picked Paddle for the boring reasons. It’s been around a long time, its API covers subscriptions, trials, discounts, proration and a customer portal, and it lets us set fixed prices per currency instead of converting on the fly.

what it costs us

We said we’d be honest about the downsides, so here they are.

A bigger cut per sale. A merchant of record charges more than a plain processor, because it does more. On a small price that difference is a real share of what we earn. We decided we’d rather have a thinner margin than a tax calendar. We won’t print the exact numbers, but we made that call with them in front of us.

Their checkout, their name. Payment happens in Paddle’s checkout, with its fields and its layout. Your card statement and your invoice show Paddle, not us. That can look odd if you expected our name, so our terms say it in the first lines: Paddle is the seller.

Their rules. Paddle decides what it’s willing to sell and checks the businesses it works with. Our billing depends on its API. If Paddle has a bad day, starting a checkout has a bad day.

That last one we could soften. The widget never asks Paddle anything. Paddle sends us signed webhooks when a subscription changes. We check the signature, store the new state in our own database and skip anything we’ve already seen or anything older than what we have. When a visitor sends a message, the server reads the site’s billing state from that database. If Paddle is down, your widget keeps working.

how it’s wired

Paddle’s script loads on one page only, the billing page in the dashboard. It never loads on spookat.com and never in the widget. Your visitors will never download a payment script because you run Spookat.

Your invoice says Spookat Starter, Pro or Agency. The plan names on our site are a bit, and your accountant doesn’t need the bit.

You pay in your own currency. Poland pays PLN, the eurozone pays EUR, everyone else pays USD. Each is a fixed price we set by hand, not a conversion. That decision gets its own post.

Your card, your invoices and cancelling live in Paddle’s customer portal, one click from the dashboard. Switching plans is a button in the dashboard. Going up is prorated. A cheaper plan starts when the paid period ends.

An agent can ask for a plan change over MCP. It gets a checkout link back and nothing else. A human opens it and pays. Agents never pay, switch or cancel on their own.

The catalog is code. The prices live in one file in our repo, and one command creates the matching products, prices and the 30% extra-site discount in Paddle. Running it twice changes nothing. The same file feeds the site, the dashboard and the server, which is why every price in this post is filled in from it rather than typed by hand.

what it means for you

You never give us card details, and we never see them. The card goes to Paddle’s checkout and stays with Paddle. Our database holds a subscription id, a plan and a status. That’s the whole billing footprint on our side.

If you buy as a company, you can add your VAT number at checkout and the invoice comes out the way your accountant expects. If you buy as a person, the price you see at checkout is the price you pay, with your country’s tax worked out for you. A refund goes back to the card you paid with, sent by Paddle.

The trial needs no card at all, so nothing gets charged by surprise when it ends. If 14 days pass and nobody picks a plan, the chat stays on and keeps taking messages, and your team answers them once someone picks a plan. Nobody gets charged, because there’s nothing to charge.

what we’d tell another small team

If you’re one to three people selling something cheap to people in many countries, look at a merchant of record before you look at anything else. Count what your time is worth before you count the fee.

If you only sell to businesses in your own country, a plain processor may be all you need. Ask an accountant, not a blog post.

Whatever you pick, keep your own copy of billing state and update it from signed events. Don’t call the payment provider in the middle of your product’s hot path.

And put the catalog in code. Prices typed by hand into a dashboard drift away from the prices on your website. Ours can’t.

The checkout is there when your trial ends. See the plans.

liked it? get on the list.

invites go out in small batches. when yours lands: 14 days free, no card.