Monthly and yearly tiers
Define plans in app/subscriptions.php with a Stripe price ID, access level and per-period credit allowance. Checkout drops the customer onto the right plan; the dashboard reads their level on every request.
Stripe-powered tiers, access levels, and monthly credits gating a left-sidebar member app — for SaaS products and paid memberships/communities alike. Passwordless auth and a dedicated admin app already wired, on plain PHP and SQLite.
Stripe tiers, proration, dunning and a self-serve portal — every transition lands as one signed row, and the dashboard just goes up and to the right.
Stripe tiers, renewals, dunning and proration on plain PHP and SQLite. The boring billing machinery is done; you build the product on top.
Define plans in app/subscriptions.php with a Stripe price ID, access level and per-period credit allowance. Checkout drops the customer onto the right plan; the dashboard reads their level on every request.
invoice.paid tops up the period's credit allowance and extends access; payment_failed flips the account to past_due and starts the retry clock. Both arrive as signed Stripe webhooks, verified before anything writes.
Upgrades and downgrades go through Stripe with proration on, so the next invoice carries the credit or charge. Access level updates the moment the subscription does.
Subscribers land in a left-sidebar member app — dashboard, account, billing, downloads — with a Stripe Billing Portal link to swap card, change plan or cancel without emailing you. The marketing top-nav drops away; you build the product inside the shell.
route_required_tier marks the paid routes; a free user who hits one is shown an inline pricing gate instead of a dead end, and the member sidebar puts a lock badge on what they can't reach yet. Guests bounce to login.
active, past_due, canceled and the current period end all live in the subscriptions table, kept in sync by webhooks. Cancel-at-period-end is honoured: the customer keeps access until the date they paid through, then access lapses on its own. No nightly job guessing who still owes you.
From checkout to lapse, every transition is a signed Stripe webhook writing one row — the rail below is the loop you don't have to build.
checkout.session.completed → active
invoice.paid → credits reset, period extends
payment_failed → past_due, Stripe retries
access until paid-through, then lapses
Not traction numbers — this is how the billing machinery behaves the moment you deploy it.
You're in one now. Hop straight to any other site type — same tab, still a demo: no card needed, no payment is real, and nothing you do is saved.
Each site-type demo is one of the seven ready-to-run profiles in the download — copy the folder, add your keys, ship.
Keep the infrastructure small. Make the product yours.
| web_build_step | none |
| source_code | included |
| hosting | your own server |
| database_mode | SQLite WAL |
Every install ships with this. Search users, replay webhooks, inspect billing and revoke keys — server-rendered, access-gated, no second app.
| User | Plan | Status | Joined |
|---|---|---|---|
| ada@example.com | Pro | active | 2d ago |
| grace@example.com | Scale | active | 5d ago |
| linus@example.com | Starter | past due | 3w ago |
| margaret@example.com | Pro | active | 1mo ago |
| blocked@example.com | Free | blocked | 1mo ago |
invoice.paidevt_1Q8x…a3customer.subscription.updatedevt_1Q8w…f1checkout.session.completedevt_1Q8w…7cinvoice.payment_failedevt_1Q8v…02charge.refundedevt_1Q8u…9dcurl -H "Authorization: Bearer ss_live_••••" \ https://app.yoursaas.com/api.php?resource=notes { "ok": true, "data": [ "note_18f2", "note_18f9" ], "rate_limit": "58/60", "credits_left": 1840 }
copy a template folder
composer install · Stripe + SES
rebrand · plans · run doctor
NGINX + PHP-FPM · take cards
Try the local app before configuring billing or email. Provider approval and deployment take additional time.
Define plans in app/subscriptions.php, attach Stripe price IDs, and the checkout flow stays generic across every project.
Default access for new users and trial accounts.
For a small paid SaaS tier.
For heavier usage and premium features.
For power users and high-credit products.
Stripe Checkout handles monthly and yearly plans, upgrades are prorated, downgrades are scheduled for period end, and the billing portal lets members manage their card and cancellation. Failed-payment (dunning) handling is built in.
Yes — each plan sets an access level and an optional monthly credit grant, so you lock a page or action behind a tier with one check.
They open the Stripe billing portal from their dashboard to update payment details, switch plan, or cancel — no support ticket needed.
The starter includes prepared queries, signed Stripe webhooks, CSRF checks, rate limiting, session hardening, setup diagnostics and regression tests. Configure the enabled providers, verify backups and test your own product before launch.
You pay your hosting and service providers directly. Budget for a PHP server, domain, transactional email and payment processing. Image generation/storage and native app store accounts add costs if you enable them. Check provider pricing for your region and expected usage; the template itself is a one-time purchase.
This is a live, fully interactive demo — explore every screen. Nothing you do is saved and no payments are real.