Hammers Lab

Case study

PlayPadel

Piattaforma operativa per un club di padel

Cliente
Club di padel (Italia)
Durata
In corso dal 2024
Ruolo
Unico engineer: dall'architettura alle operazioni

Il problema

Il club gestiva prenotazioni su Playtomic, comunicazioni su WhatsApp e organizzazione partite con fogli di calcolo e memoria. Lo staff passava ore a riconciliare disponibilità campi, rincorrere i no-show e notificare manualmente i giocatori sui cambi orario.

Vincoli

  • L'API Playtomic è la source of truth per le prenotazioni: il sistema deve sincronizzare, non sostituire.
  • I giocatori si aspettano messaggi WhatsApp, non email, e la consegna deve essere affidabile e tracciabile.
  • Budget single VPS: niente Kubernetes, niente queue service gestito, niente complessità operativa superflua.
  • Dati reali di giocatori in produzione: conformità GDPR e scrubbing PII non negoziabili.

Cosa abbiamo costruito

Piattaforma operativa full-stack: pannello admin per lo staff, sync automatica Playtomic, pipeline notifiche WhatsApp, gestione partite e reporting, deployata come container Docker su VPS singola con rollback automatico.

Architettura

Architettura esagonale (ports and adapters) che isola la logica di dominio dalle preoccupazioni infrastrutturali.

  • Domain layer: regole prenotazione, lifecycle partite, policy notifiche. TypeScript puro, zero import da framework.
  • Application layer: use case orchestrano i servizi di dominio attraverso port definiti.
  • Infrastructure adapter: client REST Playtomic, sender WhatsApp Twilio, repository Prisma, error reporting Sentry.
  • Presentation layer: admin UI Next.js con server component e API route tipizzate.
Domain Playtomic Twilio Admin UI Postgres
Diagramma architettura esagonale per PlayPadel

Integrazione Playtomic

Job di sync schedulati recuperano disponibilità campi e prenotazioni dall'API Playtomic. I conflitti vengono rilevati a livello di dominio e mostrati allo staff prima che diventino doppie prenotazioni. L'adapter gestisce rate limit, paginazione e drift di versione API dietro un'interfaccia port stabile.

Outbox WhatsApp / Twilio

I messaggi outbound passano da un outbox transazionale: l'evento di dominio viene persistito prima, poi un worker in background consegna via API WhatsApp Twilio. Invii falliti ritentano con backoff esponenziale; i fallimenti permanenti vengono loggati e mostrati nel pannello admin. Nessun messaggio perso perché la chiamata HTTP è fallita.

Data layer

PostgreSQL con ORM Prisma. Le migration sono versionate e applicate in CI prima del deploy. I cambi schema seguono il pattern expand-contract per evitare downtime sul database single-instance.

Infrastruttura e rollback

Docker Compose su VPS singola. GitHub Actions builda e pusha immagini su GHCR; lo script di deploy fa pull, esegue health check e rollback automatico all'immagine precedente se il nuovo container non parte. Tempo di rollback osservato: sotto i 60 secondi.

Osservabilità

Sentry per error tracking con scrubbing PII configurato a livello SDK: nomi, numeri di telefono e corpi messaggio vengono rimossi prima che gli eventi lascino il server. Logging strutturato per failure delle integrazioni; nessun dato personale nelle righe di log.

Risultati

  • Tempo staff su riconciliazione manuale prenotazioni ridotto da ore al giorno a minuti a settimana.
  • Tasso consegna WhatsApp sopra il 99% con audit trail completo via tabella outbox.
  • Zero downtime non pianificato da deploy falliti da quando è attivo il rollback automatico.
  • La piattaforma gestisce il picco di prenotazioni del weekend senza intervento manuale.

Stack

TypeScript · Node.js · Next.js · PostgreSQL · Prisma · Docker · GitHub Actions · Twilio · Sentry · Cloudflare

Vuoi una demo del pannello admin? Contattaci e ti mostriamo le parti interessanti.

Richiedi una demo

Il tuo progetto potrebbe essere il prossimo.

Siamo selettivi perché siamo piccoli. Se il problema è interessante e il fit c'è, preferiamo andare in profondità che in larghezza.

Parlane con noi