If you run a Jellyfin server for a club, a community or a group of friends, at some point someone asks the obvious question: how do we cover the hosting bill? Cashier is our answer for self-hosters. It turns your Jellyfin server into a paid service: a visitor picks a plan, pays through your own Stripe account, and the Jellyfin account becomes active at once. When a renewal is not paid, the account is suspended until the invoice is paid — and never deleted automatically.
That last point matters. Cashier is not a licensing enforcer that wipes users; it is a cashier. It works together with Registration, which provides the sign-up page and the account creation, while Cashier handles plans, Stripe and the subscription state. You can read the full product description on the Cashier page and follow along with the user guide.
Before you start
A few things to settle before touching any setting.
Content rights. Cashier charges your users through your own Stripe account. You alone are responsible for holding the rights to the content or service you charge for — for example the films, series or channels on your server. MediaLab Works only provides the software and is not a party to your sales, and Stripe may close or restrict an account that charges for content without the rights (see Stripe's restricted businesses list). So charge only for content you own or are licensed to use, and keep your server private to your paying members.
Your own Stripe account. Payments go into your Stripe account; card data never touches your server. Stripe charges its own fee per payment. You will also want to think about tax: Cashier supports an optional billing address and Stripe Tax, both off by default, so decide whether you need them before you switch selling on.
Prerequisites:
- Jellyfin Server 12.2 or newer (Linux, Windows or Docker).
- Registration by MediaLab, installed and licensed — Cashier uses its sign-up page, e-mail settings and account creation.
- A Stripe account and your server reachable over HTTPS, so Stripe can call the webhook.
- A valid Cashier license. You can start the 30-day free trial from the plugin's License page if you do not have a key yet.
Install Cashier from your private plugin repository (recommended), from the public catalog, or manually from the zip in Account → Licenses. Then open the plugin page in Dashboard → Plugins → Cashier by MediaLab, click Open License page and activate your key.
Step by step
1. Configure Registration first
Install and license Registration, then set its public address and SMTP. Cashier sends every subscriber e-mail — invoice due, payment failed, payment succeeded, suspension, reactivation — through Registration's SMTP settings, so if mail does not work here, it will not work later either.
2. Paste your Stripe key
Open Dashboard → Cashier and go to Keys. Paste your Stripe secret key (sk_…) — or, better, a restricted rk_… key — click Save and test, then Create the webhook automatically. The key is stored in data/secrets.json, which is kept out of the configuration sent to the browser.
If your server has no public HTTPS address, you can skip the automatic webhook: Cashier then reads Stripe events every 15 minutes, with no open port needed.
3. Set the service name and public address
Enter the service name shown to customers and the public address of the server (for example https://jellyfin.example.com). The address is used for the return from Stripe and for the webhook, so it must be correct.
4. Define your plans
Review the plans: period (monthly or yearly), number of simultaneous streams and price. Plans are defined by the number of devices that may play at the same time — for example 1 to 4 screens. Click Save and send to Stripe: the prices are created in your Stripe account. Note that a changed price creates a new Stripe price, while existing subscribers keep theirs until they change plan.
5. Trial and grace period
Set the trial days (an optional free trial for the first subscription) and the grace period. The grace period is how long an account stays active after a failed payment while Stripe retries — 3 days by default.
6. Switch selling on
When everything above is in place, switch selling on. New customers now choose a plan on the sign-up page and pay; their account is enabled when Stripe confirms the payment. Switching selling off later keeps every account as it is.
How payment and non-payment behave
This is the heart of the plugin, so it is worth understanding before you open the doors.
- Payment activates. As soon as Stripe confirms the payment, the account is enabled with the plan's limits. There is no manual approval step: payment replaces it.
- Non-payment suspends. After a failed payment the account stays active for the grace period while Stripe retries, then it is disabled. Paying the invoice enables it again.
- Nothing is deleted by default. Deleting long-suspended accounts is optional and off by default. The subscriber row is deleted together with the server user, and only then.
- The stream limit is enforced. Playback beyond the plan's number of devices is stopped natively (MaxActiveSessions) at sign-in or playback start, so it works with any client.
- Stripe is reconciled every 15 minutes, in case a webhook is missed.
Subscribers get a customer page at /Cashier/Page in any browser, and TVs can pay from a phone via a QR code generated on the server — no external resources. The Stripe Customer Portal is configured for you, so customers can change card or plan, view invoices and cancel.
For day-to-day administration, the Subscribers and Payments lists show who pays what, and the journal shows every change of state. The admin page only links out to the Stripe Dashboard; it does not embed it.
Tips and troubleshooting
Payments do not activate accounts. Almost always the webhook cannot reach the server. Check that the public address is reachable over HTTPS from the internet. Even if the webhook is down, Cashier reconciles with Stripe every 15 minutes, so a missed event is recovered — but fix the address anyway.
No e-mails to customers. Check the SMTP settings in Registration; Cashier has none of its own.
Test before you charge anyone. Use Stripe in test mode first, run a sign-up through the customer page and watch the account switch from pending to active in the Subscribers list.
Watch the license. Without a valid Cashier license, no new paid sign-ups are accepted until the license is valid again — nothing is deleted, and existing subscribers are unaffected in their data. The plugin checks the subscription key once a day; without internet it keeps working for 7 days after the last successful check.
Keep your license current. A lifetime license receives the versions released during its update window. If Jellyfin's automatic updates install a newer, unlicensed version, the plugin stops with "version not licensed" until you use Roll back to x.y.z on its License page. To avoid that, point Jellyfin at your private plugin repository, which offers only the versions your license allows.
Plan changes. Because a changed price creates a new Stripe price, existing subscribers keep their old price until they change plan. Announce price changes to your members instead of assuming they will move automatically.
Conclusion
Cashier keeps the accounting side of a community server simple: plans by simultaneous streams, monthly or yearly billing, a free trial if you want one, and a clear rule — payment activates, non-payment suspends, nothing is deleted. Because the money lands in your own Stripe account and card data never reaches your server, you stay in control of both the content and the payments.
Start on the Cashier product page, work through the guide, and keep the changelog handy for new versions. If something does not behave as described, the knowledge base and FAQ are the next stop, and you can always contact us.