M's Works

Parliamo su

Case study2026

Una piattaforma in abbonamento, rifatta su infrastruttura propria

Fuori dal generatore no-code su cui era nata. I contenuti sono davvero riservati a chi paga, l'archivio storico si sposta senza perdite, ogni azione dello staff lascia una traccia.

Area riservata: la sezione news della piattaforma
La landing della piattaforma su smartphone
Cliente
Finanzamille Inc.
Settore
Community finanziaria in abbonamento · Rancho Palos Verdes (CA)
Servizi
Sviluppo Web & App · GDPR & Privacy · Security Audit
Il contesto

News, corsi, documenti di analisi, chat dal vivo e portafogli modello, su una piattaforma generata con un servizio no-code. L'analisi del codice, pagina per pagina prima di scrivere una riga nuova, ha trovato quindici problemi strutturali. Il più grave: un abbonamento decorativo, che mostrava un badge senza proteggere alcun contenuto.

Il problema
  1. Chi non pagava vedeva tutto: l'abbonamento mostrava un'etichetta, non chiudeva una porta.

  2. Tutto dipendeva dal servizio che aveva generato la piattaforma, autenticazione compresa.

  3. Inviti e reset password partivano da un mittente non configurato dal cliente.

  4. Gli abbonamenti erano chiesti a Stripe dal browser, senza webhook: una disdetta poteva passare inosservata.

  5. Nessun registro delle azioni di chi pubblica, modera o cambia i ruoli.

Le decisioni, e il perché

Ogni scelta ha un vincolo dietro

Il vincolo

News, corsi, documenti e community erano leggibili da qualunque utente registrato, abbonato o no.

La scelta

Blocco in due punti indipendenti: la pagina si ferma prima del database, l'azione lato server risponde «paywall» per conto suo.

Perché

Un velo grafico non protegge niente: il testo viaggia comunque nella pagina e si legge dal sorgente. E nascondere un pulsante non chiude l'indirizzo a cui quel pulsante scrive.

Il vincolo

I permessi stavano nelle regole del database, che il nuovo strumento di accesso ai dati scavalca per costruzione.

La scelta

Permessi nell'applicazione, in un unico strato di servizi, con le regole del database accese come seconda rete.

Perché

L'alternativa era combattere lo strumento a ogni interrogazione e mantenere due modelli di sicurezza che prima o poi divergono. Il prezzo è dichiarato: nessuna query fuori dallo strato di servizi. Due revisioni indipendenti hanno poi cercato esattamente le violazioni di questa regola.

Il vincolo

I corsi dovevano ospitare video caricati direttamente e «compattati». L'archivio file in uso conserva i file ma non li ricodifica.

La scelta

Compressione nel browser di chi carica, prima dell'invio. Nessun fornitore video nuovo, nessuna credenziale nuova.

Perché

Un servizio video specializzato costava fra i 2 e i 23 dollari al mese e includeva la ricodifica in più qualità. Il cliente l'ha scartato per non allargare il perimetro dei fornitori che toccano i dati, e il prezzo è stato messo per iscritto invece di essere scoperto dopo: una sola qualità per tutti.

Il vincolo

I dati vivi restavano sulla vecchia piattaforma per tutto lo sviluppo, e non potevano essere scritti nemmeno per sbaglio.

La scelta

Un travaso rieseguibile: lanciato una prima volta per sviluppare su dati veri, identico al passaggio definitivo.

Perché

Un travaso unico si scrive sotto la pressione del go-live, nell'unica esecuzione che non si può rifare. La prima passata ha già fatto emergere le sorprese — colonne che l'autenticazione calcola da sé e righe che puntavano a utenti cancellati anni prima — e la seconda parte da una procedura collaudata.

Il vincolo

Serviva un cruscotto con le statistiche d'uso: accessi, corsi visti, messaggi, andamento degli abbonati.

La scelta

Statistiche costruite in casa sul registro delle attività, con un riepilogo giornaliero per le viste aggregate.

Perché

Uno strumento di analisi esterno si installa in un pomeriggio e ha grafici migliori, ma farebbe uscire il comportamento di ogni iscritto verso un fornitore in più — su una piattaforma che nella propria informativa dichiara di non profilare. Il prezzo è che le aggregazioni ce le scriviamo noi.

Cosa abbiamo costruito

Area riservata agli abbonati

Abbonamenti Stripe con checkout, portale di gestione e webhook — assente nella versione precedente.

Redazione editoriale

Editor di testo formattato, copertine da Unsplash con il credito del fotografo, commenti in fondo all'articolo.

Community in tempo reale

Chat, bacheca, commenti e risposte che compaiono subito, con notifiche alle menzioni.

Corsi con video e allegati

Video compressi nel browser, allegati PDF ed Excel, ripresa dal punto in cui si era rimasti.

Un solo cruscotto

Utenti, ruoli, abbonamenti, documenti, portafogli e statistiche in un posto, con ogni azione registrata.

Il risultato

0,2%

righe scartate nel travaso dell'archivio, tutte di utenti cancellati anni prima: nessuna persa per errore della procedura

17

problemi di sicurezza trovati e corretti in due revisioni indipendenti, fra cui un amministratore che poteva crearsi un account con poteri superiori ai propri

−84%

peso di un video di corso dopo la compressione nel browser, misurato su un file reale: 29,3 MB in 4,8 MB, in 5,6 secondi

Contenuti non più raggiungibili senza abbonamento: le pagine bloccate non leggono nemmeno i dati dal database

Nessuna dipendenza residua dal generatore no-code: autenticazione, email e servizi AI su fornitori contrattualizzati dal cliente

Informativa privacy, cookie policy e termini scritti sul comportamento reale del codice, con le sezioni per UE, Regno Unito, California e Australia

Tecnologie

Next.jsTypeScriptPrismaSupabaseStripeTailwind CSS

Altri progetti

Prossimo passo

Hai un progetto simile?

Raccontaci da dove parti. Ti rispondiamo con una proposta chiara e tempi realistici, senza impegno.