TL;DR
Laravel Spark is the best billing scaffold for Laravel SaaS — built by Taylor Otwell (Laravel's creator), well-maintained, and includes per-seat billing, team management, and Stripe/Paddle support. At $99/year, it's a subscription not a one-time purchase. For PHP teams building subscription SaaS, it's the standard choice.
What You Get
Price: $99/year (Spark Stripe) or $99/year (Spark Paddle)
Core features:
- Laravel integration (Blade or Livewire frontend)
- Billing: Stripe OR Paddle
- Subscriptions: Monthly/yearly plans
- Per-seat billing (team-based pricing)
- Free trials
- Promo codes
- Invoices and billing history
- Team management (invite, roles, permissions)
- Customer portal
What it's NOT: A full application boilerplate. Spark handles billing and teams; you build the rest of your app on top of Laravel.
Laravel Spark vs Full Boilerplates
This is the critical distinction: Spark is a billing package, not a complete boilerplate.
Laravel Spark adds to your Laravel app:
├── /billing ← Subscription management UI
├── /teams ← Team/organization management
└── /invoices ← Invoice history and downloads
Your app builds on top:
├── /dashboard ← Your product
├── /settings ← Your product
└── /features ← Your product
Compare to Wave (the free alternative that IS a full boilerplate): Wave includes blog, admin, themes, and a complete application foundation. Spark is purpose-built for billing.
The Billing Implementation
Spark's billing is mature and handles edge cases:
// Monthly vs yearly subscription
Route::get('/pricing', function () {
return view('pricing', [
'plans' => Spark::plans(),
]);
});
// Check plan access in controllers
public function dashboard(Request $request)
{
if ($request->user()->subscribed('default')) {
// User has active subscription
}
if ($request->user()->subscribedToProduct('pro')) {
// User is on pro plan
}
}
// Blade directive for feature gating
@spark_can('view-advanced-analytics')
<x-analytics-dashboard />
@endcan
// Per-seat billing — charge by team member count
// Spark handles this automatically
$user->teams()->first()->subscription('default')
->incrementAndInvoice(); // Charge for new seat
// Proration when upgrading mid-cycle
$user->subscription('default')->swap('price_pro_monthly');
// Stripe handles proration automatically
Team Support
Spark's team management is well-implemented:
// Invite team member
$team->invite($email, 'member');
// Check permissions
if ($user->hasTeamRole($team, 'admin')) {
// Admin-only action
}
// Team ownership transfer
$team->transferOwnership($newOwner);
// Member removal with billing update (per-seat)
$team->removeUser($member);
// Spark automatically decrements seat count
Stripe vs Paddle Version
Laravel Spark comes in two flavors:
| Feature | Spark Stripe | Spark Paddle |
|---|---|---|
| Tax compliance | You handle | Paddle handles (MoR) |
| Transaction fee | ~2.9% + $0.30 | ~5% + $0.50 |
| International | Manual VAT | Included |
| Developer control | Maximum | Less |
| Best for | US-focused SaaS | International SaaS |
Paddle version is ideal for international sales where tax compliance is painful.
What's Missing
1. No Admin Panel
Spark doesn't ship an admin dashboard. You see billing data through Stripe/Paddle's dashboards, not an app-level admin.
2. No Full Application Foundation
You need to build or use a separate boilerplate for the application structure. Wave fills this gap (free), but Wave + Spark doubles the packages to maintain.
3. Vue/React Frontend Only
Spark's billing UI requires either Vue or React — no Blade-only option for teams preferring pure server-rendered PHP.
4. Annual Subscription Model
$99/year is affordable, but it's a recurring cost. If you abandon the project, your billing UI may fall behind Laravel releases.
Wave: The Free Alternative
Wave (thedevdojo.com/wave) is a free Laravel SaaS boilerplate that includes its own subscription management:
| Feature | Laravel Spark | Wave |
|---|---|---|
| Price | $99/year | Free |
| Billing | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| Admin panel | ❌ | ✅ |
| Blog | ❌ | ✅ |
| Themes | ❌ | ✅ |
| Active maintenance | ✅ (Taylor) | ✅ |
Spark for billing quality; Wave for a complete application foundation.
Who Should Buy Laravel Spark
Good fit:
- PHP/Laravel teams building subscription SaaS
- Products where billing complexity is a core concern
- International products (Spark Paddle for Merchant of Record)
- Teams adding billing to an existing Laravel app
Bad fit:
- JavaScript-first teams (use ShipFast/Supastarter)
- Projects needing a complete application boilerplate (Wave includes more for free)
- Solo founders who want one-time purchase
Final Verdict
Rating: 4/5
Laravel Spark is the established gold standard for PHP SaaS billing — maintained by Laravel's creator, well-tested, and handles the billing complexity you don't want to build. The annual subscription model is a reasonable price for the maintenance and updates. If you're building a Laravel SaaS, the question isn't whether to use Spark — it's whether to use Spark's billing vs Wave's more complete (but less polished) billing implementation.
Installation and Setup
Spark installs via Composer into an existing Laravel application — it's a package, not a clone:
# Create a new Laravel app first (if needed)
composer create-project laravel/laravel my-saas
cd my-saas
# Install Spark (requires valid license)
composer require laravel/spark-stripe
# Publish Spark assets and config
php artisan spark:install
# Run migrations (adds billing and team tables)
php artisan migrate
# Install Node dependencies and build
npm install && npm run build
Spark adds its own migrations to your database: subscriptions, subscription_items, teams, and team_invitations tables directly via Artisan. These use Laravel Cashier under the hood — the same battle-tested billing layer used by thousands of Laravel applications. After setup, the /billing and /teams routes are live immediately.
The license verification happens at Composer install time — no runtime license checks. Once installed, you own the code and can deploy freely without license servers.
Configuring Your Plans
Plan configuration lives in app/Providers/SparkServiceProvider.php:
use Laravel\Spark\Spark;
use Laravel\Spark\Plan;
class SparkServiceProvider extends ServiceProvider
{
public function boot(): void
{
Spark::useStripe()->withPlans([
(new Plan('Starter', 'price_starter_monthly'))
->monthly()
->features([
'5 projects',
'10 team members',
'Email support',
]),
(new Plan('Pro', 'price_pro_monthly'))
->monthly()
->features([
'Unlimited projects',
'Unlimited team members',
'Priority support',
'API access',
]),
(new Plan('Pro Annual', 'price_pro_annual'))
->yearly()
->features([
'Everything in Pro',
'2 months free',
]),
]);
}
}
The price_* strings are Stripe Price IDs — create these in your Stripe dashboard before configuring Spark. Free trials are one line: add ->trialDays(14) to any plan. Promo codes attach to plans with ->allowPromotionCodes(). Spark handles the Stripe Checkout flow automatically once plans are configured.
Laravel 11 Compatibility and Future Maintenance
Spark is maintained by Taylor Otwell and the Laravel team, which matters for longevity. When Laravel 12 shipped in early 2026, Spark 12 followed within weeks — this maintenance cadence is reliable and significantly better than community-maintained billing packages.
The annual subscription pricing model ($99/year) aligns Spark's incentives with yours: the team is motivated to keep Spark updated because revenue depends on renewals. If you cancel after year one, Spark continues working — you just lose access to future updates and bug fixes. For a $99/year cost, renewing is almost always worth it.
Spark 5.x (current) works with Laravel 11+ and PHP 8.2+. The Livewire-based billing UI is clean and customizable via Blade views published to resources/views/vendor/spark/. Most teams customize the pricing page and billing portal to match their app's design.
Key Takeaways
- Laravel Spark is the standard Laravel billing scaffold — not a full boilerplate, just subscription management and teams
- At $99/year, it's maintained by Laravel's creator and tracks Laravel's release cycle closely
- Supports Stripe or Paddle (separate licenses) — Paddle version handles tax compliance as Merchant of Record for international SaaS
- Per-seat billing, free trials, promo codes, and metered billing are all supported
- Pairs with Wave or your existing Laravel app; Wave gives you the full boilerplate, Spark gives you billing quality
- Skip Spark if you need a complete application foundation — Wave includes billing for free, though less polished than Spark's carefully maintained implementation
- For teams evaluating the PHP ecosystem against JavaScript starters: Spark + Laravel is production-mature with a 10-year track record, while Next.js starters like ShipFast offer larger communities and Vercel-native deployment but require more billing code to write from scratch
- Spark's Cashier foundation means your billing code sits on the same layer used by the broader Laravel ecosystem — questions about edge cases in billing behavior have usually been asked and answered in the Laravel community
- The $99/year renewal is low enough that most active Laravel teams should budget it as a standard dependency cost rather than re-evaluating billing alternatives every year
Spark's Limitations and When to Look Elsewhere
Laravel Spark is purpose-built for subscription billing. This focus is its strength and its constraint. Teams that need features beyond billing — a blog, an admin panel, complex content management, or a frontend-heavy dashboard — need to build or source those components separately. Spark provides no opinions on how your application frontend should look or work. You compose it with your Laravel application.
The Vue/React frontend requirement is a meaningful constraint for teams that prefer Livewire or Alpine.js for their frontend. Spark's billing portal is a Vue or React single-page application embedded in your Laravel blade layout. Teams that have invested in Livewire-based frontends need to either run a Vue app alongside their Livewire components or replace Spark's billing UI with a custom Livewire implementation.
Paddle integration in Spark is less feature-rich than the Stripe implementation. If your primary reason for choosing Spark is Paddle's Merchant of Record model (automatic VAT handling for international sales), verify that the specific Paddle features you need are implemented before purchasing. The Paddle version handles subscriptions and teams, but some of Stripe's more advanced Spark features have Paddle equivalents that are less polished.
The PHP SaaS Ecosystem Beyond Spark
Spark is not the only option for Laravel subscription billing. The alternatives worth evaluating:
Laravel Cashier (free, official) is the underlying billing library that Spark builds on. If you want direct Stripe or Paddle integration without Spark's added UI layer and team management, Cashier handles billing logic cleanly. Teams with custom billing requirements — complex upgrade/downgrade flows, enterprise contract billing, non-standard subscription periods — often find Cashier's lower-level API more flexible than Spark's higher-level abstraction.
Filament + Cashier is an emerging combination that several teams have adopted. Filament's admin panel includes billing-related admin interfaces when you add Cashier, giving you both an admin panel and billing without the Wave + Spark complexity. For B2B products where the admin panel is used as much as the billing portal, this combination is worth evaluating.
Wave (free, thedevdojo) includes a simpler billing implementation that suffices for many early-stage products. For founders validating an idea with simple one-tier subscriptions, Wave's built-in billing avoids the $99/year Spark cost. The upgrade path is clear: start on Wave, add Spark when billing complexity demands it.
Compare Laravel Spark with other Laravel starters on StarterPick.
See our Wave Laravel review for the free full-featured alternative.
Browse best SaaS boilerplates for the complete cross-framework comparison.
Review best FilamentPHP SaaS boilerplates for Laravel starters that combine admin panels with billing.