Run your workspace
Audit log
Every workspace ships with an immutable audit trail at
/app/audit. Admin and Owner roles can browse, filter,
and inspect entries; Editor and Viewer are blocked.
What gets logged
The application writes to audit_logs for any action
that materially changes workspace state or surfaces compliance
exposure. Examples include:
- Member invitations, role changes, removals.
- Integration connect / disconnect (Slack, Teams, webhooks).
- Integration webhook delivery failures (so broken Slack URLs are visible without tailing logs).
- GDPR data-subject-request exports
(
dsr.exported) and erasures (dsr.erased). - Billing-plan changes initiated from the admin UI.
Each row carries: action slug, entity type / id, actor user (or
System when triggered by a queue job), originating IP,
user agent, and a before / after JSON
snapshot.
Filtering
The toolbar accepts:
- Action โ substring match (case-insensitive),
e.g.
dsrshows both exported and erased rows. - Entity type โ dropdown populated with the distinct entity types currently in your workspace's log, so you only see options that actually have history.
- Actor email โ exact match on the user's email; pass an unknown email to surface only system-initiated rows.
- From / To โ bracket
created_at. Either bound is optional.
Filters compose; pagination respects the active filter set.
Retention
Rows are retained indefinitely by default โ small per workspace and load-bearing for compliance reviews. If your buyer's privacy policy requires a hard ceiling, contact support to discuss a retention sweep.
Why no edit / delete
Audit rows are append-only. There is no UI to edit a row, and
the database has no updated_at column on
audit_logs. This is intentional โ a compliance log
that can be rewritten is not a compliance log.
Performance
The table is indexed on (workspace_id, created_at)
and (entity_type, entity_id). A workspace with
tens of thousands of rows still serves the first page in under
50ms. If you need to bulk-export, query the table directly via
the workspace:audit-export Artisan command (planned)
rather than scraping the UI.