HomeAudit trail
Every action on the record. The record doesn't change.
What the assistant said and which passages it used. Who claimed a case, who changed its status, who read the audit log itself. Serviceplane writes each of these as an event that cannot be edited or deleted, chained to the one before it by its hash, and hands you the tools to prove it.
How the record is built
Append-only by construction, verifiable by anyone with the role
Every command is an event
A case opened, a label applied, a reply sent, an answer given, a record linked, a setting changed, a legal hold placed, an export taken — each is one event on the organization's own sequence, with who did it (a person, the assistant, an integration key, the public) and the request's trace id.
One spine per organizationHash-chained, in order
Each event carries a SHA-256 hash computed over its content and the previous event's hash. Change one byte of any past event and every hash after it stops matching. The events table refuses updates and deletes at the database level; in production the grants are revoked as well.
SHA-256 · prev_hashReadable, filtered, exportable
The audit log is a tab in the workspace, not a support ticket to us: filter by kind, resource, actor, trace id or time; page through it newest first; export a range as CSV or JSON. A read-only auditor role sees the log and nothing else — and reading or exporting the log is itself an event.
Auditor roleVerified in one call
A verification endpoint walks the whole chain and reports the first event, if any, whose hash does not match. It is the same check the tests run after deliberately tampering with a row, so "the chain verifies" is a statement about the data, not about trust in us.
verify()Exported nightly to storage you own
Each night the next contiguous range of events is written as a file to your S3-compatible bucket, and a ledger row records the range, the file's SHA-256 digest and its size. The digest is also written to the chain as an event, so the following night's export carries the proof of the previous one. The chain can be re-verified from the files alone, without Serviceplane.
Nightly export · digest ledger"Why did it say that" is one query
The search the assistant ran, the passages it retrieved, the answer it gave and the model that gave it share a trace id — and the operational log line for the same request carries it too. A reviewer sees the whole chain of reasoning without reconstructing it.
Trace idThe assistant's actions carry the instruction
When a staff member tells the copilot "assign this to Billing and mark it high priority", the resulting events are attributed to the copilot acting on that person's instruction — the instruction text rides on every one. Anything outbound, a reply or an email, is held for the person's click and recorded as confirmed.
Copilot under policyRetention removes content, never the record
A retention policy blanks message content on schedule — chat text, transcripts, email bodies — and stamps when it did. Rows, cases, counts and the events themselves stay, so an audit of what happened survives the deletion of what was said. A case on legal hold is skipped entirely.
Retention · Legal holdA whole case as one file
For a public records request or a complaint review: one export holds the case, the person, every chat turn, email, text, note and attachment record, and the case's own audit trail with hashes — as text or JSON. Taking the export is, of course, an event.
Records requestsWhat tampering looks like
Change one event, and the chain says so
Hashes shortened for the page. The database refuses the edit in the first place; this is what the check reports if it ever got through.
Plain words
What an auditor can do, and what nobody can
An auditor can
- Read every event of the organization, filtered by kind, actor, case, trace or time
- Export any range as CSV or JSON, up to 50,000 rows a file
- Run the chain verification and get the first bad sequence number, if any
- See the ledger of nightly exports with each file's digest, and re-verify from the files alone
- Pull one whole case — messages, notes, attachments and its trail — as a single file
Nobody can
- Edit or delete an event, including Serviceplane's own operators — the table refuses it
- Read the log without the role — agents get a refusal, and the refusal is not silent
- Read or export the log without that read becoming an event
- Make the assistant send anything outbound without a person's confirmation on the record
- Purge a case that is on legal hold
Questions we get
From auditors, counsel and security reviews
Can a Serviceplane administrator delete an event?
How would we know if the log had been tampered with?
Where does the nightly export go?
Does the AI's reasoning appear in the log?
How does retention interact with the audit trail?
Can an outside auditor get access without seeing cases?
Read next
What the record is a record of
Ask us to break it. Then run verify().
In a walkthrough we open a case, let the assistant and a person act on it, tamper with a row in a scratch database, and show you the chain refuse to verify.