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

Autore

Giovanni D'Ippolito

Pubblicato

17 December 2025

Tempo di 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!

Condividi questo articolo

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 per il tuo...

15 Nov 2025 3 min
Leggi di più →
Tecnologia

Docker per Sviluppatori PHP: Setup Perfetto per Laravel

Configura un ambiente di sviluppo Docker ottimizzato per progetti Laravel.

23 Nov 2025 2 min
Leggi di più →
Tecnologia

Modern JavaScript per Sviluppatori PHP

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

09 Dec 2025 1 min
Leggi di più →

Rimani Aggiornato

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