Change tracking and delta queries in Dataverse

How Dataverse change tracking enables efficient incremental sync — enabling per table, using delta tokens, and integration patterns.

Updated 2026-12-28

For any integration that periodically pulls data from Dataverse — analytics ETL, search-index updates, external-system sync, archive workflows — fetching the full table every time is wasteful. Change tracking is the Dataverse mechanism that lets consumers fetch only what's changed since their last query, dramatically reducing load and improving sync freshness.

The model. Change tracking is enabled per table. When enabled, every modification (Create, Update, Delete) on the table records to a change-log. Consumers query with a delta token representing the point they last synced; the response returns:

  • Records modified since the token.
  • Deleted record IDs since the token.
  • A new delta token to use for the next query.

The pattern: query → get changes → process → save the new token → query again with the new token next time.

Enabling change tracking. In the table's settings: Track changes toggle. Once enabled, the change-tracking infrastructure starts immediately for new changes; existing records are not retroactively tracked. The first query returns all current records as the "initial state" plus a starting delta token.

Microsoft has change tracking enabled by default for most standard tables; custom tables need explicit enabling.

The delta token. The token is opaque to consumers — a long string the Web API issues. Each query passes the previous token; the response contains the new one. Tokens are valid for a configurable window (typically 30 days for Dataverse); after expiry, the consumer must do a full re-fetch.

The API pattern.

GET /api/data/v9.2/accounts?$select=name,modifiedon
Prefer: odata.track-changes

Initial response includes a @odata.deltaLink header with the URL containing the token. Next query:

GET <deltaLink URL>

Returns only the changes since the previous query's snapshot moment.

Use cases.

  • Search-index refresh — keep an Azure Cognitive Search index aligned with Dataverse; query the delta hourly and update only changed records.
  • Data-warehouse loads — incremental loads into Synapse / Fabric / Snowflake without re-extracting unchanged rows.
  • External-system sync — keep a partner system aligned with Dataverse changes.
  • Cache invalidation — invalidate cached records when they change.

Synapse Link as the modern alternative. For analytics workloads, Synapse Link for Dataverse offers a managed alternative: continuous near-real-time replication of Dataverse changes to OneLake (or to a Data Lake / Synapse). The customer doesn't manage delta tokens; Microsoft handles the change capture and streaming.

For analytics use cases at scale, Synapse Link is generally preferable to roll-your-own change-tracking queries. Change tracking is the right path for:

  • Specific, low-volume targeted syncs (not broad analytics).
  • Custom integration patterns where Synapse Link isn't suitable.
  • Real-time triggers where the consumer wants explicit control.

Limits.

  • Token expiry — 30-day default. Long-paused consumers must do full re-fetches.
  • Filter doesn't apply to deletes — when a record is deleted, the change-tracking response includes its ID but no fields; you can't filter "only deletes in EMEA" effectively.
  • Performance at scale — extremely high change rates produce large delta responses; chunk and paginate.
  • Schema changes — if a column is added after tracking starts, historical changes don't have data in that column.

Comparison with webhooks / Service Bus. Change tracking is pull-based — the consumer queries periodically. Webhooks and Service Bus integration are push-based — Dataverse notifies the consumer of each change. Trade-offs:

  • Pull (change tracking) — consumer controls cadence; works for batch sync; doesn't lose events if the consumer is down.
  • Push (webhooks / Service Bus) — near-real-time; the consumer must be available or use a durable buffer like Service Bus to avoid loss.

Many architectures use push for real-time and pull for backfill / reconciliation.

Common pitfalls.

  • Forgetting to enable on a custom table — incremental sync doesn't work; fall back to full re-fetches.
  • Not handling token expiry — once the token expires, the consumer must detect and re-initialise.
  • Assuming change tracking catches everything — some bulk operations (some plug-in bypasses, direct SQL in on-premise) don't show in the change feed. Verify per use case.

Operational discipline. Build delta-aware integrations from the start. The performance and freshness advantages compound at scale; retrofitting later is more work than enabling early.

Related guides