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!