Webhooks vs events in Dataverse
By Emil Björk · Microsoft business apps consultant, Gothenburg
How Dataverse exposes change notifications — webhooks, service endpoints to Azure Service Bus / Event Hub / Event Grid.
On this page (6)
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.
Where to go next
Deeper on each destination: Service Bus integration, Event Grid with Dataverse, and the reliability pattern that makes any of them safe, the outbox pattern. Receivers need idempotency; the step that publishes is a plug-in, whose failure modes are in plug-in exceptions explained.
Frequently asked questions
What are the options for publishing Dataverse events externally?
- A plug-in step registered on a table event whose destination is a webhook (HTTPS POST) or a service endpoint to Azure Service Bus, Event Hub, or Event Grid. All are configured through the Plug-in Registration Tool with similar metadata.
Why not use webhooks for critical integrations?
- Webhooks have limited retries and no dead-letter queue, so a failing receiver eventually means a permanently lost event. Service Bus and Event Grid buffer, guarantee delivery, and dead-letter failures for inspection and replay.
Should the publishing step be synchronous or asynchronous?
- Asynchronous, almost always. A synchronous webhook makes the user wait for the external receiver, and a slow receiver makes Dataverse feel slow.
Do receivers need to be idempotent?
- Yes. Every mechanism delivers at least once, so duplicates happen. Receivers must handle the same event twice without duplicate side effects.
Which Azure service fits which scenario?
- Service Bus for critical integrations with heavy downstream processing; Event Grid for pub/sub routing to multiple Azure subscribers at moderate volume; Event Hub for very high-volume telemetry-style streams.
Further reading
Related guides
- Message replay and poison queue handling for D365How to design Dynamics 365 integrations that survive transient failures and handle poison messages — dead-letter queues, replay tooling, idempotency.
- Business Central webhooks vs Azure Service Bus subscribersTwo ways for external systems to learn that something changed in Business Central — API webhook subscriptions or a Service Bus queue fed from AL.
- 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.
Browse every guide in Integrations or just Eventing & messaging.
Integrations architecture
Was this helpful?
Signals which guides land and which need work. No account, no comment box — corrections go through the contact page.
Spot something wrong or want a topic covered? Send a correction or a topic request — both are welcome.