---
title: "Events"
description: "All editor events emitted by the Tiptap Tracked Changes extension."
canonical_url: "https://tiptap.dev/docs/tracked-changes/api-reference/events"
---

# Events

All editor events emitted by the Tiptap Tracked Changes extension.

The extension emits events you can listen to with `editor.on()`. All events include the transaction that triggered them.

## trackedChanges:suggestionCreated

Fired when a new suggestion is created (either from user editing or restored via undo/collaboration). Programmatic commands can also include an optional `reason`, which is exposed on this event payload.

```js
editor.on('trackedChanges:suggestionCreated', ({ suggestion, reason, transaction }) => {
  console.log('New suggestion:', suggestion.id, suggestion.type, reason)
})
```

## trackedChanges:suggestionAccepted

Fired when a suggestion is accepted.

```js
editor.on('trackedChanges:suggestionAccepted', ({ suggestionId, suggestion, transaction }) => {
  console.log('Accepted:', suggestionId)
})
```

## trackedChanges:suggestionRejected

Fired when a suggestion is rejected.

```js
editor.on('trackedChanges:suggestionRejected', ({ suggestionId, suggestion, transaction }) => {
  console.log('Rejected:', suggestionId)
})
```

## trackedChanges:suggestionRemoved

Fired when a suggestion is removed from the document (e.g., by deleting an "add" suggestion's content).

```js
editor.on(
  'trackedChanges:suggestionRemoved',
  ({ suggestionId, suggestion, removedBy, canRestore }) => {
    // removedBy is 'edit' or 'delete'
    console.log('Removed:', suggestionId, 'by', removedBy)
  },
)
```

## trackedChanges:suggestionsUpdated

Fired after bulk operations like `acceptAllSuggestions`, `rejectSuggestionsInRange`, etc.

```js
editor.on('trackedChanges:suggestionsUpdated', ({ suggestions, operation, affectedIds }) => {
  // operation: 'acceptAll' | 'rejectAll' | 'acceptInRange' | 'rejectInRange' | 'acceptByUser' | 'rejectByUser'
  console.log(`${operation} affected ${affectedIds.length} suggestions`)
})
```

## trackedChanges:suggestionChanged

Fired whenever any content-bearing field of a suggestion changes — including range positions, text content, mark changes, or type. Use this event as the single source of truth for keeping external state (such as comment thread metadata) in sync with a suggestion.

The payload includes both the previous and updated suggestion so you can diff exactly what changed.

```js
editor.on(
  'trackedChanges:suggestionChanged',
  ({ suggestionId, oldSuggestion, suggestion, transaction }) => {
    console.log('Suggestion updated:', suggestionId)
    console.log('Previous text:', oldSuggestion.text, '→ New text:', suggestion.text)
  },
)
```

## trackedChanges:suggestionRangeChanged

Fired when a suggestion's document positions shift due to other edits in the document. This event fires only on positional changes — it does not fire when non-positional fields like `text` or `markChanges` change. For a broader change signal, prefer `trackedChanges:suggestionChanged`.

```js
editor.on(
  'trackedChanges:suggestionRangeChanged',
  ({ suggestionId, oldRange, newRange, suggestion }) => {
    console.log(
      `Suggestion ${suggestionId} moved from ${oldRange.from}-${oldRange.to} to ${newRange.from}-${newRange.to}`,
    )
  },
)
```

## trackedChanges:enabled

Fired when track changes mode is enabled.

```js
editor.on('trackedChanges:enabled', ({ userId }) => {
  console.log('Track changes enabled for', userId)
})
```

## trackedChanges:disabled

Fired when track changes mode is disabled.

```js
editor.on('trackedChanges:disabled', ({ userId }) => {
  console.log('Track changes disabled')
})
```
