Skip to main content
Content versioning

Version history for your catalogue and editorial content, native to Vendure

Snapshot every save, diff any two versions, restore one click. Draft mode to stage seasonal changes without affecting live. Per-language translations versioned in place. No CMS sync to debug.

Versioning · two paths
one wins
Bolt on a CMStwo systems
Headless CMScopy · structured fields
sync · drift-prone
Commerce backendproducts · prices · stock
Single source of truth: whichever was updated lasttwo data models · two backups · two outage surfaces
Native to Vendureone system
Vendure entitiessame rows your storefront reads
history · in place
v.42active
v.41snapshot
v.40snapshot
History built into the same entityno sync · no drift · one source of truth
two systems · sync driftone system · history in place

Don't bolt on a CMS to answer 'what did this look like last quarter'

The standard pattern is to add a separate headless CMS for content governance, then sync product fields between the CMS and the commerce backend. You debug two systems, you reconcile two data models, and the "single source of truth" is whichever one was most recently updated.

Vendure ships versioning natively. It works on the same Vendure entities your storefront reads, captures translations per language, and stores snapshots through the same plugin layer the rest of the platform extends through.

What this plugin gives you

Snapshots, drafts, diff, restore, on your data

Snapshot, draft, diff, and restore are all available through the dashboard and the GraphQL admin API.

Snapshot mode

Every save creates an immutable version. The active entity updates immediately, the prior state is preserved as a SNAPSHOT row. Configurable per-entity via ProductVersionStrategy({ mode: 'snapshot' }) and analogous strategies you write for your own entities.

Draft mode

An alternative mode for editorial workflows that need staging. Saves create DRAFT versions without affecting the live entity. Editors publish explicitly when the change is ready. At most one draft per entity, so there is no ambiguity about which draft is "the" pending change.

Per-entity strategies

VersionStrategy<T> is the extension point. Product is provided. Define your own for collections, facets, custom entities. Each strategy owns its serialize, restore, and preview semantics. The strategy guide covers resolver patterns for entities whose core resolvers always query by ID.

Visual diff and one-click restore

The dashboard ships a VersionList, a VersionDiffView, and a VersionedSaveButton that integrate into entity detail pages. Pick any two versions, see field-level differences side by side, restore to a prior version with one click. Translations and custom fields are surfaced in the same view.

Snapshot lifecycle
one path
Saveedit event
Versioning serviceone path
Strategyserialize · restore
typed snapshot · row tagged with statusv.42
activedraftsnapshot
Draftstaged change
PreviewShop API · draft key
Publishpromote to active
now
scheduled
save · serialize · status · preview · publishone lifecycle

A coherent lifecycle, not a bag of side tables

Every save flows through the same path. A versioning service hands the entity to the strategy registered for it, the strategy returns a typed snapshot (core fields, translations, related IDs, custom fields, and an extra bucket for anything that doesn't fit), and that snapshot lands as a row with a version number and a status: active, draft, or snapshot.

Restores read the same shape back through the same strategy, so what you saved is what you get back. Drafts stay invisible to the live storefront until you ask for them: pass a draft-mode key to the Shop API to preview unpublished content in context, then publish immediately, or on a schedule you set.

The dashboard talks to this model through the admin GraphQL API. The same handful of operations (versioningInfo, saveDraft, restoreVersion) are available to your own plugins, so an internal editorial workflow uses the same surface the built-in UI does.

Versioned timeline · one history
three uses
v.01v.13
Evidence pull
compliance reads 2026-01-15
Seasonal launch
staged batch publishes
Snapshot restore
bad import undone
same timeline · regulated · editorial · recoveryone mechanism

Three scenarios this plugin was built for

Editorial-governance evidence
what + who
Versioning · whatsnapshots over time
v.40description · price · translations
v.41description copy revised
v.42snapshot restored from v.40
Editorial-governance evidencewhat changed × who changed it
signed export
Audit · whoadministrator + timestamp
r.masonupdated description14:02
j.okaforupdated price14:18
r.masonrestored snapshot v.4014:31
rollback writes to both streamsa rollback is itself evidence

Versioning answers 'what'. Audit answers 'who'.

Snapshots tell you what a product looked like at any point. Audit logs tell you which administrator changed it and when. Together they are the editorial-governance evidence regulated catalogues need.

Each plugin is configurable independently. Versioning runs the strategies you nominate. Audit captures the change events the platform emits, including the operations that update versioned entities.

Versioned restores show up in the audit trail like any other write. A rollback is itself evidence.

Audit Logging → · Governance & Compliance overview →

Trusted by complex B2B commerce and enterprise retail.

FAQ

What content, merchandising, and engineering teams ask

The questions every editorial-governance evaluation asks before signing.

Live demo

Content versioning, live in a demo

Sixty minutes with the team. We walk through snapshot mode, draft mode, preview before publishing, scheduled publishing, and the diff and restore flow on a real Vendure deployment.