Don't write directly to Dataverse

Direct integrations into Dataverse lose data, create duplicates and fail silently. The Azure Service Bus inbound pattern that prevents all three. Part 1.

Power Platform · Messaging · Service Bus · Integration · Dataverse

A cloud at the centre of a network of connected systems
Part 1 of 2 Integration Architecture Power Platform

Why I stopped letting external systems talk directly to Power Platform.

Direct integrations feel simple. They work — until they don't. Here's the inbound pattern I now reach for every time, and the five problems it quietly eliminates before they become your 2am incident.

You've built the integration. An external system — maybe a third-party platform, a legacy database, an external API — pushes data directly into Power Platform. A flow fires, a record gets created in Dataverse. It works in testing. It works in UAT. You go live.

Three weeks later, you're looking at duplicate contacts, missing records, and a business stakeholder asking why the same customer appears four times with slightly different details.

This is the pattern I use instead — and why I won't go back.


Five failure modes that don't show up in testing.

01
No retry protection — failure means data loss.
If Dataverse is throttled, your flow errors, or the network blips at exactly the wrong moment, that inbound message is gone. The sending system has moved on. You have a gap in your data and no way to recover it without manual intervention.
02
No deduplication — the same record appears twice.
External systems are often trigger-happy. A webhook fires twice on the same event. A user submits a form and clicks again. Without a deduplication layer, both messages land in Dataverse and you get two contacts, two records, two of everything. Business rules can't save you if the data is already in.
03
No business rule enforcement before data lands.
Direct integrations skip your validation layer entirely. Malformed payloads, missing required fields, unexpected formats — they all arrive at Dataverse and either fail silently or create dirty records that take weeks to find and clean.
04
No protection against high volumes.
Dataverse and Power Automate both have API limits. A bulk import, a campaign response spike, or a poorly throttled third party can saturate your limits in minutes. Without a buffer, those messages pile up against a wall — and the wall wins.
05
No visibility when things go wrong.
When a direct call fails, where does the error go? Often nowhere visible. You only find out something broke when a user complains. There's no dead-letter queue, no poisoned message store, no audit trail — just silence.

Inbound via Azure Service Bus.

Stop letting external systems talk to Power Platform directly. They talk to a queue. Your processor talks to Power Platform. The queue is the buffer, the safety net, and the audit trail.

Direct integration — fragile
Flat Files
CSV / XLSX / JSON
Website Form
Web submission
Third-party CRM
External system
Legacy System
Old infrastructure
No retry
No dedup
No rules
No limits
Power Automate
No buffer · No retry
Dataverse
Dirty · Duplicate · Missing
✕ Data loss ✕ Duplicates ✕ Dirty records ✕ Silent failures ✕ No audit trail
Resilient inbound pattern — production grade
Flat Files
CSV / XLSX / JSON
Website Form
Web submission
Third-party CRM
External system
Legacy System
Old infrastructure
publish message
Azure Service Bus
Queue / Topic
Automatic retry policy Dead-letter queue Throttle buffer Message ordering & lock
peek-lock / consume
Message Processor
Azure Function / Power Automate
Validate payload & required fields
Apply business rules
Deduplication check
Transform & enrich
clean, validated write
Dataverse
Dynamics 365
Dead-Letter Store
Failed messages
App Insights
Monitoring
Auto-retry Deduplication gate Dead-letter visibility Throttle resilient Validated writes Full audit trail

What each layer actually does for you.

Azure Service Bus — the buffer.
Decouples the sender from the receiver
  • External systems publish and forget. They don't need to know if Dataverse is throttled or your flow is backed up.
  • Messages are durable. If nothing consumes them for an hour, they're still there waiting.
  • Built-in retry policy means transient failures are handled automatically, with configurable backoff.
  • Dead-letter queue captures anything that exhausts retries — you get visibility, not silence.
The processor — your rules enforcer.
Business logic lives here, not in Dataverse
  • Before anything touches Dataverse, the processor validates the payload, checks required fields, and rejects what doesn't belong.
  • Deduplication happens here — check against existing records by email, external ID, or composite key before you write.
  • Transformation lives here too — normalise formats, resolve lookups, enrich with data from other systems.
  • Azure Function gives you full control and language choice. Power Automate works for simpler flows but hits limits faster under load.
Dataverse — only sees clean data.
Protected from volume, malformation, and duplicates
  • By the time a record reaches Dataverse, it has been validated, deduplicated, and transformed. Your CRM stays clean.
  • API limits are protected by the Service Bus buffer — high-volume spikes are absorbed upstream, not thrown at Dataverse directly.
  • The Service Bus audit trail means you can replay or investigate any message that ever entered the pipeline.

When does this pattern make sense?

Not every integration needs this. A simple internal Power Automate flow triggered by a Dataverse change doesn't need a Service Bus in front of it. But reach for this pattern whenever you see any of the following.

01External system you don't control
02Bulk or batch data imports
03Business-critical or regulated data
04Webhook-driven integrations
05Variable or unpredictable volumes
06Any environment where silent data loss is unacceptable

What this actually changes.

The most common objection is that it feels like overkill. More infrastructure, more moving parts, more to understand.

That's true in a greenfield environment with one integration and low volumes. But the moment you're running a Dynamics 365 environment that an organisation depends on — with customer records, transactional data, regulated information — the risk profile changes completely.

A Service Bus queue costs almost nothing to run at most integration volumes. What it buys you is the ability to sleep without worrying that a network blip at 3am has silently dropped fifty records with no way to recover them.

Coming next — Part 2 of 2

"The outbound journey — when Dataverse or Power Automate needs to push data out to an external system via a processor."

Same philosophy, different flow, different failure modes to protect against.

Read Part 2 →