trending
•

1d ago

BillingHub is live on Product Hunt today, and I am here all day

The launch page is up: https://www.producthunt.com/prod...

If you have a question about BillingHub, this forum is a good place for the longer ones, and I will answer every one of them today, myself. There is no team; it is one person.

Four things people usually want to know first. Every new account starts with 3 free invoices, no card needed. After that you buy invoices in packs and spend a credit only when an invoice is issued, and credits never expire. Estimates and quotes never cost a credit. The yearly plan is a subscription that renews; the packs are one-time.

The fastest way to judge it is the free generator, which needs no account and adds no watermark:

•

1mo ago

Our free PDF and our paid PDF are one render, and a test fails the build if they drift

Most free tiers are a separate code path from the paid one. That is where the free artifact quietly gets worse: a watermark, fewer fields, a layout nobody maintains. It is rarely a decision. It is what happens when two paths exist and only one of them has anybody looking at it.

Ours meet. The free generator takes a posted payload and builds the same document object the signed-in editor builds out of database rows, and both go through one renderer. A test renders the same figures down both paths and fails if the HTML differs, once per document type. It compares HTML rather than PDF bytes deliberately: two Dompdf outputs differ on embedded timestamps, so a byte compare would fail on the one thing that does not matter.

•

1mo ago

The invoice was paid in full and our own check said it was fifty short

We store every amount in minor units because that is what an invoice's arithmetic needs. Stripe agrees for almost every currency and does not for sixteen of them: a charge of one thousand yen is 1000, not 100000, and sending the second bills a hundred times the price with nothing raised anywhere.

The interesting failure is not the charge, though, it is the check afterwards. Take a yen invoice totalling 108250 minor units. That is 1,082.50 yen, which the currency cannot express. We ask Stripe for 1082, the buyer pays 1082, the webhook reports 1082, and converting that back answers 108200. Fifty short, every time, by construction. Compared as stored, the payment is refused, the invoice stays unpaid, and the buyer has already been charged. Nothing throws and no log says anything is wrong.

•

1mo ago

Estimates and quotes issue free here, and the free part lives in one condition

An invoice spends a credit. An estimate or a quote spends none, on any balance, including an empty one. It is not a trial allowance or a monthly cap. The reasoning is ordinary enough: a proposal is what brings the account that later issues the invoice we do charge for, and pricing the offer is charging for the sales call.

The part worth reading is where that lives. It is not a promise on a pricing page and it is not a check at each endpoint. It is one line in the service that creates documents: leaving draft charges a credit, and only for a type that can ask for money. Everything that could bill goes through it, the editor, the API create, the API issue, the recurring run.

•

2d ago

BillingHub - Our worst rate is $1 an invoice. What's yours?

Pay per invoice, not per month. Start with 3 free invoices, no card. After that, $25 buys 25, and credits never expire, so a quiet month costs nothing. Estimates and quotes are always free. 156 currencies, optional Stripe card payments, no logo but yours.