A page where supporters can send a one-off or recurring payment, with a message wall, memberships and paid posts attached.
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
| Plan | Billed monthly | Billed yearly | Last 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
$0An open, non-profit recurring donation platform you could host.
liberapay/liberapay.comfree · open source
Killbill
$0Open 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
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
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

