Audit trail

Add an audit trail for every action.

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.

Quarterly filing · todayfilter: all features
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

Migrating from an in-house build or another SDK?Compare·Migration guide

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 timeline
09:02Brand Agent flagged 2 claims · judge type AGENT · confidence 0.88agent
09:14Maya replied: “Second claim is sourced, see footnote 4” · judge type HUMANhuman

statusHistory · expanded

status: Approved · changedBy: Sarah · changedAt: 09:21:03 · note: “Cleared with legal.”

written synchronously with the status change

one trail, both actor types, the why attached to the decision

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.

MCP: the faster path.

Skip the steps. Have your agent set it up.

npx -y @velt-js/mcp-installer

Launch your audit trail this week.

No credit card. Works with React, Next.js, Vue, Angular, and HTML.

Get Free API Key

Capabilities

Who approved what, on the record.

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

01capture
Activity logauto-captured
comment.addedSales deck · slide 4recorded
edit.mergedcontract.md · clause 7recorded
recording.sharedwalkthrough · 1:24recorded
approval.changedfiling-q3 · approvedrecorded
// capture
// nothing to instrument — capture is automatic
<VeltActivityLog />

Automatic capture across every feature

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

02attribution
statusHistorywho · when · why
statusApproved
changedBySarah
changedAtTue 09:21
note“Cleared with legal.”
// attribution
{ "status": "approved", "changedBy": "sarah",
  "note": "Cleared with legal" }

Who, when, and why on every status change

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

03judgment
Judgment recordjudge type
judgeTypeagent
confidence0.88
authoritybrand-policy-v4
reasoning“Conflicts with the rate table.”
// judgment
{ "judgeType": "agent", "confidence": 0.88,
  "authority": "brand-policy-v4" }

Judgment fields on every record

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

04agents
Chain of custodyagent + human
Brand Agent09:02

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

2 Replies
judge type · agent
same trail
Sarah09:21

Accepted the finding: cleared with legal.

judge type · human
// agents
POST /v2/activities/get
{ "data": { "documentId": "filing-q3" } }

Agent actions in the same record

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

05recording
Recording pipelineon · day one

Every action recorded silently

Feed UIopt-in

Ship the timeline whenever

// recording
// recording pipeline is on from day one
// the feed UI stays opt-in

Recording on by default

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

06query
Queryactivities.get
documentIdfiling-q3
changedBysarah
featureapprovals
3 records matched200
// query
const records = useAllActivities({
  documentId, feature: "approvals",
});

Query API for documents, users, and time ranges

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

07decisions
Decision chainin order

Comment flagged the claim

Brand Agent · 09:02
flagged

Revision corrected the copy

Maya · 09:14
revised

Approval signed off

Sarah · 09:21
approved
// decisions
{ "priorJudgments": ["rec_112", "rec_118"] }

Decision chains

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

08immutable
Immutable recordson by default

Edit a record

rec_118originalnew linked recordrec_204linked

Delete the content

content removedrecord standsrec_118preserved
// immutable
// immutability is on by default for new accounts
// edits append a new linked record; deletes preserve

Immutable records

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

09exports
Exportssame chain

Record set

filing-q3 · 142 records

JSONREST APIshipped
PDFpackagesoon
CSVexportsoon
Hash chainstamper-evidentsoon
// exports
velt.activities.get({ document: "filing-q3", format: "json" });

Exports for auditors

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

10custom events
Custom eventsyour types
deployv2.14 → productioncustom
exportquarterly packagecustom
permission.changedrole · editor → admincustom
// custom events
velt.createActivity({
  type: "deploy", judgeType: "human",
  reasoning: "release v2.14",
});

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.

Look

VeltActivityLog for the fast path; wireframes and primitives for fully custom audit timelines; template variables and dark mode.

Acme · Audityour theme
approval.changedSarah · 09:21signed
edit.mergedMaya · 09:14signed
comment.addedDev · 09:02signed

Behavior

Custom events via createActivity, content capture tiers per your privacy posture, webhooks into your compliance pipeline, self-host activity provider.

Audit configyour rules
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
Contract sign-off
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

See it running in products like yours.

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

Book Demo
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.