Asamify
Piattaforma SaaS multi-tenant per saloni di bellezza, barbieri, centri estetici e spa: gestionale B2B (calendario, staff, listino, CRM) e prenotazione online B2C sullo stesso motore di disponibilità, con billing Stripe.
Il problema
Molti saloni gestiscono ancora gli appuntamenti tra agenda cartacea, telefono e messaggi: basta un doppio turno, un giorno di ferie o una chiusura per generare sovrapposizioni, buchi in agenda e clienti persi, senza una vista affidabile sulla giornata.
Quando gestionale e prenotazione online non condividono lo stesso motore di disponibilità, il cliente prenota uno slot che in salone risulta già occupato, oppure chiama perché gli orari mostrati online non corrispondono a quelli reali.
I dati di ogni attività devono restare separati: anagrafiche clienti, appuntamenti, staff e listini di un salone non possono mescolarsi con quelli di un altro, per privacy e per affidabilità operativa.
Il titolare deve fare tutto da solo — listino prezzi e durate, orari di apertura, turni dei dipendenti, ferie, impostazioni di prenotazione — senza supporto tecnico e senza poter sbagliare configurazioni critiche come timezone, orizzonte di prenotazione o finestra di cancellazione.
L'abbonamento è parte del prodotto: trial in scadenza, pagamenti in ritardo e sedi sospese non devono bloccare il titolare fuori dalla pagina dove può pagare e riattivare il servizio.
Come l'ho affrontato
Ho progettato l'onboarding autonomo su form pubblico: la registrazione crea il tenant in stato Trial con 14 giorni di prova e provisiona in modo sincrono il database isolato della sede, con seed di default (orari Lun-Dom e impostazioni: step 15 minuti, orizzonte 30 giorni, cancellazione 24 ore, reminder automatico). Al primo accesso il titolare trova una base funzionante da personalizzare.
Il motore di disponibilità è unico (SlotAvailabilityService): incrocia gli orari di apertura del salone e i turni dello staff — con supporto ai doppi turni e alla pausa pranzo — sottrae chiusure e day off (giornata intera o fascia oraria ripetuta, per sede o singolo operatore, vince il vincolo più restrittivo) e gli appuntamenti già presi. Gestionale e booking usano lo stesso calcolo, quindi mostrano gli stessi slot.
La prenotazione è multi-servizio, con snapshot di prezzo e durata: il cliente combina più trattamenti nello stesso appuntamento (es. Taglio + Barba), le durate e i prezzi si sommano e ogni riga resta congelata, così se il listino cambia dopo la prenotazione non cambia. L'inserimento avviene in transazione con lock pessimistico e vincolo di unicità dello slot: due clienti non possono prenotare lo stesso slot nello stesso momento. Cancellazione in soft-delete che libera lo slot senza perdere lo storico, autoconferma immediata, notifiche e reminder inviati una sola volta.
Ho previsto la prenotazione ospite con soli nome e telefono, senza obbligo di account: storico e cancellazione passano da una verifica leggera con magic-link. La PWA è mobile-first e installabile, con manifesto per-tenant, URL stabile per sede e QR con kit di condivisione per il titolare.
Ho integrato il billing con Laravel Cashier e Stripe: il customer è il tenant, piano unico mensile o annuale con Checkout ospitato e Customer Portal. C'è un solo trial interno di 14 giorni, i webhook sincronizzano lo stato (attivo o sospeso, con grazia sul past_due) e un comando giornaliero gestisce la scadenza del trial. Le pagine di fatturazione restano raggiungibili anche a sede sospesa, così l'Owner può pagare e riattivare quando vuole.

Architettura & Tecnologie
Monolite Laravel con frontend Inertia.js e React, multi-tenancy con Stancl Tenancy v3 in modalità multi-database: un database centrale (piattaforma, tenant, team interno, subscriptions) e un database isolato per ogni salone (utenti, staff, servizi, clienti, appuntamenti, orari), senza chiavi esterne tra centrale e sedi. MySQL per la persistenza, code e job su Laravel Cloud, Cashier Stripe per il billing con webhook dedicati. I ruoli sono definiti come enum PHP (lato piattaforma e lato sede) con autorizzazione via Gate e Policy, gli importi in centesimi e il timezone di ogni sede con storage in UTC.
Caratteristiche principali
Isolamento per sede: un database per salone, i dati di un'attività non toccano quelli di un'altra
Wizard multi-servizio con snapshot: prezzo e durata bloccati alla prenotazione
Anti-overbooking: lock pessimistico in transazione e vincolo di unicità dello slot, anche con prenotazioni simultanee
Disponibilità da intersezione: apertura salone × turni (anche doppi) meno chiusure, day off e appuntamenti presi
Prenotazione ospite senza account + PWA per sede con magic-link per storico e cancellazioni
Reminder di cortesia inviati una sola volta e notifiche di conferma/cancellazione via code
Billing senza blocchi: Owner sospeso atterra sulla fatturazione, trial e sospensioni sincronizzati via webhook e comando giornaliero

In pratica


Risultati
Prodotto in staging: onboarding con trial di 14 giorni, gestionale, booking ospite, PWA per sede e billing già integrati e coperti da una suite di test su provisioning, disponibilità, prenotazione, webhook e scadenze.
Nessuna doppia prenotazione: ogni appuntamento nasce in transazione protetta, con validazione delle sovrapposizioni sugli slot adiacenti e cancellazione soft che libera lo slot senza perdere lo storico.
Configurazione sicura per titolari non tecnici: default pronti al provisioning, disattivazione invece di cancellazione per staff e servizi già usati, vincolo più restrittivo che vince tra salone e operatori.
Billing accessibile in ogni stato: stati Trial/Active/Suspended/Maintenance gestiti centralmente, con la fatturazione raggiungibile dall'Owner per pagare e riattivare.
Un problema simile al tuo?
Parliamone: costruiamo qualcosa che regga al primo colpo e per gli anni a venire.
Parliamone