v1.9.14 · Released · May 9, 2026
Email Invoices and PAID Receipts to Clients
Marking a draft invoice as sent now actually emails the PDF to the client when their email is on file — no more copy/paste from the download. Marking it as paid offers the same: an opt-in "Email PAID receipt" checkbox sends the client a receipt with the PAID stamp. Plus admin Feature Requests gains search and column sorting, and a build hardening fix.
Email Invoices to Clients
- **Send to Client** — when a DRAFT invoice has a client email on file, the action button changes from *Record as Sent* to *Send to Client*. One click renders the PDF, emails it via SMTP, and flips the status to SENT in a single transaction.
- Falls back to the original *Record as Sent* (status flip only) when no client email is on file — existing flow is unchanged.
- Toast confirms the recipient on success: *Invoice sent to client@example.com*. SMTP failures fail-closed: the invoice stays DRAFT so you know the email didn't go out.
- Email body includes invoice number, total, due date, your invoice notes, and your name/email as the sender. PDF is attached as `INV-XXXX.pdf`.
Email PAID Receipts
- Mark as Paid dialog gains an *Email PAID receipt to client* checkbox (only shown when the invoice has a client email; auto-checked when present).
- When checked, renders the invoice PDF with the **PAID** stamp and `paidAt` date, then emails it as `INV-XXXX-paid.pdf` with a receipt-style cover note.
- Toast confirms: *Invoice marked as paid — receipt sent to client@example.com*.
Admin — Feature Requests Search + Sort
- Search box filters Feature Requests by title or description in real time.
- Column headers (Title, Status, Votes, Created) are now click-sortable with ascending/descending toggle and visual indicator.
Fixes
- Emailed invoice PDFs no longer show a DRAFT watermark — the PDF is now rendered with the post-flip SENT status so the client receives the same stamp they'd see in your invoice preview.
- Build no longer trips over `vitest.config.ts` and `*.test.ts` files during `tsc` compilation.