CASE STUDY — SAAS · 2026
Tally
Self-hosted invoicing for solo freelancers. I built it to replace Hiveage when it stopped fitting — hosted pay pages, real payments, deliverable email, and the unglamorous reliability that separates a tool you trust with billing from one you don't.
- Card + ACH
- Stripe payments hosted pay pages
- SPF/DKIM/DMARC
- email that lands Postmark
- Nightly
- encrypted backups Cloudflare R2
The problem
I billed clients through Hiveage for years, until it stopped being the right fit. Migrating meant either surrendering to a heavier platform or building the exact tool I wanted. I built it. The catch with invoicing software is that it's all edge cases — the demo is easy, the trust is hard. A missed email or a mangled invoice number isn't a bug, it's a client wondering if they got paid.
The build
Tally is a self-hosted invoicing app on the Next.js 16 stack. Clients pay through hosted pay pages backed by Stripe — both cards and ACH, because freelance invoices aren't always small enough to want card fees on. Transactional email runs through Postmark with proper SPF, DKIM, and DMARC, so payment reminders and receipts actually reach the inbox instead of spam.
Migration was a first-class feature, not an afterthought: Hiveage CSV import that preserves existing invoice numbers, so the ledger stays continuous across the switch. Invoices render to PDF with @react-pdf, there's time tracking with monthly billing rollups, and encrypted nightly backups ship to Cloudflare R2 — because self-hosted means the backups are on me.
Stack decisions
Why self-hosted. It's my billing data. Owning the whole thing — database, backups, email domain — means no third party can deprecate my invoicing out from under me the way Hiveage nearly did.
Why Stripe with ACH. Card fees on a five-figure invoice are real money. ACH gives clients a low-fee path, and Stripe's hosted pay pages mean I never touch card data myself.
Why obsess over email deliverability. An invoice that lands in spam is an invoice that doesn't get paid. SPF/DKIM/DMARC and a real transactional provider are the difference between "I never got that" and "paid, thanks."
Outcomes
Tally runs my freelance billing today. It's deliberately unsexy — the value is entirely in the parts that don't break: the reminder that arrives, the PDF that's correct, the backup that exists. That's the boring plumbing clients actually pay for, and it's a genre of software I like building.
Need the unglamorous parts built right?
Payments, email, backups, migrations — the plumbing that has to work. I build that.