Webhooks vs events in Dataverse
How Dataverse exposes change notifications — webhooks, service endpoints to Azure Service Bus / Event Hub / Event Grid, and the trade-offs in reliability and scale.
When something happens in Dataverse — a record created, updated, or deleted — external systems often need to react. Dataverse provides multiple mechanisms to publish these events: plug-in step → webhook, plug-in step → service endpoint (Service Bus, Event Hub, Event Grid). Each has different reliability, scale, and operational characteristics.
The plug-in step pattern. All event publication originates from the same place: a plug-in step registered against a table event. The step's destination determines the mechanism:
- In-process plug-in — runs in Dataverse, mutates the row or related rows.
- Webhook — Dataverse POSTs to an external HTTPS endpoint.
- Service endpoint — Dataverse publishes to Azure Service Bus, Event Hub, or Event Grid.
Each is configured via the Plug-in Registration Tool or solution-aware code, with similar registration metadata.
Webhooks.
- Dataverse calls an HTTPS URL with the event payload.
- Endpoint receives, returns 200 (or fails).
- Synchronous delivery — Dataverse waits for the response before continuing (with timeout).
- Retries on failure (limited retries; eventually gives up).
- Authentication via shared key or no auth (with caution).
Best for:
- Custom logic running in Azure Functions, Logic Apps, or your own services.
- Quick integration without infrastructure.
- Scenarios where occasional event loss is tolerable.
Limitations:
- Reliability — receiver failures lead to dropped events after retry exhaustion.
- Scale — Dataverse blocks while waiting for response; slow receivers impact source.
- Ordering — no strict ordering guaranteed.
Azure Service Bus.
- Dataverse publishes to a Service Bus queue or topic.
- Decoupled — events buffered for subscribers.
- Strong reliability — guaranteed delivery to receivers.
- Subscribers process at their own pace.
- Higher infrastructure cost; needs Service Bus namespace.
Best for:
- High-reliability integrations.
- Heavy downstream processing.
- Multiple consumers of the same event.
Azure Event Hub.
- High-throughput event ingestion.
- Optimised for many events per second.
- Used with telemetry-style scenarios.
Best for:
- Very high-volume event streams.
- Analytics ingestion.
- Event sourcing patterns.
Azure Event Grid.
- Event routing with topic/subscription model.
- Multiple subscribers per event.
- Native integration with many Azure services.
- Generally lower cost for moderate volumes than Service Bus.
Best for:
- Pub/sub patterns with multiple receivers.
- Routing events to various Azure services.
- Cross-product Azure-centric integrations.
Comparison table.
| Aspect | Webhook | Service Bus | Event Hub | Event Grid | |---|---|---|---|---| | Coupling | Tight | Loose | Loose | Loose | | Reliability | OK | High | High | High | | Volume | Low-mid | Mid-high | Very high | Mid-high | | Setup complexity | Low | Mid | Mid | Mid | | Cost | None | Per msg | Per ingestion | Per operation | | Use case | Simple webhook | Critical integration | Telemetry | Pub/sub routing |
Synchronous vs asynchronous.
- Synchronous (Pre/Post-op stage) — plug-in fires inline with the Dataverse operation; user waits.
- Asynchronous (Post-op + async) — fires after commit, queued, executed by Dataverse's async job processor.
For external publication, asynchronous is almost always right — sync webhooks block the user's experience.
Payload format. The payload varies:
- Native Dataverse format —
ExecutionContextserialised. - CloudEvents — when configured for Event Grid in CloudEvents schema mode.
CloudEvents is the modern, interoperable format; preferred for new integrations.
Authentication.
- Webhook — shared key (header value), or HTTP Basic.
- Service Bus — connection string (SAS key) with policy.
- Event Hub / Event Grid — similar SAS-based auth.
Service principal-based auth is preferred over shared keys; setup is more complex but more secure.
Filtering at source. Reduce noise by only publishing events that matter:
- Filtering attributes — only fire when specific columns change.
- Conditional execution — plug-in checks before publishing.
Source-side filtering reduces downstream volume.
Replay and dead-letter handling.
- Service Bus — dead-letter queue for failed messages; messages can be inspected and re-processed.
- Event Hub — events persist for configurable retention; consumers can replay.
- Event Grid — dead-letter to storage; advanced retry policy.
- Webhook — no dead-letter; permanent loss after retries.
For critical integrations, never use webhooks alone — the lack of dead-letter handling is operationally risky.
Idempotency. Receivers should be idempotent — handle the same event twice without bad side effects. All event mechanisms have at-least-once delivery; duplicates happen.
Monitoring.
- Plug-in execution failures — visible in Dataverse async job logs.
- Service Bus metrics — message counts, dead-letter counts.
- Webhook failures — show in Dataverse but not retrievable beyond a window.
Service Bus and Event Grid provide much richer observability than webhooks alone.
Common pitfalls.
- Webhook for critical events. Receiver failure = event lost; downstream system out of sync. Use Service Bus or Event Grid for reliability.
- No idempotency at receiver. Duplicate events cause duplicate side effects.
- Source-side filtering missing. All updates published; downstream system overwhelmed.
- Authentication via shared keys. Keys leak in code or logs; security incident.
- No dead-letter handling. Failed events disappear; integration silently incomplete.
- Synchronous webhook with slow receiver. Dataverse operations slow for users; blame the system.
Strategic positioning. Choose the mechanism per integration's needs:
- Internal Power Platform integrations — Power Automate flows triggered by Dataverse events, no Service Bus needed.
- Lightweight external — webhook to Azure Function.
- Critical external — Service Bus or Event Grid.
- Very high-volume telemetry — Event Hub.
The cost of choosing wrong: brittle integrations. The cost of choosing right: infrastructure investment that pays back in reliability. Most production integrations should use Service Bus or Event Grid; webhooks are for prototypes and low-stakes scenarios.
Related guides
- Change tracking and delta queries in DataverseHow Dataverse change tracking enables efficient incremental sync — enabling per table, using delta tokens, and integration patterns.
- Event Grid with DataverseHow Azure Event Grid integrates with Dataverse — schema, subscribers, when to use Event Grid vs Service Bus, and operational patterns.
- Webhooks in Business CentralHow webhook subscriptions work in Business Central — subscribing, renewing, payloads, and the realities of consuming change notifications.
- Message replay and poison queue handling for Dynamics 365 integrationsHow to design Dynamics 365 integrations that survive transient failures and handle poison messages — dead-letter queues, replay tooling, idempotency, and the operational rhythms.
- MQTT and IoT integration with Dynamics 365How MQTT protocol fits IoT scenarios for Dynamics 365 — Azure IoT Hub, message routing, and the patterns for getting device telemetry into Dynamics workflows.