Skip to content
← All articles

Solo SaaS with Laravel and Nuxt: Five Decisions That Paid Off

Published · Updated · Marten Ackermann

Short answer: A solo SaaS lives or dies by decisions that avoid work: separate auth domains instead of role spaghetti, Stripe Cashier instead of homegrown billing, WebSockets for long-running jobs, tests as a default rather than an afterthought — and a static marketing site that never touches the app bundle.

I built PEX — invoicing and time-tracking software for freelancers and agencies: Laravel API, Nuxt app, customer portal, iOS app, marketing site. Alone. These five decisions paid off most clearly — and since the 1.0 release in September 2026 I know they hold up under real use (see the update).

1. Two auth domains instead of a role matrix

PEX has two fundamentally different user groups: the team writing invoices, and their clients who view and pay invoices in a portal. Instead of squeezing both into one user model with roles, there are two separate guards: Laravel Sanctum for team users, and a dedicated customer guard with bearer tokens for portal clients.

The win: no endpoint can accidentally be reachable by the wrong group — the separation lives in the infrastructure, not in if statements.

2. Stripe Cashier instead of homegrown subscription logic

Building billing yourself is the classic solo trap: proration, failed payments, taxes, dunning. Laravel Cashier covers subscriptions and portal payments; what remains is webhook processing — with retry logic, because webhooks arrive twice, late, or not at all.

Rule of thumb: billing is never the differentiator of a solo product. Buy, don’t build.

3. Make long jobs visible: Horizon + WebSockets

CSV bulk imports in PEX run as background jobs via Laravel Horizon. Progress is streamed live to the frontend over WebSockets (Pusher). That costs one evening of setup and permanently avoids the worst UX there is: a spinner that lies.

4. Tests and CI from day one

In July that meant a little over 100 Pest tests in the backend, Playwright end-to-end tests in the frontend, and four GitHub Actions workflows. As a solo developer there is no second pair of eyes — the test suite is the colleague who objects during refactoring. Without it, I could not have rolled out the shadcn/ui migration or larger feature branches calmly.

5. Marketing static, app dynamic

The marketing site is its own Astro 5 site — static HTML, no app framework, perfect Core Web Vitals. The Nuxt app stays a pure client-side application behind the login. The two worlds have opposite requirements (SEO vs. interactivity); forcing them into one framework makes both worse.

Conclusion

None of these decisions is spectacular. That is exactly the point: a solo SaaS rarely fails from a lack of sophistication — it fails from self-inflicted complexity. Each of these five decisions removed complexity before it could exist.

Update: after the 1.0 release

Added October 2026. On 26 September 2026, PEX shipped version 1.0 to production — with e-invoicing, DATEV export, dunning and tax-advisor access. Here is how the five decisions held up:

  • Auth domains: The tax advisor added a third user group. It is deliberately not a third guard but a role in the team model — read-only, with switching between clients. The rule of thumb that came out of it: a separate guard when the group has nothing to do with the team (clients); a role when it works inside the team’s context.
  • Stripe: Cashier still handles subscriptions. For payments from my users’ clients, Stripe Connect came in, including SEPA direct debit and payment links with a QR code — bought again, not built.
  • Background jobs: The Horizon-plus-live-progress pattern now also carries the e-invoicing pipeline on its own queue. I describe how that’s built in E-Invoicing in Laravel.
  • Tests and CI: A little over 100 tests became more than 2,000 in the backend, plus 2,200+ Vitest tests and a Playwright suite in the frontend. CI runs on a dedicated self-hosted runner, and every change goes through staging and a full regression run before it may reach production.
  • Static marketing: Still right — the marketing site remains a standalone Astro site.

The PEX case study shows what the full system looks like today.