All Docs
FeaturesDepositClearUpdated March 13, 2026

Never Miss a Failed Payment Again

Never Miss a Failed Payment Again

Release v0.1.251 · Billing Intelligence


Until now, there was a quiet but serious gap in the platform's billing workflow: if Stripe failed to collect your subscription payment, nothing happened on our side except a silent status update in the database. No email. No notification. No warning. You'd only find out if you happened to wander onto the billing page at the right moment.

For a platform built around fairness and transparency — one that handles deposit disputes, compliance obligations, and time-sensitive tenancy events — that was unacceptable. A landlord or agent whose subscription lapses without warning risks losing access precisely when they need it most.

v0.1.251 fixes this.


What We Built

We extended the Stripe webhook handler to do more than flip a database column when invoice.payment_failed arrives. After recording the past_due status, the handler now fires an Inngest event that fans out into two parallel actions:

1. An email to every org owner and admin Using the existing sendEmail infrastructure, we dispatch a clear, direct email: your payment failed, your subscription is at risk, here is the link to fix it. No ambiguity, no buried small print.

2. An in-app notification for all admins The next time any admin logs in, they'll see a notification in the platform linking straight to /dashboard/billing. Even if the email lands in spam, the message gets through.

We also flag the option to surface a dashboard banner — a persistent visual cue that persists until the payment issue is resolved.


Why It Matters

Subscription payment failures are rarely the user's fault — cards expire, banks flag transactions, payment methods change. What matters is how quickly someone can act. The old silent failure put the entire burden on chance. The new flow puts the right information in front of the right people immediately, with a one-click path to resolution.

For agencies managing multiple properties and tens of deposit cases, continuity of service isn't a nice-to-have. This change ensures that a background billing event never becomes a foreground operational crisis.


For Developers

If you're integrating with or extending the platform's billing logic, the key change is in src/app/api/webhooks/stripe/route.ts. The invoice.payment_failed branch now emits an Inngest event after the database write, keeping the webhook handler itself thin and delegating notification side-effects to the event-driven layer. This pattern is consistent with how other async work is handled across the codebase.


This is a small change with an outsized impact on reliability. Exactly the kind of fix that keeps a platform trustworthy.

— The Engineering Team