Where to find it
/admin/audit-log — accessible from the sidebar.
What gets logged
Every mutation in the admin dashboard is logged. Examples:| Action | What you’ll see |
|---|---|
| User logs in | auth.login — user, timestamp, IP |
| Booking created | booking.create — booking ID, customer, service |
| Booking status changed | booking.update_status — booking ID, old status → new status |
| Service updated | service.update — service ID, what fields changed |
| Business hours saved | business_hour.update |
| Blocked time created | blocked_time.create |
| Team member invited | user.create — invitee email |
| Payment received | payment.completed — booking ID, amount, provider |
| Settings changed | settings.update — what fields changed |
Each log entry shows
- When — timestamp in your local timezone
- Who — email of the team member (or “system” for automated jobs)
- Action — like
booking.update_status - Entity — the type of thing affected (Booking, Service, etc.)
- Entity ID — the specific record’s ID (clickable to jump to it)
- Summary — human-readable description (e.g., “Changed booking #abc12 from PENDING to CONFIRMED”)
- Metadata — JSON details for power users (the specific field changes, IP address, etc.)
Filtering
Use the filter bar to narrow by:- User — show only actions by a specific team member
- Action type — show only
booking.*or onlysettings.* - Date range
- Entity — show every action affecting a specific booking, customer, or service
Common investigations
- “Who cancelled this booking?” Filter by
Action: booking.update_statusand the booking ID — you’ll see the team member who cancelled and when. - “Why did our pricing change?” Filter by
Entity: Serviceand the service in question. - “Did anyone update our payment keys?” Filter by
Action: payment_setting.update.
Retention
Audit logs are kept for 2 years by default. Older entries are archived and not visible in the UI, but can be retrieved on request for compliance purposes.What about deletes?
Most “deletes” in AppointFlow are actually soft deletes (e.g., a deactivated service stays in the database). The audit log records both — you can see “service deactivated” as aservice.update event, not a service.delete.
True hard deletes (e.g., removing a team member) are logged as user.delete with the removed user’s email preserved in metadata.