Skip to content
ImplementedFor auditors, QA, sponsors, inspectors

Audit trail and evidence

Last updated Oct 21, 2026

What this page is

Almost every regulatory claim in this system rests on the audit trail, so this page says exactly what it records, how tampering is found, who can check it and where it stops. How to read and filter it on screen is on Review the audit trail; the list of every event type is the generated Audit events.

Interactive · Audit Trail ExplorerOpen full screen →

Every event is sealed by hashing it together with the previous event's hash — a chain. Edit any event's reason below to play an attacker: the moment the data changes, its hash no longer matches the sealed ledger, and every event after it breaks too. That is what makes the audit trail tamper-evident.

Chain verified — all 6 events intact.
genesis · 00000000…000000
1
study.createby Org Admin· ONC-2024
prev …hash …
sealed
2
site.activateby Project Manager· Site 01
prev …hash …
sealed
3
subject.enrollby CRC (Site 01)· ONC-001
prev …hash …
sealed
4
form.writeby CRC (Site 01)· ONC-001 · Vitals
prev …hash …
sealed
5
query.raiseby Data Manager· ONC-001 · Weight
prev …hash …
sealed
6
record.signby Principal Investigator· ONC-001 · Visit 1
prev …hash …
sealed

In Trialion the chain is computed server-side with append-only database triggers and serialized writes; an admin endpoint re-verifies it. Hashes here are real SHA-256, computed live in your browser.

What is recorded

Every event carries:

What happenedA category (data, auth, signature, lock, system, authz or request) and an event type such as form.field_modified
WhoThe person's id, name, e-mail and the roles they held; or system when the act was the system's (the rule engine raising a query), with the person who caused it in the detail
WhenThe server's time. A browser's clock is never used
From whereThe viewer's address as the web application vouches for it, and the request identifier
What it concernedThe study, site, participant and the type, id and label of the record
WhyThe reason, where one is required (a correction, a withdrawal, a state change)
The changeFor data, the earlier and the new value, per field and not per form
Which workspaceUAT, Live, or neither for sign-in and governance, which decides who may read it

Entering a value and modifying one are separate event types, so a first entry and a later correction are told apart at a glance.

What causes an event. A change to anything governed writes a domain event with its before and after. Every mutating request also writes a request event, and every refusal writes an access decision (authz.decision): a person asking "did anyone try to reach data they should not have?" gets an answer. Sign-ins, signatures, locks and the platform's own acts are events of their own.

What does not. A successful read (opening a participant, a report or the trail) is not recorded. Document downloads and previews are the exception. The API's access log in the hosting's logs is the only record of a read (Not built yet).

How the record is made

An event is queued in the same database transaction as the change it describes, so a change and its event commit together or not at all. The worker's relay then appends it to the ledger, in order, within a fraction of a second at the loads that were measured (the slowest event in any of the load tests took 0.82 s to appear; Testing and quality). An event that cannot be appended is retried and then set aside, visibly, with its error; the operator is alerted if events are waiting.

How tampering is detected

Four layers, each catching what the one before cannot.

  1. The table refuses. The application's database role can read and insert on the ledger and nothing else, and triggers refuse UPDATE, DELETE and TRUNCATE in every session, including a session that has switched triggers off. In production the server refuses to start if the role it is running as could change the ledger (The database).
  2. The chain. The ledger is not one list but one chain for each organization, study and workspace, each with its own gapless position, its own genesis and its own head. Each event stores a SHA-256 hash of itself and of the event before it, over a canonical form of the event (properties in a fixed order, timestamps normalized), so inserting, removing or editing one breaks the chain at that point and the verification says where.
  3. Verification on a schedule. The worker walks each chain every hour from its last checkpoint and in full once a week, records any break, and raises a critical alert (audit.chain_integrity) that clears when the chain verifies again.
  4. Anchors outside the database. A hash chain cannot by itself reveal events cut off its end, together with the head that remembered them, by someone who can write the database. So the end of each chain is written once a day to storage that cannot be rewritten (S3 Object Lock in compliance mode), and a chain that no longer holds what was anchored fails verification whatever else is attested. In production the server refuses to start without anchoring, unless that is waived explicitly.

Who can check it

Held by: Organization Admin, Project Manager, Clinical Research Associate, Data Manager, Medical Officer, Sponsor Manager, Auditor, Principal Investigator, Clinical Research Coordinator, Site Monitor, Clinical Data Coordinator, Regulatory Manager (audit.read).

Held by: Organization Admin, Auditor (audit.verify).

Reading the trail needs audit.read (a person at a site reads their own site). Verifying the chain is a separate permission held by the Auditor and the Organization Admin; that the Auditor holds it independently is the point, because an administrator is a subject of the audit and not only its custodian. The same walk runs in the background without anyone asking.

What cannot be changed

  • Audit events: append-only, as above.
  • Query threads: comments and status changes cannot be edited or removed, an administrator included, by a trigger in the database.
  • Signatures: never modified. A change under a signature withdraws it as a record of its own, and the original still proves what was signed.
  • Captured values: a change is a new row that supersedes the old, so every value ever saved is still there.
  • Design snapshots: a form version and the whole design are frozen with a content hash when submitted; the exact form used for any captured value can be reproduced.
  • Retired and withdrawn things: sites, rules, documents, assignments, participants and on-demand records are retired, never deleted.

Where to look

ViewShows
Audit Trail (study level)The study's own record: versions, sign-offs, state, design, amendments, documents
Audit Trail (in UAT or Live)The workspace: participants, records, queries, sites, deviations, the workspace's team
Organization AuditUser, role and study governance across the organization (Review organization access and audit)
Participant → TimelineOne participant's history
E-SignaturesThe register of who signed what, when, and what it meant (Sign records)
A query's threadEvery comment and status change on that query
Platform ledger (operator's console)The operator's own actions, on its own chain (Platform audit)

A study has two trails so that test activity is never read beside production's. Whoever holds the right to read both reads them one after the other, never merged.

What depends on your hosting

Retention, backup and restoration of the ledger are properties of how the database is run, and so is the retention period. The application checks that the last backup is recent and raises an alert when it is not, and it verifies the restored copy's hash chain in the weekly restore check, but taking, keeping and testing backups is the operator's (Running it). A person with administrative access to the database host is outside what the application can protect; the daily anchor is what makes cutting events off the end of a chain findable.

Compliance Q&A

Compliance Q&ABuiltPart 11 11.10(e)Annex 11 9ALCOA+ enduringALCOA+ original
Can the audit trail be altered or deleted by the application, or by someone using its credentials?

No. The runtime role can read and insert and nothing more, triggers refuse update, delete and truncate in every session, and the server will not start in production if its role could change the ledger.

Limits: someone who owns the database or controls its host can act outside the application; the hash chain and the daily write-once anchor make that findable, but preventing it is the hosting's control (Security and hosting).

Evidence: schema triggers and privilegesassert-least-privilege at bootledger-contract.tsaudit-immutability and audit-anchors integration tests

Compliance Q&ABuiltPart 11 11.10(e)Annex 11 9ICH E6 data-governance
Can a reviewer check independently that the audit trail is intact?

Yes. The Auditor and the Organization Admin can walk every chain on demand and the platform does so on a schedule; a failure names the point where a chain breaks and does not say who caused it.

Evidence: audit.verify permission (Auditor, Organization Admin)worker hourly and weekly verificationdaily anchorsalert audit.chain_integritysimulation of 20 Oct 2026

Compliance Q&ABuiltALCOA+ contemporaneousPart 11 11.10(e)Annex 11 9
Is the time of every event the system's own, so that a wrong clock cannot misdate a record?

Yes. The time of an event is the server's; the browser's clock is not used for any audited time.

Evidence: audit-event.ts occurredAt set by the serverledger recorded_at

Review the audit trail · Audit events · 21 CFR Part 11 · ALCOA+ · Security and hosting · Auditor