All Docs
FeaturesSaaS FactoryUpdated February 19, 2026

Blog: Invoice Resend Is Now Real — v1.0.40

Invoice Resend Is Now Real — v1.0.40

One of the quieter dangers in any SaaS billing system is a button that looks like it works but doesn't. In v1.0.40 we closed exactly that gap.

What Was Broken

The Resend option in the Billing → Invoices tab has existed in the UI for a while — it sits neatly in the invoice action dropdown alongside other controls. But clicking it did nothing useful:

  • The UI toasted: Resend not yet implemented.
  • The backend mutation logged a console.warn and returned { success: true } to the caller — a false positive that made the problem invisible in logs.
  • No email was ever sent. Past-due customers who needed a manual nudge never got one.

This is the kind of stub that ships during rapid development and quietly costs revenue. A customer who doesn't receive a second look at an overdue invoice is a customer who churns or disputes the charge.

What We Fixed

The fix is straightforward and follows the pattern already established by the dunning automation in billing-crons.ts:

  1. Reuse the Resend email API — the same transactional email provider used for automated dunning reminders is now called directly from the resend mutation in billing-invoices.ts.

  2. Reuse buildEmailHtml — the shared helper from notifications.ts renders the email body. This keeps manual and automated invoice emails visually identical and means any future improvements to email templates propagate everywhere automatically.

  3. Include the right payload — the outbound email carries the invoice details, a direct link to the PDF, and a payment call-to-action, matching what customers already see from dunning reminders.

  4. Honest UI feedback — the toast.info stub is replaced with feedback that reflects the actual outcome of the send operation.

Why It Matters

Manual resend is a last-resort, high-value action. An operator reaches for it when automated dunning hasn't landed — the customer may have changed email clients, marked something as spam, or simply needs a human-feeling follow-up. Making that action a silent no-op was a trust and revenue problem.

With this fix, the button does exactly what it says. No surprises.

Upgrade Notes

No configuration changes required. The fix is entirely within the billing service layer and reuses the existing Resend API credentials already configured for dunning emails. Update to v1.0.40 and the button works.