Launch a subscription
SaaS this week.

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.

1 dependency No build step Built for AI agents Stripe + SES ready
Recurring revenue, running itself

Watch MRR compound while the billing loop does the work

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.

Monthly recurring revenue
$
+6.4% MoM 1,842 active subscribers
RECURRING REVENUE, WIRED

The charge-monthly base, already plumbed

Stripe tiers, renewals, dunning and proration on plain PHP and SQLite. The boring billing machinery is done; you build the product on top.

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.

Renewals and dunning

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.

Proration on switch

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.

A real sidebar app to live in

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.

Tier-gated, with an upsell built in

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.

Stripe is the source of truth for status

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.

The subscription lifecycle

One subscriber, four states, zero cron jobs

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.

01

Subscribe

checkout.session.completed → active

02

Renew

invoice.paid → credits reset, period extends

03

Fail / dunning

payment_failed → past_due, Stripe retries

04

Cancel at period end

access until paid-through, then lapses

Recurring revenue, by the numbers

The whole subscription rides on a handful of moving parts

Not traction numbers — this is how the billing machinery behaves the moment you deploy it.

4 subscriber states: active, past_due, canceled, cancel-at-period-end
3 webhook events run the recurring core — checkout, invoice.paid, payment_failed
3 layout shells route every request — public marketing site, the left-sidebar member app, the admin app
1 row every transition writes a single signed, verified subscriptions row
Keep the infrastructure small. Make the product yours.
This store and its demos use the same PHP and SQLite foundation included in your download.
1 SQLite database
web_build_stepnone
source_codeincluded
hostingyour own server
database_modeSQLite WAL
Superadmin, not a spreadsheet

A real admin console — have a poke around.

Every install ships with this. Search users, replay webhooks, inspect billing and revoke keys — server-rendered, access-gated, no second app.

app.yoursaas.com/admin superadmin
MRR£4,820▲ 12%
Active subs138▲ 6
Credits today29,400spent
Signups · 7d52▲ 18%
UserPlanStatusJoined
ada@example.comProactive2d ago
grace@example.comScaleactive5d ago
linus@example.comStarterpast due3w ago
margaret@example.comProactive1mo ago
blocked@example.comFreeblocked1mo ago
processedinvoice.paidevt_1Q8x…a3
processedcustomer.subscription.updatedevt_1Q8w…f1
processedcheckout.session.completedevt_1Q8w…7c
retryinginvoice.payment_failedevt_1Q8v…02
refundedcharge.refundedevt_1Q8u…9d
curl -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
}
From download to charging cards

Preview locally. Connect services. Launch.

01

Unzip & copy

copy a template folder

02

Install & connect

composer install · Stripe + SES

03

Ask your agent

rebrand · plans · run doctor

04

Deploy & charge

NGINX + PHP-FPM · take cards

Try the local app before configuring billing or email. Provider approval and deployment take additional time.

Pricing you control

Tiers, access levels and credits from one config file.

Define plans in app/subscriptions.php, attach Stripe price IDs, and the checkout flow stays generic across every project.

Included

Free

£0

Default access for new users and trial accounts.

Access 025 starter credits
Subscription

Starter

$19/mo

For a small paid SaaS tier.

Access 10100 credits/mo
Subscription

Pro

$49/mo

For heavier usage and premium features.

Access 20500 credits/mo
Subscription

Scale

$149/mo

For power users and high-credit products.

Access 302,000 credits/mo
Questions

The honest FAQ.

Get started

You’re already inside.

This is a live, fully interactive demo — explore every screen. Nothing you do is saved and no payments are real.

Get Simple Stack Launch offer · £49