Audit Trail | An immutable record of every action | Velt

8 min read Original article ↗

Audit trail

An immutable, exportable record of every action in your product: comments, edits, approvals, rejections.

Stop losing regulated deals because your product can’t prove who approved what.

Free tier. No credit card. First comment in 5 minutes.

ATAudit trail / Quarterly filing

09:02:11Brand Agent flagged a pricing claimagent

09:14:40Maya replied: “Second claim is sourced, see footnote 4”human

09:21:03Sarah approved: “Looks good”approved

09:21:04Webhook review.approved delivered200

Build this

Evidence layers running inside products at

What it is

One chain of custody. Both actors.

An immutable, exportable record of every action in your product’s review layer: every comment, edit, suggestion, approval, and rejection, with who, what, and when. Velt records activity automatically across all features; nothing to instrument. Records are queryable by document, user, workflow, or time range, and exportable for auditors and security reviews. Approval records capture the full chain: who was asked, who responded, what they decided, and what changed as a result.

Quarterly filing · audit trailone trail · agent + human

09:02·agentBrand Agent flagged a pricing claimagent

09:14·humanMaya replied “sourced, see footnote 4”human

09:21·humanSarah approved “Cleared with legal”approved

09:21·systemWebhook review.approved delivered200

statusHistory · recorded

Every decision lands on one trail — the status change written as changedBy: Sarah with the reason attached.

consent visible·both actor types

How it works

Three steps to the first record.

Enable Activity Logs to capture activity automatically across every feature. Records stream to your UI live, answer REST queries, and push review events to your backend through webhooks.

01Install

terminal

npm install @veltdev/react

02Wrap

_app.tsx

<VeltProvider
  apiKey={VELT_API_KEY}>
  <YourApp />
</VeltProvider>

03Mount

audit-page.tsx

// enable Activity Logs in the Velt Console first
// document scope set via useSetDocumentId('filing-q3')
<VeltActivityLog />

With Velt

The mechanics

Once enabled, Velt records activity across features automatically: comments, reactions, recordings, CRDT edits, and approval state changes. Every approval state change appends a statusHistory entry: who changed it, when, and the note they left, written synchronously with the status change. Each record carries judgment fields: reasoning, confidence, judge type (human or agent), authority, prior judgments, and content context. Enrichment runs async, so logging adds no latency.

// getAllActivities streams records live · console toggle per docs

Build it yourself

What an in-house version requires

  • capture hooks inside every feature
  • an append-only store
  • attribution and timestamps on every write
  • status-transition triggers
  • query indexes by document, user, time range
  • an export pipeline
  • retention and GDPR deletion
  • tamper evidence
  • a feed UI with filters

Teams that build it budget a quarter for the first version and keep paying for the long tail. The 3 steps above replace the first quarter; the capability wall below replaces the long tail.

Capabilities

Who approved what, on the record.

Each card is the live SDK. Toggle to Code for the exact snippet that renders it.

Activity logauto-captured

comment.addedSales deck · slide 4recorded

edit.mergedcontract.md · clause 7recorded

recording.sharedwalkthrough · 1:24recorded

approval.changedfiling-q3 · approvedrecorded

Automatic capture across every feature

Comments, reactions, recordings, CRDT edits, and approval changes create records the moment they happen. Nothing to instrument.

statusHistorywho · when · why

statusApproved

changedBySarah

changedAtTue 09:21

note“Cleared with legal.”

Who, when, and why on every status change

“Who approved this filing?” becomes a lookup, not an investigation.

Judgment recordjudge type

judgeTypeagent

confidence0.88

authoritybrand-policy-v4

reasoning“Conflicts with the rate table.”

Judgment fields on every record

Reasoning, confidence, judge type, and the authority that required the review. Evidence with context.

Chain of custodyagent + human

Brand Agent09:02

This pricing claim conflicts with the rate table on slide 4.

judge type · agent

same trail

Sarah09:21

Accepted the finding: cleared with legal.

judge type · human

Agent actions in the same record

Agent findings land in the same trail as human decisions, marked judge type agent. One chain of custody.

Recording pipelineon · day one

Every action recorded silently

Feed UIopt-in

Ship the timeline whenever

Recording on by default

The pipeline records silently from day one; the feed UI stays opt-in. The questionnaire arrives years after the actions.

documentIdfiling-q3

changedBysarah

featureapprovals

3 records matched200

Query API for documents, users, and time ranges

The auditor’s sample request is a query, not a week of log archaeology.

Comment flagged the claim

Brand Agent · 09:02

flagged

Revision corrected the copy

Maya · 09:14

revised

Approval signed off

Sarah · 09:21

approved

Decision chains

The comment, the revision, the approval, in order. The full story behind a sign-off reads as one chain.

Immutable recordson by default

Edit a record

rec_118originalnew linked recordrec_204linked

Delete the content

content removedrecord standsrec_118preserved

Immutable records

On by default for new accounts: changes create new linked records. Evidence stays evidence.

Record set

filing-q3 · 142 records

JSONREST APIshipped

PDFpackagesoon

CSVexportsoon

Hash chainstamper-evidentsoon

Exports for auditors

Any record set is available as structured JSON through the API today; PDF and CSV packages assemble the same chain.

deployv2.14 → productioncustom

exportquarterly packagecustom

permission.changedrole · editor → admincustom

Custom events through the same API

Deploys, exports, and permission changes sit in the same timeline your reviewers already generate.

The auditor asked for the approval chain on a sample of filings. We ran one query and sent the records — who was asked, who decided, and the note they left.

Compliance lead · FP&A platform

Little big details

The long tail, already built.

Shipped functionality only. The confirmed set leads; draft items render after engineering sign-off. This is the part of an in-house build that never ends.

VeltActivityLog: prebuilt, filterable, grouped by calendar dateDark mode propWireframes and standalone primitives for custom audit UIsuseAllActivities live subscription with filterscreateActivity for custom events, judgment fields validated on writeActivity Logs REST API v2: get, add, update, deleteWebhooks on review eventsSelf-host activity data providerGDPR data export and deletion APIsSupported-regions data residencystatusHistory on every annotation: who, when, noteapproval.transition records with authority contextSix judgment fields: reasoning, confidence, judgeType, authority, priorJudgments, contentContextContent capture tiers: metadata, summary, full contentImmutability on by default for new accountsSub-second record creation, async enrichment, zero added latencyHistorical backfill, flagged source backfillPer-document SHA-256 hash chainsComing soonRegulatory packages: SOC 2, HIPAA, EU AI ActComing soonEvidence Center dashboardComing soonCSV and audit report PDF exportsComing soonCloudEvents streaming to BI toolsComing soonAI transparency reportComing soonScheduled reportsComing soon

Make it yours

Your timeline, your privacy posture.

VeltActivityLog for the fast path, wireframes and primitives for custom audit UIs, content capture tiers, and a full REST surface underneath.

Acme · Audityour theme

approval.changedSarah · 09:21signed

edit.mergedMaya · 09:14signed

comment.addedDev · 09:02signed

retention7 yearsimmutable

exportsJSONCSVPDF

customEventsdeploy.shipped

scopeper-document

We shipped a defensible trail in an afternoon. The hard part — immutability and attribution — was already done.

Staff engineer · sales enablement platform

In production

The trail, in products like yours.

Tabbed by vertical, with verified customer screenshots.

SummaryNext StepsDemoCustomer Stories

Hey Conductor!

This Digital Sales Room gives you everything you need to move forward — from proposal to plan.

Our Mutual Action Plan

Training2 / 5

Creating a new Room1

Build a working demo room

Maya2m

@Fin We need to make a working demo for Rene and his team

Brand and legal sign-off on every asset, recorded with the note attached. The regulated client’s question is one query.For sales enablement

SOC 2 Type IIHIPAAEU data residencyAudit-ready

Log content, entity snapshots, and custom fields can live on your infrastructure via the activity data provider, with only minimal identifiers on Velt. GDPR deletion runs through the compliance API with its own audit log. EU AI Act Article 14 (high-risk systems under Annex III, enforceable August 2, 2026): for products in that scope, this trail is the evidence layer — approval before action, recorded. See self-hosting and governance.

Book Demo

Proof

The regulated deal, unblocked.

“Who approved this?” stopped stalling our deals.

1 query

The examiner asked for the approval chain on a sample of filings. We ran a query and sent the records: who was asked, who decided, and the note they left.
Compliance lead, FP&A platform

5 min

Mounting the activity log took an afternoon. The hard part — immutability and attribution — was already done.
Staff Engineer, sales platform

100%

Every agent action is attributed alongside our humans. Our auditors finally trust the record.
VP Engineering, AI-native SaaS

FAQ

Questions about the audit trail.

Install @veltdev/react, wrap your app in VeltProvider with your API key, enable Activity Logs in the Velt Console, and add the VeltActivityLog component for a prebuilt, filterable timeline. The setup guide walks through it.

Comments, replies, reactions, recordings, multiplayer edits, and every approval state change, recorded automatically. Your own product events join the same trail through the createActivity API, with judgment fields validated on write.

Yes. Pull any record set through the Get Activity Logs REST API as structured JSON, filtered by document, user, feature type, or time range. Audit report PDFs and CSV packages are coming to the same chain.

Article 14 applies to high-risk AI systems defined in Annex III (credit, insurance, hiring, critical infrastructure, and essential services among them), enforceable from August 2, 2026; it is not a universal obligation on every AI feature. If your product or your customers operate in that scope, Velt provides the mechanism (approval before action) and the evidence (a record of who approved what, when, and why). Talk to your counsel about whether you are in scope; see /governance.

Immutability is on by default for new accounts: edits create new records linked to the original, and deleting source content leaves the record standing. GDPR deletion runs through a dedicated compliance API and is itself logged.

Every record carries a judge type of human or agent. An agent’s finding, its confidence score, and its reasoning sit in the same trail as the human decision that accepted or rejected it, so the oversight chain is explicit.

No. The status record is written synchronously with the status change itself; everything else enriches asynchronously after the user-facing write completes. Records exist within a second, and user actions gain no latency.

Yes. The self-host activity data provider keeps log content, entity snapshots, and custom fields on your infrastructure while Velt stores only minimal identifiers. See /self-hosting.

Velt is priced on usage, not seats: you pay for documents with review activity in a month, and there is a free tier for development and early production. The audit trail is part of the SDK, not a separately priced add-on.

Add an audit trail for every action.

Free tier. No credit card. First comment in 5 minutes.

30 minutes, with an engineer, not a sales deck.