Skip to content

Early access — a SaaS starter kit

Three weeks of plumbing, already done.

A SaaS starter kit built on Laravel 13 and Nuxt 4 SSR — the codebase you clone and own. Teams, Stripe and Paddle billing, an AI assistant with credit metering, and an admin panel.

One payment. Unlimited projects.

You already know how the first month goes.

None of it is hard, exactly. It is just long, and none of it is the thing you actually want to build. Rough but honest estimates for assembling it yourself:

  • 2–4d

    Sanctum cookie auth against a decoupled Nuxt SSR frontend

    Cookie forwarding during server rendering. This is the one that eats a weekend.

  • 2d

    OAuth, magic links, email verification

    Google and GitHub, plus the token flows around them.

  • 1–2d

    2FA with TOTP, QR codes, single-use recovery codes

  • 3d

    Teams, per-team roles, invitations

    Acceptance by token, without leaking whether an address is registered.

  • 4–5d

    Stripe subscriptions

    Plans, trials, proration, per-seat quantity sync, customer portal, feature gates.

  • 2d

    Webhooks you actually trust

    The part everyone ships without verifying. See below.

  • 4d

    Admin panel — CRUD, user management, revenue metrics

  • 2d

    Localisation, including queued email in the recipient’s language

  • 2d

    Docker, CI, a test suite worth running

Call it 22–26 working days — a month, give or take, before you write the first line of the thing that makes the product yours.

You could build all of it. That is not in question — you have built most of it before. The question is whether you want to spend the first month of this project doing it again.

What's included

A real Laravel app and a real Nuxt app. You clone them and they are yours — no vendor package, no licence key phoning home.

Auth

  • Sanctum SPA cookie auth working with a decoupled Nuxt SSR frontend, including cookie forwarding during server rendering
  • Email/password, magic links, Google and GitHub OAuth, email verification
  • 2FA (TOTP) with QR codes and single-use recovery codes
  • Admin user impersonation with a persistent banner
  • Account suspension that drops a signed-in user on their next request

Teams

  • Personal team on signup; every user always operates inside a team
  • Roles per team — owner, admin, member — distinct from global admin roles
  • Email invitations with token acceptance, no user enumeration
  • Billing belongs to the team, not the user — built for per-seat from day one

Billing

  • Stripe via Laravel Cashier: multi-plan, trials, proration, per-seat quantity sync, customer portal, feature gates
  • Paddle as merchant of record
  • Stripe Managed Payments — one config flag. Built and tested
  • Config-driven plan catalogue: one file defines plans, prices, features, limits

AI assistant

  • Tool use: it reads your own app before answering — plan, team, members — and shows the user what it looked up
  • A new tool is one class and one line; the streaming loop, round limit and error handling already exist
  • Streaming (SSE) chat metered per team, answers rendered as sanitised markdown
  • Anthropic or an offline fake driver, with a per-caller rate limit and a hard credit ceiling

Admin panel

  • Generic resource builder: one config class per resource gives a full CRUD screen, no new frontend code
  • Revenue metrics — MRR, ARR, churn, per-plan breakdown — computed locally, no Stripe API calls
  • Hand-rolled SVG charts, zero charting dependencies
  • Activity log, user management, per-tenant drill-down

Type safety

  • PHP Data classes generate TypeScript types automatically
  • Change a field on the backend, run one command, and the frontend typecheck names every broken usage
  • No hand-written interfaces to drift out of sync with the API
  • The PHP class is the single source of truth for both sides

Localisation

  • English, Portuguese (BR), Spanish — UI, transactional emails, API errors, validation messages
  • Locale-prefixed routes with hreflang, so each language is its own indexed page
  • Queued emails render in the recipient’s language, not the worker’s

Realtime

  • Laravel Reverb — self-hosted WebSockets, no Pusher bill
  • Private per-team channels; credit balances update live across tabs
  • A notification bell that fills in without a refresh
  • Reverb runs in the same docker compose as the API and queue worker

Developer experience

  • docker compose up — API, MySQL, queue worker, Reverb, Mailhog, Nuxt dev server
  • 327 backend and 45 frontend tests — the ones that keep this list honest
  • Design tokens in one file — rebrand by editing CSS variables, no rebuild

Merchant of record

You probably owe VAT you don't know about.

Selling only inside your own country? This may not apply yet — skip ahead. The moment you take a customer abroad, it does.

Sell a subscription to a customer in Germany and you owe German VAT — from the first sale, no threshold. Same story across the EU, the UK, and a growing list of US states. Stripe collects your money; it does not become the seller.

A merchant of record does. Paddle becomes the legal seller of your product and handles registration, collection and remittance worldwide. Nuxavel ships it as a config flag:

# .env
BILLING_PROVIDER=paddle

Stripe's own merchant-of-record product is supported too — and the kit watches it.

Stripe applies it per transaction. When a sale misses an eligibility check it silently falls back, leaving you as the legal seller, holding the tax liability you thought you had handed over. Nuxavel detects that and tells you.

Stripe sells the capability. Nobody else ships the alarm.

Only need Stripe? Stripe is the default. Merchant of record is a flag you can ignore entirely.

Type safety

Your API contract can't drift.

Rename a field in PHP and the TypeScript types regenerate from it. The frontend then refuses to compile until every use is fixed — instead of shipping and reading undefined in production.

1 — change the backend

class UserData extends Data
{
    public function __construct(
        public int $id,
        public string $name,
-       public string $email,
+       public string $email_address,
    ) {}
}

2 — regenerate, then typecheck

$ composer types
$ npm run typecheck

error TS2339: Property 'email' does not
exist on type 'UserData'.

  app/pages/settings.vue:42
  app/components/TeamSwitcher.vue:19

Two files you'd have forgotten, found in four seconds, before anyone deployed anything.

Pricing

Buy once. Ship forever.

Roughly what two hours of contract work bills for — against weeks of building the same plumbing again.

Solo

Most developers

$149once

Unlimited projects, yours and your clients'.

Get Nuxavel — $149
  • The full Laravel 13 + Nuxt 4 source, yours to own
  • Sanctum SSR auth, teams, roles and invitations
  • Stripe and Paddle billing, merchant-of-record ready
  • AI assistant with credit metering
  • Admin panel, resource builder and revenue metrics
  • English, Portuguese and Spanish throughout
  • 372 tests and the Docker setup that runs them
  • Lifetime updates over Git

Team

$349once

Up to 10 developers at one company.

Get the team licence
  • One licence for the company — not one purchase per developer
  • Add developers as they join, up to 10, at no extra cost
  • A single invoice with VAT handled

Everything in Solo, for the whole team

  • The full Laravel 13 + Nuxt 4 source, yours to own
  • Sanctum SSR auth, teams, roles and invitations
  • Stripe and Paddle billing, merchant-of-record ready
  • AI assistant with credit metering
  • Admin panel, resource builder and revenue metrics
  • English, Portuguese and Spanish throughout
  • 372 tests and the Docker setup that runs them
  • Lifetime updates over Git

The only thing you may not do is resell Nuxavel itself as a starter kit.

FAQ

The things people ask first.

Is this a template or a framework?
Neither. It is a real Laravel app and a real Nuxt app that you clone and own. No vendor package, no licence key phoning home, nothing to strip out later.
Can I use it for client work?
Yes — unlimited projects, yours and your clients'. The only restriction is that you may not resell Nuxavel itself as a starter kit.
Do I need Stripe, Paddle or Anthropic accounts to try it?
No. It runs with zero API keys: the AI assistant answers from an offline driver, email lands in a local inbox, and paid plans render as non-purchasable. Add keys when you want the real thing.
What if I only need Stripe and not the tax handling?
Stripe is the default. Merchant of record is one config value you can ignore completely.
How is this different from a free starter on GitHub?
Free starters give you auth and a dashboard. The weeks go into the parts they stop at — Sanctum working through Nuxt SSR, per-seat billing that survives a plan change, webhooks that actually update your database, emails that arrive in the recipient's language.
Why Laravel 13 and Nuxt 4 specifically?
Because a decoupled SSR frontend is the part people get stuck on. If you wanted Blade or Inertia, Laravel already ships excellent starters for free. This exists for the harder arrangement.
Can I try it before buying?
Yes — there is a live demo with seeded data, linked at the top of this page. Sign in with the credentials shown there and click around.
What is the refund policy?
A licence gives you the complete source code the moment you buy, so purchases are not refundable — once the code is yours, it cannot be returned. That is why the live demo exists: try the real application first, and reach out with any question before you buy rather than after.

Start with the part that makes you money.

The auth, the teams, the billing, the tax problem and the admin panel are done. What's left is your actual product.

Get Nuxavel — $149 once

One payment. Unlimited projects. 372 tests included.