Salta al contenuto principale
Tecnologia

Come Creare un Software as a Service (SaaS) con Laravel

Guida pratica allo sviluppo di applicazioni SaaS: multi-tenancy, billing, subscriptions e scalabilità.

Giovanni D'Ippolito
3 min di lettura
Autore
Giovanni D'Ippolito
Pubblicato
17 December 2025
Lettura
3 minuti
Tags
#SaaS #Laravel #Multi-tenancy #Subscription

SaaS: Il Modello di Business del Futuro

Software as a Service (SaaS) è il modello di business più redditizio nel tech. Scopri come crearne uno con Laravel.

Cos'è un SaaS?

Un SaaS è un'applicazione web accessibile tramite subscription, dove ogni cliente ha il proprio spazio isolato (tenant).

Esempi di SaaS di Successo

  • Slack: Comunicazione aziendale
  • Salesforce: CRM cloud
  • Shopify: E-commerce platform
  • Mailchimp: Email marketing
  • Trello: Project management

Multi-Tenancy in Laravel

<?php
// Tenancy Package
composer require spatie/laravel-multitenancy

// Tenant Model
class Tenant extends Model
{
    protected $fillable = ['name', 'domain', 'database'];

    public function users()
    {
        return $this->hasMany(User::class);
    }

    public function makeCurrent()
    {
        // Switch database connection
        config([
            'database.connections.tenant.database' => $this->database
        ]);

        DB::purge('tenant');
        DB::reconnect('tenant');

        app()->instance('currentTenant', $this);
    }
}

// Middleware
class SetTenant
{
    public function handle($request, $next)
    {
        $domain = $request->getHost();

        $tenant = Tenant::where('domain', $domain)->firstOrFail();
        $tenant->makeCurrent();

        return $next($request);
    }
}
?>

Sistema di Subscription

<?php
// Laravel Cashier per Stripe
composer require laravel/cashier

// Subscription Model
class Subscription extends Model
{
    public function isPlan(string $plan): bool
    {
        return $this->stripe_plan === $plan;
    }

    public function canAccessFeature(string $feature): bool
    {
        $features = config("plans.{$this->stripe_plan}.features");
        return in_array($feature, $features);
    }
}

// Subscription Controller
class SubscriptionController extends Controller
{
    public function subscribe(Request $request, string $plan)
    {
        $user = auth()->user();

        // Crea subscription con Stripe
        $user->newSubscription('default', $plan)
            ->trialDays(14)
            ->create($request->payment_method);

        return redirect()->route('dashboard')
            ->with('success', 'Subscription attivata!');
    }

    public function cancel()
    {
        auth()->user()->subscription('default')->cancel();

        return back()->with('success', 'Subscription cancellata');
    }
}
?>

Piani e Feature Flags

<?php
// config/plans.php
return [
    'starter' => [
        'name' => 'Starter',
        'price' => 9.99,
        'features' => [
            'projects' => 5,
            'users' => 2,
            'storage' => 1, // GB
            'api_access' => false,
        ]
    ],
    'professional' => [
        'name' => 'Professional',
        'price' => 29.99,
        'features' => [
            'projects' => 50,
            'users' => 10,
            'storage' => 10,
            'api_access' => true,
        ]
    ],
    'enterprise' => [
        'name' => 'Enterprise',
        'price' => 99.99,
        'features' => [
            'projects' => -1, // unlimited
            'users' => -1,
            'storage' => 100,
            'api_access' => true,
            'priority_support' => true,
        ]
    ]
];

// Usage Tracking
class UsageTracker
{
    public static function canCreateProject(User $user): bool
    {
        $plan = $user->subscription->plan;
        $limit = config("plans.{$plan}.features.projects");

        if ($limit === -1) return true;

        return $user->projects()->count() < $limit;
    }

    public static function recordStorageUsage(User $user, int $bytes)
    {
        $user->tenant->increment('storage_used', $bytes);

        $limitGb = config("plans.{$user->subscription->plan}.features.storage");
        $limitBytes = $limitGb * 1024 * 1024 * 1024;

        if ($user->tenant->storage_used > $limitBytes) {
            throw new StorageLimitExceededException();
        }
    }
}
?>
Con Laravel Cashier e Stripe puoi gestire subscription, trial, upgrade/downgrade automaticamente!

Articoli Correlati

Tecnologia

REST API vs GraphQL: Quale Scegliere nel 2024?

Un confronto approfondito tra REST e GraphQL per aiutarti a scegliere la soluzione giusta...

15 Nov 2025 Leggi
Tecnologia

Docker per Sviluppatori PHP: Setup Perfetto per Laravel

Configura un ambiente di sviluppo Docker ottimizzato per progetti Laravel.

23 Nov 2025 Leggi
Tecnologia

Modern JavaScript per Sviluppatori PHP

Le funzionalità JavaScript moderne che ogni sviluppatore PHP dovrebbe conoscere.

09 Dec 2025 Leggi

Rimani Aggiornato

Iscriviti alla nostra newsletter per ricevere gli ultimi articoli direttamente nella tua casella di posta.