Skip to main content

Track every change to flags, services, members, and tokens with comprehensive audit logs

Audit Logging

Flaggr automatically records an audit trail for every state-changing operation. Every flag toggle, member addition, token creation, and configuration change is logged with full context.

What's Logged

Every audit entry captures:

FieldDescription
actionWhat happened (e.g., flag.update)
resourceTypeType of resource affected
resourceIdID of the affected resource
resourceNameHuman-readable resource name
userIdWho performed the action
beforeResource state before the change
afterResource state after the change
changesDiff of changed fields
timestampWhen it happened (ISO 8601)
ipAddressClient IP address
userAgentClient user agent string

Actions

Flag Actions

ActionTrigger
flag.createNew flag created
flag.updateFlag configuration changed (targeting, variants, metadata)
flag.deleteFlag removed
flag.toggleFlag enabled/disabled state flipped

Service Actions

ActionTrigger
service.createNew service created
service.updateService configuration changed
service.deleteService removed

Member Actions

ActionTrigger
member.addUser added to project
member.removeUser removed from project
member.role_changeUser's role updated

Invitation Actions

ActionTrigger
invitation.createInvitation sent
invitation.acceptInvitation accepted
invitation.cancelInvitation cancelled

Token Actions

ActionTrigger
token.createAPI token generated
token.updateToken permissions changed
token.revokeToken revoked

Querying Audit Logs

Basic Query

GET /api/audit?projectId=proj-1&limit=50

Filter by Action

GET /api/audit?projectId=proj-1&action=flag.toggle

Filter by Resource

GET /api/audit?projectId=proj-1&resourceType=flag&resourceId=checkout-v2

Filter by Date Range

GET /api/audit?projectId=proj-1&startDate=2025-07-01&endDate=2025-07-31

Filter by User

GET /api/audit?projectId=proj-1&userId=user-123

Combined Filters

GET /api/audit?projectId=proj-1&action=flag.update&resourceId=checkout-v2&startDate=2025-07-15&limit=20

Response Format

{
  "logs": [
    {
      "id": "audit-abc123",
      "projectId": "proj-1",
      "userId": "user-123",
      "action": "flag.update",
      "resourceType": "flag",
      "resourceId": "checkout-v2",
      "resourceName": "Checkout V2",
      "before": {
        "enabled": false,
        "targeting": []
      },
      "after": {
        "enabled": true,
        "targeting": [
          {
            "id": "beta-users",
            "conditions": [{ "property": "betaUser", "operator": "equals", "value": true }],
            "value": true
          }
        ]
      },
      "changes": [
        { "field": "enabled", "oldValue": false, "newValue": true },
        { "field": "targeting", "oldValue": [], "newValue": "[1 rule]" }
      ],
      "metadata": {},
      "timestamp": "2025-07-20T10:30:00Z",
      "ipAddress": "203.0.113.1",
      "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)..."
    }
  ],
  "total": 150,
  "limit": 50,
  "offset": 0
}

Permissions

Audit logs require project-level read access. Any project member (viewer, member, admin, or owner) can view audit logs for their project.

Storage

Audit logs are stored in Firestore with an in-memory cache of the most recent 1,000 entries for fast queries. Older entries are read directly from storage.

Use Cases

  • Compliance — Track who changed what, when, and from where
  • Debugging — Trace a flag misconfiguration back to the change that caused it
  • Rollback decisions — View the before/after state to decide whether to rollback
  • Team visibility — See what your teammates have been working on
  • Incident response — Correlate flag changes with production incidents