Skip to main content

Black Friday 2025! Only until December 1st: coupon FRIDAY25 for 40% off Yearly/Lifetime membership!

Read more here
Premium Members Only
Join to unlock this tutorial and all of our courses.
Tutorial Premium Tutorial

Laravel SaaS with Jetstream in 6 Steps: Detailed Guide

January 12, 2023
23 min read

Tutorial last revisioned on June 11, 2025 with Laravel 12

Some time ago I posted a tweet that went viral: it was my vision of how typical Laravel SaaS could be created, by just using the packages and tools from the community.

Jetstream SaaS tweet

In this article, I decided to expand and actually show you how it can be done. That tweet above is exactly the plan of what we'll cover below, in this very long step-by-step tutorial.

The example project is quite simple, with a few CRUDs to manage Tasks and their Categories. You can call it a simple to-do list with SaaS on top.

jetstream tasks page

But we will cover the fundamentals of how those tools work, so you can adopt any of them to your needs, by reading their documentation and experimenting.

So, let's start from scratch, from installing Jetstream starter kit?


Part 1/6. Install Laravel and Jetstream

This part is easy and standard.

1laravel new project
2cd project
3composer require laravel/jetstream
4php artisan jetstream:install livewire

And that's it, we have default Laravel Jetstream installed:

jetstream register page

If you plan to use Jetstreams teams functionality, install Jetstream using the --teams option.


Part 2/6. CRUDs: Category/Tasks

For this basic SaaS, we will create two CRUDs: Categories and Tasks. Categories will be managed by the admin...

Premium Members Only

This advanced tutorial is available exclusively to Laravel Daily Premium members.

Premium membership includes:

Access to all premium tutorials
Video and Text Courses
Private Discord Channel

Comments & Discussion

K
kafex ✓ Link copied!

Perfect short intro ;)

LN
Loganathan Natarajan ✓ Link copied!

thanks for the detailed info!

D
dascorp ✓ Link copied!

@Povilas, Thank you for this. I have tutorial suggestion - it looks you introduced spatie permission to jetstream with teams. I think it needs jetstream teams to be bound with spatie teams. ex. jetstream role assigment for users being invited must be rewriten to gather roles from spatie package not from hardcoded jetstream roles. I even wonder if jetstream teams shall be used at all if we wish to use spatie/permission.

PK
Povilas Korop ✓ Link copied!

Interesting point. To be honest, I've never used Roles in Jetstream Teams, I always use spatie/permission for it.

I just skip the part of Jetstream::role and don't register any roles, instead check the permission with the logic described in the article.

Or did you have any problems with such approach?

D
dascorp ✓ Link copied!

There is one post by Tim Geisendörfer approaching the marriage of jetstream and spatie permissions using teams. While the magic of this marriage is in the mostly middleware the whole logic of managing Jetstream Teams has no binding to Spatie package as Jetstream roles are hardcoded into Jetstream. I wonder if overwriting / changing this function in the JetstreamServiceProvider would actualy do the trick

protected function configurePermissions(): void
    {
        Jetstream::defaultApiTokenPermissions(['read']);

        Jetstream::role('admin', 'Administrator', [
            'create',
            'read',
            'update',
            'delete',
        ])->description('Administrator users can perform any action.');

        Jetstream::role('editor', 'Editor', [
            'read',
            'create',
            'update',
        ])->description('Editor users have the ability to read, create, and update.');
    }

and assign all roles dinamicaly here (pulling it from spatie package)

PK
Povilas Korop ✓ Link copied!

Good question. As I said, I haven't tried it, so the only way is for you to try and see for yourself :)

J
j.kludt ✓ Link copied!

What about the github repository? I think the link does NOT work.

PK
Povilas Korop ✓ Link copied!

Sorry, forgot to make the repo public. Now did it, here's the direct link: https://github.com/LaravelDaily/Laravel-Jetstream-SaaS-Demo

ZA
Zain Amin ✓ Link copied!

Thank you sir

KK
Kaan Karaca ✓ Link copied!

Hi,

I'm following this tutorial but got stuck at this:

"Visually, the layout of the forms and tables will be in Blade files, in the resources/views/categories and resources/views/tasks folders."

Although I've copied over the mentioned diretories I'm receiving exceptions. One is about missing "x-jet-nav-link"-Components. I assume that it is somehow expected to use an editor with auto-import of classes, because the code examples doesn't mention them.

Am I missing a step or pre-requirement?

PK
Povilas Korop ✓ Link copied!

That Blade component (and others) come from Jetstream by default: https://jetstream.laravel.com/3.x/stacks/livewire.html#components

Maybe Jetstream changed something there in the latest version, since writing this article? Hard to say.

KK
Kaan Karaca ✓ Link copied!

well, looking into the changelog revealed that the change happened last year. https://github.com/laravel/jetstream/commit/2dc1e91fd6a7256b5ef4ef1ab5c039d2ad3539a6

Maybe it makes sense to include version numbers into the installation instructions? This would help to avoid that things get outdated too soon. Just my two cents.

PK
Povilas Korop ✓ Link copied!

I'm trying to apply the changes in the future, that's why I changed from only video courses to text-based material, easier to edit. I will take a look how to change the original article for this change, thank you for reporting.