Buy Me a Coffee

buymeacoffee.comcontributed by Samuele Ongaro

ALMOST

A weekend of work, and real gaps remain.

A page where supporters can send a one-off or recurring payment, with a message wall, memberships and paid posts attached.

Promptfree, for everyone, and the only version there is
Build me a support page that replaces Buy Me a Coffee — and know why this is ALMOST.

The page is an afternoon. What you are replacing is **payments, tax and payouts in many countries with nothing to set up**. Doing that yourself means a payment provider account, tax registration for digital services in the places your supporters live, and reading a lot of dull documentation. It is possible and often worth it, because the fee on every contribution is real money — but the work is administrative rather than technical.

STACK
- Node 20+ with Fastify, server-rendered HTML
- SQLite through better-sqlite3, WAL mode
- One payment provider, hosted checkout, so no card data touches this
- Caddy in front

THE DATA MODEL
- creators: id, slug, name, bio_md, avatar_path, cover_path, currency, unit_name, unit_price_cents, theme_json, is_active
- supporters: id, email, name, is_anonymous, created_at
- contributions: id, supporter_id, kind, units, amount_cents, currency, tax_cents, tax_country, tax_evidence_json, message, is_public, provider_ref, status, created_at, refunded_at
- memberships: id, supporter_id, tier_id, provider_subscription_id, status, current_period_end, cancelled_at
- tiers: id, name, monthly_cents, currency, benefits_json, is_active
- posts: id, title, body_md, visibility, tier_id, published_at — public, supporters only, or a tier
- provider_events: id, event_id, kind, payload_json, processed_at — idempotency lives here
- payouts: id, period_start, period_end, gross_cents, fees_cents, net_cents, reference, paid_at

THE PAGE
- A name, a line about what you do, and one button. That is what converts
- The unit — a coffee, a beer, whatever — with a quantity, because choosing three of something is easier than choosing an amount
- A message from the supporter, optionally public, shown on a wall. That wall is most of why people give: they are buying a small public acknowledgement, not a transaction
- Anonymous giving allowed, and honoured everywhere
- Fast, server-rendered, under 50KB, and it must look trustworthy to a stranger about to type a card number. That means no layout shift, a visible name, and a real page rather than a redirect maze

PAYMENTS AND TAX
- Hosted checkout; the contribution is created from the verified webhook, never from the browser returning to a success page
- Idempotency by event id, and out-of-order delivery handled
- For digital services sold across borders the tax rate is usually the supporter's, not yours. Collect the country, apply the rate, and store two pieces of non-conflicting evidence of where they were. That evidence requirement is the thing people discover a year late — put it in the README with a note to take advice
- Refunds recorded, and any access granted by the contribution revoked with them

MEMBERSHIPS AND POSTS
- Monthly tiers through the provider's subscription handling and its customer portal for cards and cancellations. Building that yourself is weeks for a worse result
- Posts gated by tier, checked on the server. Gating in the browser is not gating
- A supporter's own page listing what they support and how to stop, in two clicks

THE PART THAT IS NOT CODE
- The receipt matters: a clear email with the amount, the tax breakdown and a reference. Deliverability matters here more than anywhere, because a missing receipt is a support message
- Payouts are your bank account and your bookkeeping now. Record fees per contribution so net income is a query rather than a spreadsheet exercise

OPERATIONS
- .env: DATABASE_PATH, STORAGE_PATH, BASE_URL, SESSION_SECRET, SMTP_URL, PROVIDER_KEY, PROVIDER_WEBHOOK_SECRET, HASH_SALT
- Migrations on boot, each once; nightly backup off the machine, restore script
- Health endpoint checking the database, mail and the provider

WHAT MATTERS MOST
Webhook idempotency and the tax evidence. Replay a duplicate event and confirm nobody is charged or credited twice, and store the location evidence from the first contribution rather than adding it later.

What you lose

  • Payment collection, tax and payouts in many countries with no account setup on your side
  • A supporter page that already looks trustworthy, which matters for a stranger about to pay
  • Membership tiers and paid posts on the same page

If you would rather not build

  • Stripe Payment Links, which need no code at all
  • Ko-fi, which takes no cut on the free tier

What it costs

as published on their pricing page

PlanBilled monthlyBilled yearlyLast read
—$0/mo——

Their pricing page is where these came from. Seeing a different price? Tell us.

The escape hatch

open source · no votes, no paid placement

Liberapay

$0

An open, non-profit recurring donation platform you could host.

liberapay/liberapay.comfree · open source

Killbill

$0

Open subscription billing, if memberships grow beyond Stripe Billing.

killbill/killbillfree · open source

Why this verdict

our own opinion · changed only by a person

62/100

Verdict kinda at 62. The page is easy and the 5% is avoidable, but the tax liability moves to you and that is a real cost.

History

tracked since 10 Aug 2026 · nothing is ever overwritten

Interest · last 30 dayspeak 1/day
views0130 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

Questions about Buy Me a Coffee

answered from the record above

Is Buy Me a Coffee free?

No — the plan we track is $0 a month. No monthly fee; the platform takes 5% of what supporters give.

Can you replace Buy Me a Coffee by building your own?

ALMOST. A weekend of work, and real gaps remain. Replacement score 62 out of 100, build time a weekend. Read what you lose before you decide.

How much does Buy Me a Coffee cost?

$0 a month on Free to use — $0 a year. Recorded 10 Aug 2026.

What do you lose by replacing Buy Me a Coffee?

Payment collection, tax and payouts in many countries with no account setup on your side; A supporter page that already looks trustworthy, which matters for a stranger about to pay; Membership tiers and paid posts on the same page. If any of those carry weight for you, keep paying.

Is there an open-source alternative to Buy Me a Coffee?

Yes: Liberapay, Killbill. The prompt on this page is for when you want it your way instead.

Related entries

same category first, most replaced first

All 27 in Commerce & contracts

Not sending yet

Every week, something stops being worth paying for.

New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.

free forever · no tracking pixel · stored here, never passed to anyone

Esc