DEV Community

Cover image for Filament Billing: The Missing Stripe Admin Layer for Your Panel
Hafiz
Hafiz

Posted on • Originally published at hafiz.dev

Filament Billing: The Missing Stripe Admin Layer for Your Panel

Originally published at hafiz.dev


You wired up Laravel Cashier, connected Stripe, and your app takes payments. Subscriptions get created, webhooks fire, the subscriptions table fills up. Everything works.

Then a customer emails asking to cancel. Or you want to know what your MRR actually is this month. Or someone's payment failed and you need to see who's past due.

Where do you go? Not your admin panel. Cashier doesn't put anything there. You open the Stripe dashboard, or you write a tinker one-liner, or you build a one-off resource every single time. The billing runs fine, but managing it lives outside the tool you built everything else in.

That gap is the whole reason I built Filament Billing. It's a commercial plugin that adds the operator side of billing to your Filament panel: plans, subscriptions, and an MRR widget, all reading from the Cashier tables you already have.

What Cashier gives you, and what it doesn't

Cashier is really good at what it does. It handles the Stripe API calls, the subscription lifecycle, the webhook parsing, the proration math. If you've set up billing with it before (and if you haven't, my Stripe integration guide walks through the whole thing), you know it takes care of the hard parts.

But Cashier is a library, not an interface. It writes stripe_status to your database when a webhook arrives. It does not give you a screen to see that status. It cancels a subscription when you call ->cancel() in code. It does not give your support person a button to do it.

So most teams end up in one of three places. They pop open the Stripe dashboard for everything, which means context-switching out of their own app and giving more people Stripe access than they'd like. They write throwaway tinker commands, which works until you need it at 11pm and can't remember the syntax. Or they build custom Filament resources by hand, which is fine the first time and annoying the fifth.

I've done all three. The third one is what this plugin is, except built once, properly, instead of half-built on every new project.

What Filament Billing actually adds

Three things, all operator-facing.

A Plans resource where you define your billing plans inside the panel. Name, price, currency, the policy behind it. This is your reference layer for what you sell.

A Subscriptions resource that reads your Cashier subscription tables and shows them as a proper Filament list. Each row has the actions you'd expect: cancel at period end, cancel now, resume, swap. No tinker, no Stripe dashboard. Your support person can handle a cancellation without touching code or getting a Stripe login.

Filament Billing subscriptions list showing customer plans, statuses, and cancel, resume, and swap row actions

An MRR widget for your dashboard. It shows monthly recurring revenue, active subscriber count, and how many people are in trial. It derives the number from the plans it sums, so the currency matches your data instead of a hardcoded symbol. If you've read my admin dashboards guide, this is the metrics-at-a-glance idea applied to billing.

Filament Billing MRR dashboard widget showing monthly recurring revenue, active subscribers, and in-trial counts

There's also Stripe webhook status sync that keeps subscription statuses current as Stripe events arrive. That part builds on Cashier's own webhook handling, so it works as long as you've got Stripe webhooks wired to your app the normal way.

Who this is for, and who it isn't

I'd rather you know before you buy than ask for a refund after, so here's the honest scope.

This is an operator-side tool. It's for you and your team to manage billing from the admin panel. It is not a customer-facing checkout. Your customers still create subscriptions the way they already do through Cashier. Filament Billing gives you the layer to manage what those flows produce, not a replacement for them.

It's Stripe only, through Cashier. If you're on Paddle, this isn't for you yet.

You define your plans in the panel. It doesn't auto-sync from Stripe on install. You enter what you sell once, and manage from there. (Pulling plans straight from the Stripe API is the feature I'm most likely to add next, but I'd rather ship the honest version now than promise sync that isn't there.)

And it needs Filament v5 and Laravel 11 or 12, with Cashier for Stripe. Filament v5 shipped mainly to support Livewire v4, with no functional changes from v4, so if you're on a recent v4 app the upgrade is quick. If you want to know exactly what changed, I covered that in my Filament v5 breakdown.

If you're building a Laravel SaaS on Filament and you've already got Cashier taking payments, you're the exact person I built this for. If you're still deciding between billing providers, my Cashier Stripe vs Paddle cost comparison is worth a read first, because this plugin commits you to the Stripe side.

Why I shipped it narrow

I've made the mistake before of building a big, clever thing nobody used. So this one is deliberately small. Operator-side only. Stripe only. No customer checkout, no dunning flows, no churn analytics, no Paddle. Just the three pieces that solve the actual daily pain: seeing subscriptions, acting on them, and knowing your MRR.

That narrowness is a feature. It means the plugin does what it says, installs cleanly, and doesn't drag half-finished functionality into your app. If it turns out people want plan-sync or Paddle or a customer portal, those come later, driven by what buyers actually ask for, not by what I imagined in advance. This is the same ship-narrow-to-validate approach I wrote about in my Building a SaaS with Laravel and Filament guide, where I built this billing layer by hand the first time. I've since packaged that admin side into this plugin so you don't have to rebuild it.

Pricing and how to get it

Two one-time tiers: €69 for a single project, €149 for unlimited projects. No subscription, no recurring fee for the plugin itself. You buy it, you get the private Composer repository access, you install it with your license key. You can grab it on Anystack here.

Installation is the standard Anystack flow: configure the repository, add your license credentials, composer require hafizdev/filament-billing, then run the install command. It reads your existing Cashier setup and adds the resources and widget to your panel.

FAQ

Does this replace Laravel Cashier?

No. It sits on top of Cashier and reads its tables. You still need Cashier installed and configured for Stripe. Think of this as the admin interface Cashier never shipped.

Can my customers use it to subscribe or manage their own plans?

Not in this version. It's operator-side only. Your customers create subscriptions through your existing Cashier flows; this is for you and your team to manage them from the panel.

Does it work with Paddle?

No, Stripe only for now. Paddle support depends on demand, so if that's a blocker for you, let me know.

Do I need to be on Filament v5?

Yes, v5 with Laravel 11 or 12. Since v5 exists mainly for Livewire v4 support with no functional changes from v4, upgrading a recent v4 app is quick.

Will it pull my plans from Stripe automatically?

Not yet. You define your plans in the panel once. Automatic sync from the Stripe API is the most likely next addition.

Get it or ask me

If you're running Cashier on a Filament panel and you're tired of opening Stripe to cancel a subscription, this is the layer that fixes it. It's live now on Anystack.

Building something with Filament and Stripe and want to talk through whether this fits, or what's missing for your case? Get in touch. I read every message, and buyer questions are what shape where this goes next.

Top comments (0)