If you already run Nextcloud for yourself, the next question is usually whether it can pay for its own disk. Cashier, a plugin from MediaLab Works, turns your instance into a small paid service: a visitor picks a plan, pays by card through your own Stripe account, and gets an account with the right quota and groups, signed in on the spot. No identity check, no manual approval, no spreadsheet of who paid until when.
This guide is about the paid cloud angle: plans with quota and groups, accounts created on payment, upgrades for existing users, the grace period when a card fails, and VAT through Stripe Tax or Managed Payments. It assumes you are comfortable with occ, cron and a Stripe dashboard. The full reference lives in the Cashier guide; this is the practical path through it. You can read more about the plugin on the product page.
Before you sell anything: rights, VAT and your own Stripe account
Two things come before any configuration.
First, the legal side. Cashier charges your users through your own Stripe account, and you alone are responsible for holding the rights to the content or service you charge for. MediaLab Works provides the software and is not a party to your sales. Stripe maintains a restricted businesses list and may close or restrict an account that charges for content without the rights, so keep your offer to media you own or are licensed to use.
Second, the money side. Open a Stripe account (free to open; Stripe charges its own fee per payment) and make sure your instance is reachable over HTTPS, because Stripe has to call the webhook. Prices in Cashier are in the currency of your Stripe account. If you enable Stripe Tax or Managed Payments, VAT is calculated and added on the Stripe payment page: plans are created with a tax code, and the registration page shows the price without tax and says so.
Prerequisites
- Nextcloud 30 to 34, PHP 8.1 or newer, and a working cron for background jobs.
- A registration app from MediaLab Works, installed, enabled and licensed: Sign-up 1.0 or newer or IDRegister 2.1 or newer. Cashier uses its registration page, its e-mail confirmation and its account creation. Without one, Cashier only has a basic sign-up page of its own.
- A Cashier license (one per Nextcloud instance, 30-day free trial).
- A Stripe account and HTTPS, as above.
Step 1: Install and license Cashier
Download the archive cashier-x.y.z.tar.gz from Licenses in your MediaLab Works account, extract it so you get apps/cashier/ owned by the web-server user, then enable it:
sudo -u www-data php occ app:enable cashier
Open Administration settings → Cashier → License, paste your key and save. The app binds to this instance and shows Active. The license is checked once a day; offline, it keeps working for 7 days after the last successful check.
Worth knowing before you rely on it: without a valid license no new paid sign-ups or checkouts are accepted and the background job does not run, but existing accounts and subscriptions are untouched. Stripe keeps charging, the webhook keeps recording renewals, failed payments and cancellations, and subscribers keep their Subscription page and the Stripe customer portal. Nothing is deleted. The same holds if the registration app loses its license: new paid sign-ups stop, existing subscribers stay, and a payment already under way still gets its account.
Step 2: Connect Stripe
In the Stripe Dashboard, open Developers → API keys, copy the publishable key, and create a restricted key with write access to Customers, Checkout Sessions, Customer portal, Products, Prices, Subscriptions and Webhook Endpoints, and read access to Invoices (optionally Account, read, so the settings page can show the account name and currency).
Paste both keys under Administration settings → Cashier → Stripe. Start with test keys (pk_test_…, rk_test_…) and switch to live keys when everything works.
Then press Create webhook. Cashier registers https://<your-cloud>/index.php/apps/cashier/webhook in Stripe with the events it needs and saves the signing secret. If you prefer to do it by hand, add the endpoint yourself and paste the whsec_… secret.
The setup check Cashier (Stripe) under Administration → Overview turns green once a verified event has arrived. Make a test payment, or send one with the Stripe CLI (stripe trigger checkout.session.completed) or from the webhook page in the Dashboard.
Step 3: Define your plans
Go to Administration settings → Cashier → Plans → Add plan. For each plan you set:
- Name and description in English and Romanian.
- Price: monthly, yearly or both, in your Stripe account currency. With Stripe Tax or Managed Payments, VAT is added on the payment page.
- Storage quota, for example 100 GB, and the groups the subscriber joins.
- Free trial days, optional — the card is still collected.
- Visible on the registration page, or hidden and reachable only through a direct link, which is handy for a company offer.
Plans are created in Stripe automatically. Changing a price creates a new Stripe price and keeps existing subscribers on the old one until they change plan, so you can raise prices without rewriting everyone's subscription overnight.
Step 4: Choose the registration page
With Sign-up (recommended for plain paid sign-up), the page at /index.php/apps/signup/ offers your plans next to the free account, or instead of it (Sign-up → Registration). The visitor picks a plan, fills in Sign-up's form with personal data and password, confirms the address, pays on the Stripe page and comes back signed in to an account created by Sign-up with the plan's quota and groups.
With IDRegister, once Cashier is licensed and at least one plan is visible, the registration page at /index.php/apps/idregister/ offers "Pay a plan instead of scanning an ID" under the identity-card option, on phones and on computers. The visitor chooses a plan and billing period, enters an e-mail address, accepts the terms and confirms it with IDRegister's six-digit code, pays on Stripe, and returns to a page that waits a few seconds for Stripe's confirmation. IDRegister then creates the account marked verified by payment, with the plan's quota and groups; the user name and a password are shown once, the browser signs in, and a welcome e-mail with a link to choose a password follows. These accounts skip the ID card, the selfie and the administrator approval; the e-mail address is locked and the name can be changed by the user.
In Administration settings → IDRegister → Paid registration you can switch the paid offer off, or switch off "Require the identity check only for the free path" so paying visitors also show their document and take the selfie first. If both apps are installed, Rules → Paid sign-up page decides where Cashier's own links go (/index.php/apps/cashier/signup and a hidden plan's direct link …/signup/plan/<token>, with the plan already chosen). A visitor who cancels on the Stripe page comes back to the plans and nothing is charged.
Step 5: Upgrades for existing users
A free or ID-verified account can buy a plan to get more space. Existing users do not go through the registration page: they buy from Personal settings → Subscription, where they also see their current plan, next payment and invoices, and can change plan, update the card or cancel through the Stripe customer portal. Point people there in your support replies; it saves a lot of back-and-forth.
Step 6: Renewals, failed payments and the grace period
Renewals extend the account automatically. When a payment fails, Stripe retries the card according to your Stripe settings, and the user gets a notification and an e-mail with a link to update the card. The account keeps working during the grace period, set in Administration → Cashier → Rules from 0 to 90 days (7 by default); 0 applies the next rule as soon as a payment fails.
After the grace period the account becomes read-only (quota reduced to the used space) or suspended, as you chose. Accounts registered through Sign-up follow Sign-up's rule, which is suspended by default. The user gets an e-mail with the link to pay the open invoice. A suspended user who lost that link can request it again on the public page /index.php/apps/cashier/billing, which is linked from Sign-up's page. A successful payment restores the account immediately, with an e-mail.
The important promise to make your users: nothing is ever deleted for an unpaid invoice. Files, shares and data stay as they are.
Step 7: Keep an eye on the admin side
Administration → Cashier lists your subscribers and the monthly revenue, and lets you extend a subscription manually or give a user a free plan. Each entry links to the payment in Stripe. The checks under Administration → Overview cover both Stripe and the registration page, so a broken webhook or a missing registration app shows up there rather than in a support ticket.
Tips and troubleshooting
- The setup check stays red. No verified Stripe event has arrived yet. Make a test payment or trigger one with the Stripe CLI, and confirm the webhook URL is reachable over HTTPS.
- No paid sign-ups appear. Check the Cashier license and the license of Sign-up or IDRegister, and confirm at least one plan is visible. The Registration page section of the Cashier settings says what is missing.
- A visitor paid but has no account. Look for the payment in Stripe and check the webhook deliveries. A payment that was under way when the registration app lost its license still gets its account, because Cashier creates it itself.
- VAT looks wrong on the registration page. That page shows prices without tax by design when Stripe Tax or Managed Payments is on; the tax is added on the Stripe payment page.
- You changed a price. Existing subscribers stay on the old Stripe price until they change plan. That is expected behavior, not a bug.
- Privacy questions. Card details are handled only by Stripe. Cashier stores the Stripe customer and subscription identifiers, the plan and the payment dates, and accounts created through payment are marked "verified by payment", not by identity document.
Conclusion
Cashier is a narrow tool that does one job: it connects a Nextcloud registration page to your own Stripe account, so a plan becomes an account with the right quota and groups, and a failed card becomes a grace period instead of a deleted user. Define a couple of plans, test with Stripe's test keys, watch the overview checks turn green, and you have a small paid cloud that runs on infrastructure you already understand. If something does not line up, the knowledge base and the FAQ are the next stop, and you can always contact us. Release notes are in the changelog.