Track user activity and maintain compliance with audit logging
Audit logs provide a comprehensive record of all user actions and system events in Activepieces, essential for security monitoring, compliance, and troubleshooting.
CREATE TABLE audit_event ( id VARCHAR PRIMARY KEY, platform_id VARCHAR NOT NULL, project_id VARCHAR, user_id VARCHAR, user_email VARCHAR, project_display_name VARCHAR, action VARCHAR NOT NULL, ip VARCHAR, data JSONB NOT NULL, created TIMESTAMP NOT NULL, updated TIMESTAMP NOT NULL);CREATE INDEX ON audit_event (platform_id, project_id, user_id, action);CREATE INDEX ON audit_event (platform_id, user_id, action);CREATE INDEX ON audit_event (platform_id, action);
-- Track privileged accessSELECT user_email, action, createdFROM audit_eventWHERE action IN ( 'project.role.created', 'project.role.updated', 'user.signed.in')ORDER BY created DESC;
Change Management:
-- Track production flow changesSELECT user_email, data->>'flowVersion'->>'displayName', createdFROM audit_eventWHERE action = 'flow.updated' AND project_id = 'prod_project'ORDER BY created DESC;
-- Track access to user dataSELECT user_email, action, ip, createdFROM audit_eventWHERE project_id = 'user_data_project' AND created > NOW() - INTERVAL '30 days'ORDER BY created DESC;
Right to Deletion:
-- Find all events for a user (for deletion)SELECT * FROM audit_eventWHERE user_email = '[email protected]';
-- Track all access to PHI flowsSELECT user_email, action, ip, createdFROM audit_eventWHERE project_id IN ( SELECT id FROM project WHERE metadata->>'contains_phi' = 'true')ORDER BY created DESC;
Failed Access Attempts:
-- Monitor unauthorized access attemptsSELECT user_email, ip, COUNT(*) as attemptsFROM audit_eventWHERE action LIKE 'user.%' AND data->>'success' = 'false' AND created > NOW() - INTERVAL '24 hours'GROUP BY user_email, ipHAVING COUNT(*) > 3;
-- Multiple failed loginsSELECT user_email, ip, COUNT(*) as failed_attemptsFROM audit_eventWHERE action = 'user.signed.in' AND data->>'success' = 'false' AND created > NOW() - INTERVAL '1 hour'GROUP BY user_email, ipHAVING COUNT(*) >= 5;
Privilege Escalation
-- Track role changesSELECT user_email, data->'projectRole'->>'name' as new_role, createdFROM audit_eventWHERE action = 'project.role.updated' AND data->'projectRole'->'permissions' ? 'WRITE_PROJECT_MEMBER'ORDER BY created DESC;
Mass Deletion
-- Detect bulk deletionsSELECT user_email, COUNT(*) as deletionsFROM audit_eventWHERE action IN ('flow.deleted', 'connection.deleted') AND created > NOW() - INTERVAL '10 minutes'GROUP BY user_emailHAVING COUNT(*) > 10;
After-Hours Access
-- Access outside business hoursSELECT user_email, action, createdFROM audit_eventWHERE EXTRACT(HOUR FROM created) NOT BETWEEN 8 AND 18 OR EXTRACT(DOW FROM created) IN (0, 6) -- WeekendORDER BY created DESC;
COPY ( SELECT created, user_email, action, project_display_name, ip FROM audit_event WHERE created > NOW() - INTERVAL '30 days' ORDER BY created DESC) TO '/exports/audit_log.csv' CSV HEADER;
import { summarizeApplicationEvent } from '@activepieces/shared'const summary = summarizeApplicationEvent(auditEvent)// Returns: "Flow run run_abc123 is started"// or "Updated action "Send Message" in "Slack Notification" Flow."