• $139

Modern SaaS Apps with SvelteKit, Stripe, & Supabase

  • Course
  • 73 Lessons

Learn to build SaaS applications with a modern tech stack. You will learn so much more than just collecting payments and handling subscriptions.

This course is designed for intermediate developers. Before considering this course, you should at least be familiar with SvelteKit, TypeScript, and basic web development concepts.

Built Different

Most courses & tutorials show you how to collect payments and check if a user is subscribed, which is a great start, but things become complex immediately after those steps are complete. In this course, we go beyond the surface level. A few of the notable things you will learn are highlighted below.

Granular Access Control

While it's relatively straightforward to protect a specific page given a user's role, limiting features can become tricky. You don't want to hide the feature altogether, as this hides the perks of your higher-tiered plans. In this course, you'll learn how to gracefully restrict specific features of your application to users belonging to a particular plan/tier, along with CTAs to convince the user to upgrade to access that particular feature.

Dynamic Pricing

Many examples out there demonstrate an unideal example of how to set up products and prices in Stripe. They usually require you to hardcode a Price ID somewhere in your code, making experimenting with different pricing a pain. In this course, you'll learn how to set up dynamic pricing, enabling you to test with varying prices without touching your code.

What Stripe Data to Store

While Stripe is an excellent source of truth, it's inefficient and potentially impossible (depending on the scale of your app) to reach out to Stripe for every piece of information about your customer's subscriptions & products. Stripe has rate limits you are especially susceptible to hitting when server-side rendering. In this course, you'll learn what data to store from Stripe and how to keep that data in sync with Stripe as a source of truth.

Customer Self-Service

Providing your customers the ability to upgrade, downgrade, pause, or cancel their subscription is an essential feature of any SaaS application. In this course, you'll learn how to leverage the full potential of Stripe's Customer Portal.

Free Trials with/without Payment Method

Everyone loves a free trial. Subscribing to a product without a trial is like buying a car before test-driving it (maybe a bit exaggerated considering the cost differences, but you get the point). Some users feel uneasy about providing payment information to start a free trial, and some SaaS owners want to require it to prevent abuse of their service. Regardless if you choose one or neither of the free trial options for your SaaS app, in this course, you'll learn how to set up both free trials with and without the payment methods required upfront.

CI/CD Pipeline

Rather than taking the easy route and full-sending our code into production, we'll set up a CI/CD pipeline to run end-to-end tests before deployment. We'll take advantage of GitHub Actions along with Supabase Local Development and Vercel to make this happen.

Course Content

Introduction

Introduction
Preview
What We're Building
Preview
Course Discord Access
Resources

Module 1: Project Setup

1.1 - SvelteKit Project Setup
1.2 - Supabase Local Development
1.3 - Protected Auth Schema
1.4 - Profiles Table & RLS

Module 2: Integrate SvelteKit & Supabase

2.1 - Server-Side Environment
2.2 - Install Supabase SDKs & Generate Types
2.3 - Server-Side Supabase
2.4 - Client Side Supabase

Module 3: User Auth

3.1 - User Registration
3.2 - User Login
3.3 - Protecting Auth Routes
3.4 - User Logout & Navigation
3.5 - Account Page
3.6 - Account Actions

Module 4: CRUD (Create, Read, Update & Delete)

4.1 - Contacts Table & RLS Policies
4.2 - Seeding Supabase
4.3 - Creating Contacts
4.4 - Supabase Admin Client
4.5 - Reading Contacts
4.6 - Updating Contacts
4.7 - Deleting Contacts
4.7.1 - Close Modal on Cancel
4.8 - Seeding Contacts

Module 5: Stripe Introduction

5.1 - Stripe Dashboard Overview
Preview
5.2 - Stripe API & Docs
Preview
5.3 - Setup Stripe CLI
5.3.1 - Stripe CLI WSL Note
5.4 - Products & Prices Overview
5.5 - Creating Products & Prices
5.6 - Lookup Keys
5.7 - Cleanup

Module 6: Stripe & SvelteKit Integration

6.1 - Setup Stripe Node Client
6.2 - Stripe Webhooks & Events
6.3 - Create Webhook Endpoint
6.3.1 - Webhook Script
6.4 - What Data to Store

Module 7: Billing Services

7.1 - Define Billing Tables
7.2 - Products Service
7.3 - Customers Service
7.4 - Subscriptions Service

Module 8: Products, Pricing, & Pricing Page

8.1 - Create Products & Prices
8.2 - Seeding Stripe Data
8.3 - Pricing Page Config
8.4 - Pricing Page

Module 9: Pricing, Checkout, & Billing

9.1 - Checkout Sessions
9.2 - Free Trial Options
9.3 - Stripe Test Clocks
9.4 - Preventing Multiple Trials
9.5 - Test Cards & Failed Payments
9.6 - Subscription & Email Settings
9.7 - Configure Customer Portal
9.8 - Deliver Customer Portal

Module 10: Tier-Based Access Control

10.1 - Validate Tier Helpers
10.2 - Restricting Actions
10.3 - Limiting UI Interactions
10.4 - Prevent Multiple Plans

Module 11: Testing

11.1 - Setup Playwright
11.2 - Auth Flow Tests
11.3 - CRUD Tests

Module 12: CI/CD Pipeline & Production

12.1 - CI/CD Pipeline Overview
Preview
12.2 - Supabase to Production
12.3 - Creating Vercel Project
12.4 - GitHub Actions Workflow
12.5 - Stripe & Supabase in Production
12.6 - Production URL Updates

Module 13: UX Extras

13.1 - Toast Notifications
13.2 - Better Redirects
13.3 - Stripe Branding

Thank you

Thank you

Featured Technologies

This course uses a wide range of incredible projects and technologies, but to showcase the most notable

Meta-Framework

SvelteKit

Language

TypeScript

Auth/Database

Supabase

Payment Processing

Stripe

Schema Validation

Zod

Styles

TailwindCSS

FAQ

Why not just post on YouTube?

Although I have a strong passion for posting YouTube videos and will continue to do so, I felt offering premium course content would be beneficial for the following reasons:

  • You can't go back and update a YouTube video when a library or API changes. You either post a new video, which likely isn't great for the algorithm or update the source code in hopes that the viewers can figure it out themselves. With courses, I can update them as the changes occur, ensuring the viewers always have working examples.

  • The YouTube algorithm doesn't appreciate deep course-level content, and posting that content can have a negative impact on your channel

  • I create all my content outside of a full-time day job. Generating additional income from something I truly enjoy doing would be incredible and incentivize me to continue doing so.

What payment methods are accepted?

This site is set up to accept payments via Stripe, so cards from all over the world are accepted. If enough demand exists, I may accept PayPal as well in the future.

Is there a student discount?

Yes!

If you are actively enrolled in an educational program, you can receive 20% off the full cost of the course. This discount cannot be combined with any other promotions.

The student discount is intended for full-time or part-time students, including boot camps.

To receive a unique discount code, send an email to support@huntabyte.com with proof of enrollment.

What if I don't like the course? Is there a refund policy?

If you truly believe the value provided in this course isn't worth the price you paid, you can reach out by email within the first 30 days and I'll refund your purchase. My only ask is that you provide feedback so that I can improve the material for future students.

Is this course beginner-friendly?

It depends on what you're a beginner at. This course is designed for intermediate-advanced web developers, which means I assume you have experience with TypeScript, SvelteKit, and web fundamentals.

If you're at an intermediate web development level but haven't touched some of the other technologies like Supabase & Stripe, you should be just fine.

Here are some things I assume:

  • You've used SvelteKit to build a site/web app before

  • You know how to use a terminal to run Node/NPM

  • You know how to commit and push code to GitHub using Git

  • You are comfortable with TypeScript

Do you send receipts/invoices for reimbursement?

Yes! Right after purchasing, you should receive a receipt/invoice via email.

Is there a Discord community?

Yes! As soon as this course goes live, there will be a dedicated channel in my Discord for this course. There you can ask questions and receive support from me and other students.

How long will this course take to complete?

This all will depend on you. There will be hours of content to consume, but the course is structured in a way to allow more experienced developers move through more quickly than others.

Is this course only for SvelteKit developers?

Great question, it depends. If you're an experienced Dev with a similar framework like NextJS, picking up SvelteKit is not very difficult. However, I do not spend a ton of time focusing on the basics of SvelteKit in this course. However, I have covered a lot of content for free on my YouTube that you could check out before purchasing this course.

What if I have a question during the course?

Once you purchase the course, you will have permission to a channel in my Discord dedicated to this course. There, you can ask questions and receive support from me and other students along the way.

I thought you were building your own platform?

Well, I have built my own platform, however, that was only the first half of the battle. I realized it was going to be a lot to not only maintain the platform itself but also the email marketing, video hosting service, DDoS/spam protection, etc. by myself while trying to consistently create content.

Podia has attractive plans that fit my requirements at the moment, but in the future should I decide to move to my own platform, I will need to have a small team to assist so I can focus on creating content.

I have a question not listed here!

You can reach me at support@huntabyte.com and I'm more than happy to answer any questions you may have.