The wound
A freelancer's invoice-reminder automation stopped firing. Nothing crashed. Nothing paged. For two weeks, clients heard nothing — until one asked why he had been ghosted.
"n8n dropped every webhook at 3am for two weeks and I only noticed because a client asked where his invoice was."
The post tells the shape of the failure. An invoice-reminder flow on a mini PC under a desk. A nightly gap in the executions tab. A flaky SMTP relay blamed for ten minutes, then forgotten. The bill arrives weeks later, denominated in a client relationship.
Why it breaks silently
- Reminders ride a chain — n8n webhook in, SMTP relay out. Every link is a place to drop.
- The chain fails quiet. A dropped webhook logs a gap. Nobody reads the executions tab at 3am.
- Monitoring watches the wrong thing. The mini PC, the container, the uptime dashboard — all green while the job is dead.
Self-hosted invoicing threads converge on this pattern: Invoice Ninja on a VPS, automations around it, and the reminder path as the fragile part [s23]. The demand scan that found this quote ranked self-hosted invoicing pain the strongest signal of five queries run.
How minvoice answers
Minvoice strips the chain. One business, one database, one scheduler — and a probe that fails loud.
- Reminders run on managed cron. A daily Cloudflare trigger (15:00 UTC) enqueues due reminders into a D1 outbox [s8]. No webhook to drop, no box under a desk to reboot.
- Delivery retries from an outbox. The cron drains the outbox and retries failed sends on the next run. A flaky relay costs hours, not weeks.
- The health probe touches the database.
/healthanswers 200 only when the Worker and D1 both respond; 503 otherwise [s8]. A green check means the invoicing stack can actually read and write, not just serve a page. - It is watched every minute. UptimeFlare probes
/healthon a 1-minute cron through the relay, with ntfy push on failure [s24]. This season added minvoice to the monitored fleet — the watch this case study claims is the watch that runs.
The empty threat
Silent reminders are half the late-payment problem. The other half asked for itself in the next demand scan:
"Do you enforce late fees on Net 30 or is it an empty threat?"
Every invoicer can paste a fee clause into a template. Almost none charge it. Enforcing by hand means recomputing every overdue invoice, every day, without missing one — so the clause stays decoration and the late payment stays free. The thread's own answer pattern: owners draft the terms, then never run the math.
How minvoice enforces
Since s30, minvoice computes late fees as part of every render. The threat charges itself [s30].
- Terms snapshot per invoice. Each invoice carries its own late-fee rate (%/month) and grace days, set at creation — defaults 1.5%/month with a 14-day grace.
- Computed at view time, never stored. The fee accrues as rate × commenced 30-day periods past grace, on sent invoices only, rounded to cents. The PDF, print view, admin detail and every reminder recompute the same number from the same terms — no drift, no manual math, and the recorded total stays what payments reconcile against.
- The demand escalates on its own. Reminder emails append the current fee and the new demand total at delivery time. Each reminder asks for more than the last, with zero configuration.
- Proven on a served PDF. A seeded $1,000 invoice, 49 days overdue at 1.5%/month past a 14-day grace — two commenced 30-day periods — renders "Late fee (1.5%/mo, 49 days overdue) $30.00" and "Total due incl. late fee $1,030.00", verified by text extraction from the live PDF [s30].
The math of loud failure
| self-hosted chain | minvoice | |
|---|---|---|
| reminder trigger | webhook + n8n flow | managed daily cron |
| late-fee clause | typed in the template, never charged | computed on every render |
| failed send | gap in executions log | outbox retry next run |
| detection signal | a client's DM | 1-min probe + push alert |
| worst-case silence | weeks (observed) | minutes |
Silent for two weeks versus paged within minutes; a decorative clause versus a demand that grows by the day. That gap is the product.
What minvoice is
Single-business invoicing on Workers + D1: PDF invoices, pay links, optional Stripe/PayPal — fully functional with payments off [s8]. Since s30 it also enforces its own terms: automatic late fees, per-invoice rate and grace, computed on every render. For the operator the demand scan kept finding: a small business running itself on its own stack, where invoicing works until the night it does not.