10 dic 2025·8 min di lettura

Cronologia di audit unificata: schema e UI per chi ha fatto cosa, quando e perché

Progetta una cronologia di audit unificata che mostri chi ha fatto cosa, quando e perché su login, cambi dati e passaggi di workflow, con uno schema pratico e layout UI.

Cronologia di audit unificata: schema e UI per chi ha fatto cosa, quando e perché

Che cos’è una cronologia di audit unificata (e perché è utile)

Una cronologia di audit unificata è un unico feed leggibile di eventi su tutto il prodotto, ordinato per tempo. Ti permette di capire cosa è successo senza saltare tra strumenti diversi. Invece di avere separati log di login, tabelle di storico del database e tracker di workflow, hai un solo posto che racconta la storia.

I team iniziano a sentire il dolore quando qualcosa va storto: un cliente dice che non ha approvato una modifica, un record si aggiorna “misteriosamente” o un account sembra compromesso. I dati spesso ci sono, ma sono sparsi, etichettati in modo diverso e privi dei piccoli dettagli che trasformano i log grezzi in una spiegazione. Le indagini rallentano e la gente comincia a indovinare.

Una cronologia di audit unificata dovrebbe rispondere a cinque domande:

  • Chi l'ha fatto (utente, servizio o sistema)
  • Cosa è stato fatto (azione e oggetto)
  • Quando è successo (timestamp preciso, con timezone chiara)
  • Dove è successo (web, mobile, API)
  • Perché è successo (motivo, richiesta o approvazione)

Lo scope conta. Per la maggior parte dei prodotti vuoi eventi che coprano login e sessioni, modifiche ai dati CRUD, step di workflow (come approvazioni e cambi di stato) e eventi di sistema chiave (come cambi di permessi o tentativi di accesso falliti). Se riesci a spiegare bene quelli, risolverai la maggior parte delle domande quotidiane di audit.

È utile anche chiarire cosa non è. Una cronologia di audit unificata non è un SIEM completo, né analytics profonde. L'obiettivo è risposte rapide e affidabili per supporto, revisioni di sicurezza e responsabilità interna.

Se costruisci app su una piattaforma no-code come AppMaster, una timeline unificata diventa ancora più utile perché la logica backend, le azioni UI e le integrazioni possono emettere lo stesso formato di evento. Questo rende la “storia” del prodotto coerente per chiunque debba leggerla.

Eventi da includere: login, modifiche ai dati, step di workflow

Una timeline unificata funziona solo se attinge dai posti in cui avvengono le azioni reali. La maggior parte dei prodotti ha quattro fonti principali: autenticazione (login e sessioni), modifiche ai dati (create, update, delete), step di workflow (approvazioni, assegnazioni, cambi di stato) e integrazioni (webhook, import, bot).

Inizia definendo un piccolo set di categorie di evento e mantienile. Le categorie dovrebbero descrivere l'intento, non l'implementazione. Per esempio, un reset della password e la rotazione di una chiave API sono entrambi eventi di accesso, anche se provengono da sistemi diversi. Usa nomi coerenti come access.login.succeeded o data.customer.updated così le persone possono scansionare la timeline velocemente.

Non tutto ha bisogno di essere tracciato. Una regola pratica: registra azioni che cambiano stato, modificano l'accesso o innescano risultati di business. Salta il rumore come page view, autosave e retry di background ripetuti, a meno che non servano a spiegare un incidente.

Rendi espliciti i tipi di actor così il “chi” non resta mai indovinato. Una voce di timeline dovrebbe indicare chiaramente se l'azione è stata effettuata da un utente, un admin, un account di servizio o un'automazione.

Un semplice set di gruppi di eventi per iniziare:

  • Access: login riuscito/fallito, logout, cambi MFA, reset password
  • Data: record creato/aggiornato/eliminato, modifiche di massa, esportazioni
  • Workflow: cambio di stato, approvazione/reiezione, assegnazione, violazione SLA
  • Integration: import completato/fallito, webhook ricevuto, sync esterno
  • Admin/security: cambi di ruolo, cambi permessi, eventi chiave API

Se la tua app è multi-tenant, includi l'identificatore tenant in ogni evento. Registra anche l'ambiente (prod, staging, dev) così non mescoli timeline durante le indagini.

Il modello dati minimo che rende le timeline leggibili

Una timeline sembra unificata solo quando ogni riga risponde alle stesse domande basilari. Se ogni sistema registra in modo diverso, si finisce con una schermata di record criptici invece che con una storia chiara.

Standardizza ogni evento in una forma semplice. Puoi memorizzare dettagli extra dopo, ma la timeline dovrebbe avere sempre un headline coerente.

I cinque campi che devono essere presenti

Questi sono i campi minimi che rendono una singola riga comprensibile senza aprire il pannello dettagli:

  • event_id: un ID unico e stabile così le persone possono riferirsi all'evento esatto
  • timestamp: quando è successo (idealmente con millisecondi)
  • actor: chi l'ha fatto (utente, account di servizio, automazione)
  • action + target: cosa è successo e su cosa (per esempio “updated” + “Invoice #1042”)
  • outcome: successo/fallimento (e un breve reason code se è fallito)

Questo già rende la timeline leggibile. Ma le indagini di solito coinvolgono catene di eventi, non singole righe.

I tre ID che trasformano i log in una storia

Aggiungi alcuni identificatori che ti permettono di seguire l'attività tra schermi, API e lavori di background:

  • correlation_id: un intento utente attraverso più passaggi (click -> validation -> update -> notification)
  • session_id: collega gli eventi a una sessione di login e aiuta a individuare condivisione d'account o hijack della sessione
  • request_id (or trace_id): connette chiamate API e job di background alla stessa catena di lavoro

Il tempo è l'ultimo trabocchetto. Memorizza i timestamp in UTC e mantieni un campo timezone (o la locale dell'actor) così l'interfaccia può mostrare l'ora locale mantenendo l'ordinamento corretto.

Esempio: un utente clicca “Approve refund.” La timeline può mostrare un'azione visibile, mentre correlation_id raggruppa l'approvazione, il cambio di stato, l'email al cliente e qualsiasi step di payout automatizzato in un unico thread coerente.

Proposta di schema: tabelle e campi (pratico, non perfetto)

Una timeline di audit unificata funziona meglio quando memorizzi un evento per momento, quindi aggiungi i dettagli a parte. Mantieni la riga core piccola e consistente, e lascia che i dettagli di cambiamento varino.

Tabelle core

Quattro tabelle coprono la maggior parte dei prodotti:

  • audit_event: id, tenant_id, occurred_at, event_type (login, data_change, workflow), actor_id, target_type, target_id, summary, ip, user_agent, request_id, correlation_id, why_id (nullable)
  • audit_actor: id, tenant_id, actor_type (user, api_key, system), user_id (nullable), display_name, role_snapshot (optional JSON)
  • audit_target (opzionale, se vuoi molti target per evento): event_id, target_type, target_id, label (per esempio, “Invoice INV-1042”)
  • audit_change: event_id, field_path (per esempio, billing.address.city), old_value_json, new_value_json, value_type, redacted (bool)

Per i target, il modello più semplice è target_type + target_id su audit_event. Se un evento tocca più record, aggiungi audit_target e mantieni il target primario su audit_event per filtri veloci.

Per i valori, memorizzare righe per campo in audit_change mantiene l'interfaccia leggibile e ricercabile. Se serve anche uno snapshot completo, puoi aggiungere old_record_json e new_record_json su audit_event, ma rendili opzionali per controllare lo storage.

Campi workflow

Per gli step di workflow, aggiungi colonne su audit_event (popolate solo quando event_type='workflow'): workflow_id, step_key, transition_key, from_status, to_status, result (success, blocked).

Indici che mantengono le query veloci

La maggior parte delle schermate fa query su “attività recente per tenant”, “tutto su un record” o “tutto per una persona”. Indicizza per quei percorsi:

  • (tenant_id, occurred_at desc)
  • (tenant_id, target_type, target_id, occurred_at desc)
  • (tenant_id, actor_id, occurred_at desc)
  • Su audit_change: (event_id), e (field_path) se filtri per campo

Catturare il “perché”: motivi, approvazioni e contesto

Choose your deployment path
Deploy to your cloud or export source code when you need full control over auditing.
Get Started

Una timeline che mostra solo “chi ha fatto cosa e quando” lascia ancora irrisolta la domanda più difficile: perché l'hanno fatto? Senza un perché chiaro, le indagini diventano congetture e le persone inseguono thread di chat e ticket vecchi.

I reason code battono il testo libero (nella maggior parte dei casi)

Il testo libero aiuta, ma è disordinato. La gente usa frasi diverse per la stessa cosa o dimentica di scrivere. Un breve e coerente reason_code ti dà filtri puliti, mentre un opzionale reason_text aggiunge dettaglio umano quando serve.

Metti entrambi sull'evento (o sulla transizione di workflow) così ogni voce può portare contesto:

  • reason_code (obbligatorio quando l'azione cambia dati o stato)
  • reason_text (opzionale, breve e verificata)

Un approccio pratico è definire 10–30 reason code per area dominio (billing, access, orders, support). Mantienili stabili e aggiungi nuovi codici lentamente.

Approvals e contesto di automazione

“Perché” spesso significa “perché una policy lo ha imposto” o “perché qualcuno l'ha approvato”. Cattura il contesto di approvazione come campi strutturati così puoi rispondere in fretta senza aprire un altro sistema.

Per qualsiasi evento approvato, automatizzato o eseguito per conto di qualcuno, memorizza questi campi quando rilevanti:

  • approved_by_actor_id e approved_at
  • approval_rule_id (o policy_name) e decision (approved/denied)
  • reference_id (ticket, case o numero di change request)
  • automation_rule_name e rule_version
  • automation_inputs (parametri minimi e sicuri come threshold=5000)

Una cautela: i campi "why" sono luoghi comuni dove possono trapelare segreti. Non memorizzare password, chiavi API, token di sessione completi o dettagli di pagamento grezzi in reason_text o automation_inputs. Se un valore è sensibile, conserva una versione redatta (ultime 4 cifre) o un puntatore come token_present=true.

Esempio: viene aumentato un limite di rimborso. La timeline legge “Limit changed from 500 to 5000”, con reason_code=RISK_REVIEW, approved_by=Maria, policy=RefundLimitPolicy v3, reference_id=CASE-18422 e automation_rule_name vuoto (manuale). Quella singola voce spiega la decisione senza ulteriori ricerche.

Layout UI: una schermata che risponde alle domande rapidamente

Una buona cronologia di audit unificata è una pagina che sembra al tempo stesso risultati di ricerca, una storia e una ricevuta. L'obiettivo è la velocità: dovresti riuscire a individuare cosa è successo in 10 secondi, poi aprire una riga e ottenere abbastanza contesto per agire.

Un semplice layout a 3 pannelli

Metti tutto su una schermata con tre aree: un pannello filtri a sinistra, la lista timeline al centro e un drawer dettagli a destra (o un pannello laterale). La lista resta visibile mentre ispezioni i dettagli, così non perdi il contesto.

Mantieni pochi filtri ma utili. Inizia con quelli che le persone usano durante un incidente o una chiamata di supporto:

  • Intervallo di date (con preset rapidi come ultima ora, ultime 24 ore)
  • Actor (user, API key, system)
  • Target (record, tipo oggetto, istanza di workflow)
  • Tipo di evento (login, update, approval, export)
  • Outcome (success, failed, denied)

Al centro, ogni riga dovrebbe rispondere a “chi ha fatto cosa, quando e perché” senza aprire nulla. Includi timestamp (con timezone), nome actor (e ruolo se rilevante), verbo d'azione, etichetta del target e un breve snippet del motivo quando presente. Se non c'è motivo, mostra un placeholder chiaro come “No reason provided” invece di lasciare vuoto.

Drawer dettagli: provarlo

La vista dettagli è dove guadagni fiducia. Mostra il contesto completo: IP e device per i login, i campi esatti cambiati con valori prima/dopo per le modifiche ai dati, e lo step di workflow, l'assegnatario e la decisione per le approvazioni.

Aggiungi una striscia compatta “Related events” sopra il payload così puoi saltare a step vicini come “Request created” -> “Manager approved” -> “Payment failed”. Includi un toggle per il payload raw per auditor e ingegneri, ma tienilo nascosto di default.

Rendi gli stati di fallimento evidenti. Usa uno stile chiaro per esiti negati o falliti e mostra un messaggio tipo “Permission denied” o “Validation failed” così gli utenti non devono indovinare.

Passo dopo passo: come costruirlo in un prodotto reale

Make logs tell a story
Add correlation_id, session_id, and request_id to make investigations easy to follow.
Build Now

Tratta la tua timeline di audit come una feature di prodotto, non come un ammasso di log. Se support e compliance non riescono a rispondere “chi ha fatto cosa, quando e perché” in meno di un minuto, serve un altro giro di miglioramenti.

Un ordine di costruzione che funziona per la maggior parte delle app:

  • Definisci prima una piccola tassonomia di eventi e i campi richiesti. Decidi cosa conta come evento e bloccati sui campi must-have: actor, time, action, object, outcome e correlation ID.
  • Instrumenta le fonti che già conoscono la verità. L'auth emette eventi di login e token, i layer CRUD emettono create/update/delete con i campi cambiati e i motori di workflow emettono step e decisioni.
  • Scrivi gli eventi in uno store di audit append-only. Non aggiornare le righe di audit. Valida strettamente in scrittura (actor mancante, object ID mancante, timestamp non valido) così non “correggi dopo” e perdi fiducia.
  • Costruisci le letture che rispecchiano come le persone indagano. Di solito servono tre viste: la timeline principale, il pannello dettagli evento e query di “related events” (stesso correlation ID, stesso oggetto, stesso actor, stessa session).
  • Aggiungi controllo accessi basato sui ruoli e testa come farebbe il team di support. I dati di audit spesso contengono campi sensibili, quindi filtra per ruolo e maschera i valori dove necessario.

Se costruisci questo in AppMaster, puoi modellare le tabelle di audit nel Data Designer, emettere eventi dal Business Process Editor nei punti dove si prendono decisioni e rendere la timeline e i dettagli affiancati nei builder UI.

Prima di dichiararlo finito, esegui uno scenario reale: un manager segnala che il totale di un ordine è cambiato. Support dovrebbe poter vedere il campo esatto cambiato, l'utente e l'IP, lo step di workflow che lo ha scatenato e il motivo dichiarato (o “nessuno fornito”) senza saltare tra schermate.

Errori comuni che rendono le timeline inutili

Include the why, not guesses
Capture reason codes and approvals so support can answer why changes happened.
Get Started

Una cronologia di audit unificata funziona solo se le persone si fidano e la leggono velocemente. La maggior parte delle timeline fallisce per motivi prevedibili.

Il primo è l'over-logging. Se ogni page view, hover e autosave appare come evento, i momenti importanti scompaiono. Mantieni la timeline focalizzata su azioni che cambiano accesso, dati o risultati. Se ti servono log tecnici ad alto volume, tienili separati e connettiti internamente tramite un event ID.

L'under-logging è altrettanto grave. Una voce che dice “Record updated” senza actor, target o risultato chiaro non aiuta. Ogni evento dovrebbe includere chi l'ha fatto, su cosa, quando è successo e cosa è cambiato. Se il prodotto richiede un motivo (o un'approvazione), memorizza quel contesto sull'evento, non in un sistema separato che la gente non vede durante l'indagine.

Log mutabili distruggono la fiducia. Se gli admin possono modificare o cancellare eventi di audit, non hai più una trail di audit ma appunti. Tratta gli eventi di audit come append-only. Se qualcosa è stato registrato in modo errato, scrivi un evento correttivo che spieghi la correzione.

Verbi inconsitenti rendono filtraggio e scansione dolorosi. “Updated”, “changed” e “edited” non dovrebbero essere tre tipi diversi per la stessa azione. Scegli un piccolo set di verbi e attieniti a esso, per esempio: created, updated, deleted, approved, rejected, logged_in, permission_changed.

Infine, non far trapelare dati sensibili. I diff raw spesso contengono password, token, dati personali o dettagli di pagamento. Memorizza solo ciò che serve, maschera i campi sensibili e limita chi può vedere certi dettagli evento. Per esempio, mostra “Phone number changed” ma nascondi i valori vecchi e nuovi a meno che il visualizzatore abbia permesso specifico.

Checklist rapida prima del rilascio

Testa la timeline come farebbe un operatore di supporto e un revisore di sicurezza. Scegli un record sensibile (per esempio un'impostazione di payout cliente) e prova a spiegare cosa è successo usando solo la schermata timeline.

Domande per verificare:

  • Puoi sempre nominare l'actor? Per record sensibili, mostra “performed by” (utente, account di servizio o sistema), più ruolo e metodo di autenticazione usato (password, SSO, API key).
  • Puoi provare cosa è cambiato? Per campi chiave, mostra i valori prima e dopo, non solo “updated.” Se un valore è troppo sensibile, mostra una versione mascherata più un hash così puoi comunque provare che il cambio è avvenuto.
  • Puoi seguire un'azione end-to-end? Assicurati che un correlation_id colleghi login, azione UI, step di workflow e scritture DB in un thread unico.
  • Il support riesce a trovare l'evento giusto velocemente? Conferma che i filtri funzionano per actor, target (tipo record e ID), range temporale e outcome (success, failed, denied).
  • L'accesso agli audit è controllato e le esportazioni sono tracciate? Restringi chi può vedere ed esportare i dati di audit, e registra ogni view/export come suo evento (chi, quando, cosa è stato esportato).

Un semplice test finale: consegna la timeline a qualcuno che non l'ha costruita e chiedi “Perché questo record è cambiato alle 15:12?” Se non riesce a rispondere in 60 secondi, probabilmente servono più campi di contesto (reason, request ID, approvazione o dettagli di errore).

Esempio: indagare una modifica sospetta in pochi minuti

Build your audit timeline fast
Model an audit_event schema and start capturing who did what, when, and why in one place.
Try AppMaster

Un manager di support ti scrive: “Il record cliente per Acme Corp è sbagliato. L'email di fatturazione è cambiata e il cliente dice che nessuno del loro team l'ha fatto.” Apri la tua cronologia di audit unificata e cerchi l'ID cliente.

La timeline mostra una catena chiara perché ogni evento correlato condivide lo stesso correlation_id.

Prima, vedi un login: Sam (sales rep) ha effettuato l'accesso alle 09:12 da un nuovo dispositivo e una posizione insolita. Il blocco sessione include IP, user agent e stato MFA. Due minuti dopo, vedi “View customer record”, seguito da “Edit customer record”.

L'evento di aggiornamento record è facile da leggere. Elenca i campi esatti cambiati (billing email da vecchia a nuova) e la sorgente (web app). Subito sotto, il “perché” appare come reason code: Customer requested update, ma la nota è vuota.

Poi, le voci di workflow spiegano cosa è successo dopo l'edit. Una regola di automazione è partita: “If billing email changes, notify finance and require approval.” La timeline mostra uno step di approvazione in pending, e infine un'approvazione da Dana (team lead) alle 09:18 con una breve nota: “Approved per ticket #4812.”

Il support può risolvere il caso senza indovinare:

  • Verificare l'actor: il login di Sam sembra sospetto (nuovo dispositivo, nessuna nota), quindi confermi se Sam possiede la sessione.
  • Confermare l'intento: la nota di approvazione di Dana rimanda a un ticket; se questo non esiste, è un campanello d'allarme.
  • Ripristinare in sicurezza: crea un evento correttivo che ripristina l'email vecchia, con un motivo obbligatorio come “Reverted due to suspected account misuse.”
  • Documentare l'esito: aggiungi una nota di caso collegata allo stesso correlation_id così i revisori futuri vedono l'intera storia.

Passi successivi: distribuirlo in sicurezza e mantenerlo gestibile

Una cronologia di audit unificata è utile solo se le persone si fidano. Tratta la prima release come un sistema di sicurezza, non come una schermata carina.

Stabilisci obiettivi chiari per retention, velocità di ricerca e costo. Molti team adottano un approccio semplice: 90 giorni “hot” (veloci), 1–2 anni “warm” (più lenti) e archivi a lungo termine.

Definisci cosa significa “veloce” prima di rilasciare. Se la timeline deve aprirsi in meno di 2 secondi per un record tipico, pianificalo: indicizza per (target_type, target_id, occurred_at), mantieni i payload piccoli e archivia le righe vecchie invece di far crescere indefinitamente una tabella.

Rilascia a step piccoli così la vista resta pulita e i dati coerenti:

  • Prototipa l'UI della timeline con 5–8 tipi di evento che coprono indagini reali.
  • Aggiungi regole di retention e archiviazione prima di aumentare il volume degli eventi.
  • Aggiungi ricerca e filtri di base (actor, intervallo date, tipo evento).
  • Valida con casi reali: “Il support può rispondere chi ha cambiato questo e perché?”
  • Espandi i tipi di evento solo dopo che la vista core è affidabile.

Export e reporting sono allettanti, ma amplificano gli errori. Aspetta che la timeline on-screen sia affidabile e che i nomi evento e il contesto siano stabili. Poi aggiungi esportazioni che rispettino le regole di accesso e includano timezone, filtri usati e un identificatore tamper-evident (come un export ID).

Pianifica i ruoli presto, perché i dati di audit spesso contengono dettagli sensibili:

  • View timeline (la maggior parte dello staff che lavora con il record)
  • Export (limitato a lead o compliance)
  • View raw payloads (security, engineering o admin only)
  • Manage retention policies (solo admin)

Se costruisci questo in AppMaster, un approccio pulito è mappare lo schema nel Data Designer, poi emettere eventi timeline dai Business Processes negli stessi punti dove applichi le regole (approvazioni, cambi di stato, edit). Questo aiuta a mantenere “chi ha fatto cosa, quando e perché” coerente tra web e mobile ed è più facile da mantenere man mano che i workflow evolvono.

FAQ

What exactly is a unified audit timeline?

Una unified audit timeline è un unico flusso cronologico di eventi importanti su tutto il prodotto. Rende le indagini più veloci perché puoi vedere chi ha fatto cosa, quando, dove e perché senza saltare tra i log di autenticazione, la cronologia del database e gli strumenti di workflow.

Which events should I include first to get value quickly?

Di norma registra azioni che cambiano stato, modificano l'accesso o attivano un risultato di business. Questo include tipicamente login/sessioni, operazioni create-update-delete, transizioni di workflow (approvazioni e cambi di stato) e modifiche admin/security come ruoli e chiavi API.

What’s the minimum data model that makes the timeline readable?

Mantieni un unico formato coerente per gli eventi: event_id, timestamp, actor, action + target e outcome. Aggiungi poi identificatori come correlation_id, session_id e request_id per seguire un'azione end-to-end attraverso UI, API e job di background.

How should I name and group event types so they’re easy to scan?

Usa nomi stabili e coerenti che descrivono l'intento, non l'implementazione. Una piccola tassonomia come access.login.succeeded o data.customer.updated aiuta le persone a scansionare rapidamente e filtrare senza dover imparare le specificità di ogni sottosistema.

Should audit timestamps be stored in UTC or local time?

Conserva i timestamp in UTC per garantire un ordinamento corretto e coerente, e converti in ora locale nell'interfaccia. Conserva anche un campo timezone (o la locale dell'actor) così chi legge capisce l'orario mostrato senza compromettere l'ordinamento.

How do I capture the “why” without messy free-text notes?

Cattura il “perché” come dati strutturati: un reason_code obbligatorio per le modifiche significative, più un opzionale reason_text breve quando serve. Se sono coinvolte approvazioni o policy, memorizza chi ha approvato, il momento della decisione e un reference ID così la voce del timeline è comprensibile da sola.

Should audit logs be editable if someone makes a mistake?

Di default gli eventi di audit devono essere append-only: non modificare né cancellare le righe di audit. Se qualcosa va corretto, scrivi un nuovo evento di correzione che faccia riferimento all'event_id originale, così i lettori vedono cosa è successo e perché è stata fatta la correzione.

What UI layout works best for a unified audit timeline screen?

Parti con un layout a tre pannelli semplice: filtri a sinistra, lista timeline al centro e un pannello dettagli a destra. La lista deve rispondere a "chi/cosa/quando/perché" a colpo d'occhio; la vista dettagli deve mostrare le prove come IP, dispositivo e valori prima/dopo.

What are the most common mistakes that make audit timelines useless?

I più comuni errori sono: sovraccaricare di log (troppe page view e autosave che nascondono le azioni importanti), sottologgare (voci vaghe come "Record updated" senza attore o dettagli), verbi incoerenti, mancanza di correlation ID e fuga di dati sensibili nelle diff o nei campi di reason.

How would I build this in AppMaster without writing a lot of code?

In AppMaster, mappa le tabelle di audit nel Data Designer, emetti eventi dal Business Process Editor nei punti decisionali chiave e costruisci l'interfaccia timeline con i builder web/mobile. Un formato evento unificato è particolarmente utile quando azioni UI, logica backend e integrazioni scrivono lo stesso schema evento.

Facile da avviare
Creare qualcosa di straordinario

Sperimenta con AppMaster con un piano gratuito.
Quando sarai pronto potrai scegliere l'abbonamento appropriato.

Iniziare