Every action that changes the system writes an event to the audit ledger in the same database transaction as the change. This page lists the event types, grouped by what they are about, and the words the Audit Trail screens use for them. The ledger is append-only, each event is chained to the one before it, and an auditor can verify the chain without an administrator: see Review the audit trail.
162 event types. An event type with no entry in the Shown as column is shown with its type name made readable.
Access exceptions
| Event type | Shown as | What it records |
|---|---|---|
access.exception_approved | A second approver approved a pending access exception (not the requester, not the member it is for). | |
access.exception_ended | An access exception was rejected, withdrawn or revoked, with a reason. | |
access.exception_requested | An access exception was requested: one permission added to or removed from one grant, with a reason and an expiry. |
Audit
| Event type | Shown as | What it records |
|---|---|---|
audit.request.completed | API request | An API request finished: who called what, and how it ended. The request log, not a clinical change. |
Contacts
| Event type | Shown as | What it records |
|---|---|---|
contact.recorded | A contact with a participant was recorded. | |
contact.removed | A contact with a participant was removed, with a reason. |
Documents
| Event type | Shown as | What it records |
|---|---|---|
document.approved | A document was approved: it is now the version in force. | |
document.archived | A document was archived: superseded or withdrawn, and kept. | |
document.downloaded | A document file was downloaded. | |
document.metadata_updated | The details of a document (type, title, status, dates) were changed. | |
document.previewed | A document was previewed in the browser. | |
document.uploaded | A document was uploaded to the document register. | |
document.version_added | A new version of a document was added. |
Exports
| Event type | Shown as | What it records |
|---|---|---|
export.completed | An export finished and its file is ready. | |
export.downloaded | An export file was downloaded. | |
export.failed | An export could not be produced. | |
export.requested | An export was requested. |
Form library
| Event type | Shown as | What it records |
|---|---|---|
library_form.changed | Library form changed | A form in the organization's form library was created, changed or archived. |
library_visit.changed | Library visit changed | A visit in the organization's library was changed. |
Forms and data entry
| Event type | Shown as | What it records |
|---|---|---|
form.created | A form was created. | |
form.derived_value_overridden | The server recalculated a calculated field or table cell and stored its own result instead of the value the browser sent; the entry holds the value sent, the value stored and the reason. | |
form.draft_saved | The design of a form was saved in Build. | |
form.field_entered | Entered | A value was entered on a form for the first time. |
form.field_modified | Modified | A value that had been entered was changed, with its earlier value and the reason. |
form.transitioned | Form status changed | A form changed status (draft, active, archived). |
form.version_created | Form version created | A new version of a form was created. |
study_form.field_deprecated | Field deprecated | A field of a form was deprecated. |
study_form.field_restored | Field restored | A deprecated field was restored. |
Organization setup
| Event type | Shown as | What it records |
|---|---|---|
org.onboarding.completed | Setup finished | The organization's setup wizard was finished. |
org.onboarding.step_completed | Setup step completed | A step of the setup wizard was completed. |
org.onboarding.step_skipped | Setup step skipped | A step of the setup wizard was skipped. |
Other
| Event type | Shown as | What it records |
|---|---|---|
authz.decision | An access decision on a sensitive action was recorded: the permission asked, and whether it was allowed or refused. | |
mapping.bound | A form was bound to a visit. | |
mapping.unbound | A form was unbound from a visit. | |
mapping.updated | A binding of a form to a visit was changed. | |
record.completed | A form record was marked complete. | |
record.integrity_failed | A signed record's fingerprint no longer matched its content when it was read. | |
record.locked | A record was signed and locked. | |
record.signed | A record was signed. | |
record.unsigned | A change to a signed record withdrew its signature; the record needs signing again. |
Participants
| Event type | Shown as | What it records |
|---|---|---|
subject.eligibility_determined | The investigator determined a participant eligible or ineligible. | |
subject.enrolled | A participant was enrolled, with the baseline date their schedule is built from. | |
subject.reconsent_declined | A participant declined to consent again to an amended version. | |
subject.reconsented | A participant consented again and now follows the amended version. | |
subject.safety_follow_up_completed | The safety follow-up owed to a participant was completed. | |
subject.screened | A participant was screened, with the consent and screening dates and the consent version. | |
subject.transitioned | A participant's status changed (enrolled, active, completed, withdrawn, lost to follow-up, screen failed), with a reason where one is required. | |
subject.unscheduled_visit | An unscheduled visit was added for a participant. | |
subject.version_transitioned | A participant was moved to another version of the study. | |
subject.visit_early_access_granted | Data entry was allowed before a visit's window opened, with a reason. |
People, organization and invitations
| Event type | Shown as | What it records |
|---|---|---|
platform.invitation.resent | Invitation resent | An invitation was sent again; the earlier link stops working. |
platform.organization.restored | Organization restored | A suspended organization was restored. |
platform.organization.suspended | Organization suspended | An organization was suspended. |
platform.organization.updated | Organization updated | The details of an organization were changed. |
platform.tenant.provisioned | The platform console provisioned this organization in the data plane. | |
platform.tenant.status_applied | The platform console's suspension or restoration of the organization was applied here. | |
platform.user.email_changed | Login email changed | A person's sign-in address was changed. |
platform.user.invited | User invited | A person was invited to the organization. |
platform.user.membership_ended | User removed from the organization | A person was removed from the organization. |
platform.user.org_admin_granted | Org admin granted | A person was made an Organization Admin. |
platform.user.person_created | A person's record was created. | |
platform.user.profile_updated | User profile updated | A person's profile was changed. |
platform.user.restored | User restored | A suspended person was restored. |
platform.user.suspended | User suspended | A person was suspended. |
Protocol deviations
| Event type | Shown as | What it records |
|---|---|---|
deviation.reported | A protocol deviation was reported. | |
deviation.status_changed | A protocol deviation moved to another status (under review, resolved, reportable), with a reason. |
Queries
| Event type | Shown as | What it records |
|---|---|---|
query.answered | A site answered a query. | |
query.closed | A query was closed by a person, or closed itself because its edit check stopped failing. | |
query.escalated | A query was escalated. | |
query.raised | A query was raised, by a person or by an edit check. | |
query.reopened | A query was reopened. |
Roles
| Event type | Shown as | What it records |
|---|---|---|
rbac.ai.suggestion_requested | AI role assistant used | The role assistant was asked for suggestions when a custom role was drawn up. |
rbac.custom_role.created | Custom role created | A custom role was created. |
rbac.custom_role.restored | Custom role restored | A suspended custom role was restored. |
rbac.custom_role.suspended | Custom role suspended | A custom role was suspended. |
rbac.custom_role.updated | Custom role updated | A custom role was changed; the earlier version is kept as a revision with the reason. |
rbac.custom_role.warning_overridden | Custom role warning accepted | A warning from the risk assessment of a custom role was accepted by the person creating it. |
Rules
| Event type | Shown as | What it records |
|---|---|---|
rule.created | A cross-form rule was created. | |
rule.disabled | A cross-form rule was disabled. | |
rule.enabled | A disabled cross-form rule was enabled again. | |
rule.retired | A cross-form rule was retired: immutable and kept for audit. | |
rule.updated | A cross-form rule was changed. |
Safety events
| Event type | Shown as | What it records |
|---|---|---|
event.awareness_changed | The time the site became aware of a serious event was changed, which moves its reporting deadline. | |
event.follow_up_recorded | A follow-up report of a serious event was recorded. | |
event.follow_up_removed | A follow-up report was removed, with a reason. | |
event.follow_up_status_changed | The status of a follow-up report of a serious event changed (pending, sent, not required). | |
event.reconciliation_recorded | A reconciliation of a serious event with the safety database was recorded (matched or discrepancy). | |
event.recorded | An adverse event or another event was recorded for a participant. | |
event.removed | An event was removed, with a reason. | |
event.report_status_changed | The reporting status of a serious event's initial report changed (pending, sent, not required). | |
event.review_recorded | A medical review of a serious event was recorded. | |
event.status_changed | The status of an event changed. | |
event.upgraded_to_sae | An adverse event was upgraded to a serious adverse event, which starts its reporting clock. |
Sign-in and sessions
| Event type | Shown as | What it records |
|---|---|---|
auth.login.succeeded | Signed in | A person signed in. |
auth.otp.failed | OTP failed | A wrong or expired sign-in code was entered. |
auth.otp.refused | Sign-in refused | A sign-in code was refused (for example an address that holds no role anywhere). |
auth.otp.requested | OTP requested | A one-time code was requested for signing in or for signing. |
auth.otp.throttled | OTP throttled | A code request was refused because too many were made. |
auth.otp.verified | OTP verified | A sign-in code was accepted. |
auth.role.selected | Role selected | The person chose the organization they signed in to. |
auth.session.refreshed | Session refreshed | A session's tokens were renewed. |
auth.session.reuse_detected | Session reuse detected | A refresh token that had already been used was presented again: treated as possible theft of the session. |
auth.session.revoked | Signed out | A person signed out, or a session was ended. |
auth.stepup.failed | A signing code was wrong, expired, or used for the wrong record. | |
auth.stepup.verified | A signing code was accepted for one signature. | |
auth.workspace_switched | The session entered or left a UAT or Live workspace. |
Signatures
| Event type | Shown as | What it records |
|---|---|---|
signature.applied | An electronic signature was applied, with its meaning, the signer's name and a fingerprint of what was signed. | |
signature.superseded | A signature was withdrawn because what it signed changed. |
Sites
| Event type | Shown as | What it records |
|---|---|---|
site.activated | Site activated | A site was activated, with its ethics approval and training confirmation. |
site.registered | A site was registered. | |
site.target_set | A site's enrollment target was set. | |
site.transitioned | Site status changed | A site was suspended, reinstated or closed, with a reason. |
Source data verification
| Event type | Shown as | What it records |
|---|---|---|
sdv.discrepancy | A monitor logged that a value does not match the source document. | |
sdv.plan_carried | The source data verification plan was carried into the version that went Live. | |
sdv.plan_retired | A requirement of the verification plan was retired. | |
sdv.plan_updated | The source data verification plan was changed. | |
sdv.verified | A monitor verified a value against the source document. |
Studies and versions
| Event type | Shown as | What it records |
|---|---|---|
study.amendment.started | Amendment started | An amendment was started from the Live version. |
study.created | Study created | A study was created. |
study.lock.confirmed | The second person confirmed the request to lock the database with an e-signature; the study is locked. | |
study.lock.initiated | A request to lock the database was made, with an e-signature. | |
study.metadata_updated | The study's details were changed. | |
study.state.changed | Study state changed | The study moved to another state (for example Active, On hold, Completed), with the reason. |
study.state.request.cancelled | A pending request to lock or unlock was withdrawn. | |
study.unlock.confirmed | The second person confirmed the request to unlock the database; the study is no longer locked. | |
study.unlock.initiated | A request to unlock the database was made, with an e-signature. | |
study.version.approved | Version approved | A version was approved after its three sign-offs. |
study.version.awaiting_signoff | Version awaiting sign-off | A version's UAT cycle passed and it now waits for sign-offs. |
study.version.created | Version created | A version of the study was created. |
study.version.returned_to_build | Version returned to Build | A version went back to Build (a failed cycle, or a reopen), clearing its sign-offs. |
study.version.revision_saved | Design saved | The design of a version was saved in Build. |
study.version.settings_updated | Version settings updated | The settings of a version (study details, safety clock, signature requirements) were changed. |
study.version.signoff_recorded | Version signed off | A person signed off a version as author, QA or approver. |
study.version.signoff_rejected | Version sign-off rejected | The author, QA or approver rejected a version at sign-off, with a signature and a reason; the version returns to Build and the sign-offs given so far are withdrawn. |
study.version.submitted_to_uat | Version → UAT | A version was submitted to UAT: its design was frozen and a cycle opened. |
study.version.superseded | Version superseded | A version stopped being the Live version because a newer one went Live. |
study.version.went_live | Version went Live | A version went Live. |
study.version.withdrawn | Version withdrawn | A version that had not gone Live was withdrawn, with a reason. |
study_config.advanced_to_uat | Config → UAT | Written before study versions existed; kept readable, never written any more. |
study_config.approved | Config approved | Written before study versions existed; kept readable, never written any more. |
study_config.released | Config released | Written before study versions existed; kept readable, never written any more. |
study_config.reopened_to_draft | Config reopened | Written before study versions existed; kept readable, never written any more. |
Study team
| Event type | Shown as | What it records |
|---|---|---|
team.assignment_changed | Team access changed | A person's study or site access was changed (suspended, reinstated, retired). |
team.delegation_ended | A delegation of authority to a site staff member was ended. | |
team.delegation_proposed | A delegation of authority was proposed for a member of site staff. | |
team.delegation_signed | The principal investigator signed a delegation of authority, which gives the person access. | |
team.role_assigned | Role assigned | A person was given a role on a study. |
team.site_team_ended | The team of a site was ended. | |
team.validation_roster_retired | At go-live, the UAT site assignments of people who now hold a Live assignment were retired. |
UAT
| Event type | Shown as | What it records |
|---|---|---|
uat.correction.reopened | A resolved design correction was reopened. | |
uat.correction.resolved | A correction to the design that a UAT cycle asked for was marked resolved. | |
uat.cycle.failed | UAT cycle failed | A UAT cycle was failed; the version returns to Build. |
uat.cycle.opened | UAT cycle opened | A UAT cycle was opened by submitting a version. |
uat.cycle.passed | UAT cycle passed | A UAT cycle was passed. |
uat.issue.accepted | UAT issue accepted | A UAT issue was accepted as it is. |
uat.issue.raised | UAT issue raised | A UAT issue was raised. |
uat.issue.reopened | UAT issue reopened | A resolved UAT issue was reopened. |
uat.issue.resolved | UAT issue resolved | A UAT issue was resolved. |
uat.issue.updated | UAT issue edited | A UAT issue was edited. |
Visits
| Event type | Shown as | What it records |
|---|---|---|
study_visit.changed | Visit changed | A visit of the schedule was created, changed or archived. |
visit.instance_retired | A participant's visit was retired when the participant moved to another version. | |
visit.mode_set | A visit was recorded as on site or remote. |
Compliance Q&A
Every event type above is written with the person, the time on the server, the study and, where it applies, the participant, the record, the old and new value and the reason. 162 types are written today. The ledger is append-only and chained; see Audit trail and evidence for how tampering is detected.
Limits: the list is read from the code, so a module that writes an event type in a way the script cannot see would be missing here; the Audit Trail screen shows any type it finds, with a readable name.
Evidence: the audit writers of each server moduleserver/db/schema.sql (ledger triggers)client/lib/cdms/audit/display.ts
Related
Review the audit trail · Audit trail and evidence · API reference