Connecting Dataverse to External Systems
Dataverse connects to external systems through six first-class paths: virtual tables (query external data without copying it), the Power Automate connector (event-driven sync and alternate-key upserts), the OData v4 Web API (direct REST for custom code), dual-write (near-real-time bi-directional sync with Dynamics 365 Finance and Supply Chain), the Power Query / Power BI connector (Import or DirectQuery analytics), and Link to Fabric / Azure Synapse Link (near-real-time analytics replicas). Pick by direction, volume, latency, and system-of-record—not by which name sounds newest.
TL;DR — Key takeaways
- Three components: data provider, data source row, virtual table
- Premium connector (formerly CDS current environment), available in all regions
- OData v4 (OASIS standard) REST API — works from any HTTP-capable language
- GA connector for Power BI, Excel, Fabric Dataflow Gen2, Customer Insights
The six ways Dataverse talks to the outside world
Microsoft Dataverse is the data layer under Dynamics 365 customer-engagement apps and the Power Platform, and almost every real implementation eventually has to wire it to something else — an ERP, a data warehouse, a reporting tool, a third-party SaaS app, or a custom service. Microsoft exposes that connectivity through a small, well-defined set of mechanisms rather than one universal adapter, and picking the wrong one is the most common reason an integration project runs late or performs poorly under load.
Treat six mechanisms as first-class. Virtual tables surface external data as native Dataverse tables at runtime without copying it in. The Microsoft Dataverse connector in Power Automate drives event-driven flows that react to row changes and perform create / update / upsert / delete operations. The OData v4 Web API gives custom code direct, standard REST access over HTTP. Dual-write is the Microsoft-supported near-real-time bi-directional bridge between finance and operations apps (Dynamics 365 Finance, Supply Chain Management, Commerce, and related F&O workloads) and Dataverse-hosted customer-engagement apps. The Power Query Dataverse connector (Power BI, Excel, Fabric Dataflow Gen2) is the interactive analytics path with Import and DirectQuery. Link to Microsoft Fabric and Azure Synapse Link for Dataverse continuously land Dataverse data in analytics-optimised stores for large-scale reporting and ML — Fabric as a managed SaaS path, Synapse Link when you own the lake storage.
These mechanisms are not interchangeable. Each is optimised for a direction of flow, a volume profile, and a latency target. A virtual table is right for read-mostly access to a few thousand rows in an external SQL database; it is wrong for nightly bulk loads of millions of rows, where Synapse Link or Link to Fabric is purpose-built. Dual-write is right when F&O and customer-engagement must share live customers, products, and orders; it is wrong as a general-purpose third-party SaaS connector. The Power BI connector is ideal for interactive dashboards over a moderate dataset; it will throttle on the same dataset that a Fabric or Synapse link lands in a lake in minutes. Treat the choice as an engineering decision, not a preference.
| Mechanism | Direction | Latency | Best for |
|---|---|---|---|
| Virtual tables | Dataverse reads external data (and can write back via the provider) | Real-time (query-time) | Read-mostly extension over an external system of record |
| Dataverse connector / Power Automate | Both (triggers on change; actions write to Dataverse) | Near-real-time (seconds to minutes) | Event-driven sync, automation, upserts, cross-system workflows |
| OData v4 Web API | Both (custom code reads and writes) | Real-time (per request) | Custom applications, migrations, integrations in any language |
| Power Query / Power BI connector | Dataverse out (read for analytics) | Import (scheduled) or DirectQuery (live) | Reporting, dashboards, self-service analytics |
| Dual-write (F&O ↔ Dataverse) | Bi-directional near-real-time | Near-real-time live sync after initial sync | Dynamics 365 Finance / SCM / Commerce with CE apps on Dataverse |
| Link to Fabric / Azure Synapse Link | Dataverse out (continuous replication) | Near-real-time (often ~15–45 min depending on volume) | Large-scale analytics, data warehousing, ML, avoiding transactional load |
Virtual tables: external data without the duplication
A virtual table is a custom Dataverse table whose rows live in an external data source and are fetched at query time, so they appear to users and apps as ordinary Dataverse records without the data ever being copied into your environment. Microsoft's documentation defines them plainly: 'A virtual table is a custom table in Microsoft Dataverse that has columns containing data from an external data source … you connect directly with an external data source at runtime so that specific data from the external data source is available in an environment, without the need for data replication.' That last clause is the entire value proposition — no stale copies, no nightly sync job, one source of truth.
A virtual table is built from three components: a data provider (the plug-in or connector that implements the read / create / update / delete logic against the external system), a data source row (metadata describing the connection parameters), and the virtual table itself, which references that data source. Dataverse ships an out-of-box OData v4 Data Provider for any OData v4 web service, plus a set of virtual connector providers that wrap Power Platform connectors — currently SQL Server, SharePoint, Microsoft Fabric, Salesforce, Oracle Database, Snowflake, PostgreSQL, and Azure Databricks. The virtual connector providers remove the need to write code: you pick a connector, authenticate through a connection reference, select the external tables, and Dataverse generates the virtual tables and keeps them inside a solution for application lifecycle management.
The trade-off is a clear feature ceiling. Virtual tables cannot be audited, cannot be used in rollup or calculated columns, do not support the Currency, Image, or Customer data types, cannot host charts or dashboards, cannot be activity tables, and cannot be converted from an existing standard table. Microsoft lists these restrictions explicitly, and they matter operationally: a model-driven app over a virtual table behaves like a normal app, but you lose the richer Dataverse governance features that depend on physical storage. Virtual tables are the right call when you need read-mostly access to an external system of record that must stay authoritative; they are the wrong call when you need heavy Dataverse-native logic, reporting, or bulk write throughput.
The OData v4 Data Provider has its own constraints worth knowing before you commit. Every virtual table needs a unique identifier column mapped to an Edm.Guid — you cannot map an Edm.Int32 to a Dataverse unique identifier, which trips up teams pointing Dataverse at an external database with integer primary keys. Nullable properties must match the mapped column's requirement setting, and retrieve-multiple queries should use $select and $filter to control result size. The provider also cannot connect from one Dataverse environment to another.
- Three components: data provider, data source row, virtual table
- Out-of-box OData v4 provider plus virtual connector providers (SQL, SharePoint, Fabric, Salesforce, Oracle, Snowflake, PostgreSQL, Databricks)
- No data replication — query-time access to the external system of record
- Feature ceiling: no auditing, rollups, calculated columns, charts, dashboards, or Currency/Image/Customer types
- OData v4 provider requires an Edm.Guid identifier and correct nullability mapping
| External source | Typical use | Notes |
|---|---|---|
| SQL Server | Reference / lookup data in an operational SQL database | Needs server, database, auth, optional gateway |
| SharePoint | Document or list data surfaced in model-driven apps | List metadata auto-discovered |
| Microsoft Fabric | Lakehouse / warehouse tables as Dataverse tables | Bridges analytics and operational layers |
| Salesforce | Cross-CRM read access without a migration | Read-mostly; bi-directional needs care |
| Oracle / PostgreSQL | Line-of-business databases of record | Standard relational virtualisation |
| Snowflake / Azure Databricks | Analytical datasets exposed to apps | Best for curated, lower-volume lookups |
The Dataverse connector and Power Automate: event-driven sync
The Microsoft Dataverse connector is the engine behind most event-driven integration on the Power Platform. It is a premium connector — formerly branded Common Data Service (current environment) — that exposes Dataverse triggers and actions to Power Automate, Power Apps, and Copilot Studio across every region. Its strength is that it understands Dataverse natively: triggers fire on row creation, update, or deletion for a chosen table (with filtering on attributes and scope), and actions can add, update, upsert, delete, list, and relate rows, or perform a bound action defined on the table. For an SME, this is usually the fastest way to make Dataverse react to its own changes and push or pull data into another system.
The upsert action deserves specific attention because it is the mechanism most teams reach for when syncing a third-party system into Dataverse. Upsert means 'update the row if a matching alternate key exists, otherwise create it' — and it is idempotent in a way that a plain create is not, which matters when a flow is triggered on a schedule and might reprocess the same source record. To use upsert reliably you define an alternate key on the target Dataverse table (for example, the external system's record ID), then point the action at that key. Without an alternate key, the connector can only create or update by Dataverse ID, which forces a pre-query and reintroduces the race conditions upsert is meant to eliminate.
Authentication and throttling shape every flow you build. The connector supports OAuth (interactive, not shareable), Service Principal (shareable, app-registration based), and client-certificate auth (shareable, PFX-based) — the latter two are what you want for unattended automation. It is throttled at 6,000 API calls per connection per 300-second renewal window, which mirrors the underlying Dataverse service-protection limit and bites harder than people expect when a flow lists rows in a loop and performs an action per row. The standard remediation is the same as for direct API code: paginate with FetchXML or OData $select / $filter, batch where the action supports it, use the 'List rows' pagination setting rather than per-row child flows, and apply concurrency and retry policies on the trigger.
- Premium connector (formerly CDS current environment), available in all regions
- Triggers on create / update / delete; actions for add, update, upsert, delete, list, relate, and bound actions
- Upsert needs an alternate key to be truly idempotent
- Auth: OAuth (not shareable), Service Principal, or client certificate (both shareable)
- Throttled at 6,000 calls per 300s per connection — paginate, batch, and avoid per-row child flows
| Capability | What it does | When to reach for it |
|---|---|---|
| Trigger: row added / updated / deleted | Fires when a qualifying change occurs on a chosen table | Reactive sync — push a new lead to marketing, archive a deleted record |
| Add a new row | Creates a row in a selected table | One-way ingestion from another system |
| Update a row / Upsert a row | Updates by ID, or upserts by alternate key | Idempotent sync keyed on an external identifier |
| List rows | Returns rows matching FetchXML or OData filter | Batch processing; combine with 'Apply to each' sparingly |
| Perform a bound action | Invokes a custom or standard action on a table | Reusable business logic encapsulated in Dataverse |
| Relate / unrelate rows | Creates or removes a N:N relationship | Tagging, association, and graph-style links |
The OData v4 Web API: direct REST access for custom code
When you need to integrate Dataverse from custom code — a migration tool, a single-page app, a backend service, or a non-Microsoft platform — the Web API is the canonical interface. Microsoft describes it as the development experience 'you can use across a wide variety of programming languages, platforms, and devices,' and it implements OData (Open Data Protocol) version 4.0, the OASIS standard for RESTful APIs over rich data sources. Because it is built on an open standard, you are not locked into a Microsoft SDK: you can compose raw HTTP requests or use any third-party OData v4 library, and Microsoft documents getting-started paths for PowerShell, client-side JavaScript, and .NET.
Operationally, the Web API maps the underlying organisation service onto REST. CRUD operations use the familiar HTTP verbs — GET to retrieve, POST to create, PATCH to update, DELETE to remove — while richer operations are exposed as OData functions and actions that correspond to the messages defined in the organisation service. This matters because it means the Web API is not a thin read layer: it can invoke business logic, execute workflows, and perform the same operations as the SDK for .NET, just in a RESTful style. Model-driven apps use it client-side through the Xrm.WebApi object, and Power Pages exposes a subset through its Portals Web API.
The Web API is the right choice when you need control that low-code tools cannot give you: high-throughput batched migration, transactional consistency across multiple requests, custom error handling and retry-on-429 logic, or integration from a language that has no Power Platform connector. It is also the fallback when a third-party system exposes no connector at all — you write a small service that reads from the source and writes to Dataverse through the Web API. The cost is engineering effort: you own authentication (typically OAuth or a service principal against Microsoft Entra ID), pagination, throttling compliance, and idempotency. Done well, it is the most flexible and performant path; done poorly, it is the fastest way to hit service-protection limits and corrupt data with partial writes.
- OData v4 (OASIS standard) REST API — works from any HTTP-capable language
- GET / POST / PATCH / DELETE for CRUD; functions and actions for richer operations
- No Microsoft SDK required — third-party OData v4 libraries are supported
- Client-side via Xrm.WebApi in model-driven apps; subset exposed by Power Pages
- You own auth, pagination, retry-on-429, and idempotency — highest flexibility, highest effort
| HTTP method | Operation | Notes |
|---|---|---|
| GET | Retrieve rows or a single row | Use $select, $filter, $expand to shape the payload |
| POST | Create a row | Returns the new record; supports deep insert of related rows |
| PATCH | Update a row (or upsert with If-Match / If-None-Match) | Concurrency control via ETag headers |
| DELETE | Remove a row | Cascade behaviour follows the table relationship config |
| Functions / Actions | Bound or unbound operations beyond CRUD | Mirror organisation-service messages |
The Power BI and Power Query connector: analytics and reporting
The Power Query Dataverse connector is the supported path for getting Dataverse data into Power BI, Excel, Fabric Dataflow Gen2, and Dynamics 365 Customer Insights. Microsoft is explicit about its purpose: 'The Dataverse connector lets you connect to data in Microsoft Dataverse environments from Power Query. Use this connector for analytics workloads involving Dataverse tables.' It is generally available, supports Import and — for Power BI semantic models — DirectQuery, and authenticates with an organisational account or a service principal. For most reporting scenarios this is the first and only connector you need.
The connector talks to Dataverse through the Tabular Data Stream (TDS) endpoint, which means the TDS endpoint setting must be enabled in your environment and one of TCP ports 1433 or 5558 must be open — port 1433 is used automatically, and if it is blocked you append 5558 to the environment URL (for example, yourenvironmentid.crm.dynamics.com,5558). This is a frequent point of failure in locked-down corporate networks, and it is the first thing to check when a refresh fails with a connection error. The legacy Common Data Service connector still exists for a handful of TDS data types that the current connector does not yet support, but Microsoft intends to deprecate it once parity is reached.
Performance expectations are documented and worth designing around. Microsoft's guidance is that most default tables are retrieved at roughly 500 rows per second through the connector, and it states plainly that the connector 'is mostly suited toward analytics workloads, not bulk data extraction.' For a dashboard over tens of thousands of rows, that rate is fine, especially in Import mode where the data is cached and refreshed on a schedule. For multi-million-row datasets, or any scenario where the refresh would run for hours or compete with transactional users for API quota, the documented recommendation is to switch to Azure Synapse Link (to land data in a lake first) or the TDS endpoint directly. DirectQuery mode keeps data live — every visual queries the source — but it inherits DirectQuery's general limits (a one-million-row ceiling on cloud sources, sub-five-second response targets, and load that scales with concurrent users).
- GA connector for Power BI, Excel, Fabric Dataflow Gen2, Customer Insights
- Requires the TDS endpoint enabled and port 1433 (or 5558) open
- Import mode caches and refreshes on schedule; DirectQuery queries Dataverse live
- Roughly 500 rows/sec guideline — not for bulk extraction
- For large volumes, prefer Synapse Link to a lake over pulling through the connector
| Mode | How it works | Choose when |
|---|---|---|
| Import | Copies selected tables into the Power BI semantic model; refresh on schedule | Moderate dataset size, fast interactive visuals, acceptable refresh latency |
| DirectQuery | No import; every visual queries Dataverse live at render time | You need always-current data and the dataset is within DirectQuery limits |
| Synapse/Fabric Link + Direct Lake | Data lands in a lake via continuous replication; Power BI reads the lake | Large datasets, high refresh frequency, or you must avoid loading Dataverse |
Dual-write: F&O and Dataverse as one operational fabric
When the external system is not a third-party SaaS tool but Dynamics 365 finance and operations apps — Finance, Supply Chain Management, Commerce, or the Human Resources module in Finance — dual-write is the supported near-real-time bi-directional integration with Dataverse. Microsoft's setup guidance is explicit: you establish a dual-write connection between a finance and operations environment and a Dataverse environment that hosts customer-engagement apps (Sales, Customer Service, Field Service, and related CE workloads). Once table maps are enabled for live synchronisation, changes flow both ways so that accounts, contacts, products, price lists, and other mapped entities stay aligned without a custom middleware project.
Dual-write is not 'just another connector.' It is a productised integration with its own lifecycle: Lifecycle Services (LCS) Power Platform integration to establish the link, an initial synchronisation to reconcile existing data on both sides before live sync starts, legal-entity / company scoping, and per-entity table maps you enable only after the initial sync for those tables is clean. Skipping initial sync is only safe when both sides truly have no data to reconcile. Bootstrap steps (including three-letter ISO company codes when seeding F&O companies from existing Dataverse data) matter on brownfield estates; greenfield paired environments get an empty CE instance with the CRM prime solution and live maps for DAT company data by default.
Choose dual-write when front-office and back-office Dynamics must share the same operational truth — a salesperson creates an account in Sales and finance needs it in F&O without overnight batch lag. Do not choose dual-write to integrate a non-Microsoft ERP or a random SaaS product; those cases still use virtual tables, Power Automate, the Web API, or a custom connector. Dual-write also does not replace analytics replication: for large-scale reporting over F&O and Dataverse data you still use Link to Fabric or Azure Synapse Link (both can surface finance and operations tables into the analytics tier). Keep dual-write for operational bi-directional entity sync; keep Fabric/Synapse for outbound analytics scale.
Operationally, dual-write needs ownership: map selection, error queues, company scoping, and a clear plan for initial sync volume. Industry coverage through 2026 continues to highlight dual-write as the native F&O↔Dataverse path, with ongoing investment in bulk and asynchronous patterns for large initial loads — but the architectural rule stays stable: productised maps for Dynamics-to-Dynamics operational sync, not a general integration bus.
- Near-real-time bi-directional sync between F&O apps and Dataverse-hosted CE apps
- Setup via LCS Power Platform integration; initial sync before live table maps
- Scope by legal entity / company; enable only the maps you need
- Not a general third-party integration bus — Dynamics-to-Dynamics operational path
- Pair with Link to Fabric or Synapse Link for analytics; keep dual-write for operations
| Scenario | Use dual-write? | Why |
|---|---|---|
| Dynamics 365 Sales + Dynamics 365 Finance sharing customers/products | Yes | Supported bi-directional live maps between CE (Dataverse) and F&O |
| Field Service work orders reflecting inventory in Supply Chain Management | Yes (mapped entities) | Operational front-office / back-office alignment is the dual-write job |
| Third-party ERP or warehouse system into Dataverse | No | Use virtual tables, Power Automate upsert, or Web API — not dual-write |
| Enterprise Power BI / Fabric analytics over multi-year history | No (pair separately) | Use Link to Fabric or Azure Synapse Link for outbound analytics scale |
| One-time migration of historical CE data into a new F&O company | Partial | Initial sync / bootstrap is part of dual-write setup; not a general ETL tool |
Link to Fabric and Azure Synapse Link: analytics without thrashing Dataverse
When the requirement is large-scale analytics, data warehousing, or machine learning over Dataverse data, pulling through the Power BI connector or the Web API is the wrong architecture — it strains Dataverse's service-protection limits and competes with interactive users. Microsoft now documents two complementary outbound paths. Link to Microsoft Fabric is the no-copy, no-ETL SaaS path: from Power Apps (make.powerapps.com) you create a Fabric link that makes Dynamics 365 and Power Apps data available in OneLake via shortcuts, generates a Fabric lakehouse, SQL endpoint, and Power BI dataset, and keeps operational workloads off the critical path by maintaining an optimised Delta/Parquet replica under Dataverse governance. Azure Synapse Link for Dataverse (formerly Export to data lake) is the IT-admin path that continuously exports to storage you own (ADLS Gen2 / Synapse) so you can build pipelines with Synapse, Fabric, Databricks, or other tools.
Microsoft's official comparison is the decision rule most teams need. Link to Fabric: no copy / no ETL into Fabric, data stays in the Dataverse governance boundary while authorised Fabric users work on it, tables with Track changes are added by default (admins manage tables later), and cost shows up as additional Dataverse storage rather than a separate Azure storage bill. Azure Synapse Link: export into your own storage account, you manage access, admins choose required tables, and you pay for your storage plus compute and integration tools. You can also connect existing Synapse Link profiles to Fabric (Delta parquet conversion required — not available for CSV-output profiles) to get Direct Lake reports and Fabric pipelines without abandoning an Azure-owned lake.
Freshness and scope planning matter. Microsoft's transition guidance describes Fabric link as a near-real-time read-only replica optimised for insights: Dataverse triggers update jobs on a frequent cadence, and depending on change volume you often see updated Parquet within roughly 15 to 45 minutes. Only tables with change tracking participate. Linked tables consume Dataverse database storage — for example Microsoft's illustrative guidance notes that syncing on the order of 500 GB of Dynamics data can add on the order of ~100 GB of Dataverse storage after Delta compression, which you monitor in the Power Platform admin center. As of 2026 Microsoft continues to invest in Link to Fabric as the primary sync path (including low-latency sync), with table-level management and planned multi-workspace linking; today an environment links to a single Fabric workspace.
Both options are outbound and read-oriented for analytics: they are not how you write operational changes back into Dataverse. Microsoft's Fabric pattern for actionability is different: surface insights from OneLake back into apps as virtual tables connected to Fabric / OneLake, then drive Power Apps, Power Pages, or Power Automate — not by treating the analytics link as a bi-directional bus. If you need true operational write-back from an external system, use the Dataverse connector, Web API, dual-write (for F&O), or a custom provider, and keep Fabric/Synapse strictly for the analytics read path.
- Link to Fabric: managed SaaS path, OneLake shortcuts, no BYO storage or Synapse workspace required
- Azure Synapse Link: continuous export to storage you own for custom analytics pipelines
- Typical Fabric update window often ~15–45 minutes depending on change volume; Track changes required
- Linked tables consume Dataverse storage — monitor capacity in the Power Platform admin center
- Write-back via virtual tables from Fabric insights or operational APIs — not via the analytics link itself
| Aspect | Link to Fabric | Azure Synapse Link |
|---|---|---|
| Integration style | No-copy, no-ETL SaaS link into OneLake via shortcuts | Export to your own storage; build pipelines as needed |
| Data residency / governance | Data stays in Dataverse boundary; Fabric users get secure access | Data lands in your storage; you manage access |
| Table selection | Nonsystem tables with Track changes by default; manage later | Admins choose required tables up front |
| Cost shape | Additional Dataverse storage (plus Fabric capacity for workloads) | Your Azure storage + Synapse/compute/integration tools |
| Format / consumption | Delta / Parquet replica; lakehouse, SQL endpoint, Direct Lake | CDM / Delta-Parquet in ADLS; Spark, Synapse, Fabric, Databricks |
| Best fit | Teams on (or moving to) Fabric who want managed analytics access | Azure-centric estates, multi-tool lakes, strict BYO storage control |
Custom connectors, plug-ins, webhooks, and Azure Service Bus
Not every external system has a first-class virtual connector provider or a Power Automate connector, and not every requirement fits the mainstream mechanisms above. For those gaps, the Power Platform offers custom connectors, plug-ins, and Azure-native event channels. A custom connector wraps a REST API (yours or a third party's) so it can be used inside Power Automate, Power Apps, and Copilot Studio exactly like a Microsoft-published connector — you define the operations, authentication, and triggers, and the platform handles the hosting. This is how most SMEs integrate a niche SaaS tool or an in-house API without writing bespoke middleware.
Plug-ins are the server-side extension point inside Dataverse: custom .NET assemblies registered against the event framework (pre- or post-operation on create, update, delete, and other messages). They enforce business logic that must run regardless of how a row was changed, and they are the foundation of custom virtual-table data providers when no out-of-box provider fits. Plug-ins are powerful but expensive to maintain — reserve them for logic that genuinely cannot live in a flow, business rule, or external service.
For enterprise event fan-out, Microsoft documents first-class Azure Service Bus integration: developers register service endpoints so Dataverse posts the runtime execution context (RemoteExecutionContext) to Azure Service Bus queues, topics, relays, or Event Hubs. An out-of-box Azure-aware plug-in or a custom Azure-aware plug-in (plus custom workflow activities) notifies the asynchronous service, which posts the context for listener applications. Contracts include queue (listener need not be online), one-way and two-way relays, REST, topic (multiple subscribers), and Event Hubs. Payload size matters: when the HTTP payload exceeds 192 KB, certain properties are stripped; if it still exceeds 192 KB after stripping, the message fails. This pattern is the supported way to keep external LOB systems synchronised with Dataverse changes without polling the Web API.
These mechanisms rarely stand alone in a mature integration. A typical SME pattern is a custom connector exposing an in-house API, triggered by a Dataverse connector event in Power Automate, which upserts a related table — three mechanisms in one flow. A typical mid-market pattern adds Service Bus topics so multiple downstream systems subscribe without each owning a Power Automate connection. Put each responsibility where it is cheapest: event orchestration in Power Automate or Service Bus, business rules in Dataverse (plug-ins only when necessary), API translation in a custom connector, F&O operational sync in dual-write, and heavy analytics movement in Link to Fabric or Synapse Link.
- Custom connectors wrap any REST API for Power Automate, Power Apps, and Copilot Studio
- Plug-ins enforce server-side logic and power custom virtual-table providers
- Azure Service Bus integration posts execution context to queues, topics, relays, or Event Hubs
- Respect the ~192 KB Service Bus payload behaviour; register steps asynchronously for performance
- Combine mechanisms: connector + flow for SMEs; Service Bus topics for multi-consumer mid-market estates
| Mechanism | Who builds it | Best for |
|---|---|---|
| Custom connector | Low-code / pro-dev hybrid | Wrapping a third-party or in-house REST API for Power Automate and apps |
| Plug-in (sandbox) | Pro-dev | In-transaction business rules and custom virtual-table providers |
| Azure Service Bus / Event Hubs endpoint | Pro-dev + Azure | Reliable fan-out of Dataverse change context to external listeners |
| Power Automate + Dataverse connector | Low-code | SME event-driven sync when volume fits connector throttles |
Which integration should you choose? A decision matrix
Most integration failures are decision failures, not technical ones — the team picked a mechanism that could technically work but was wrong for the volume, latency, or write requirement. The matrix below collapses the choice to the attributes that actually determine fit: the direction of data flow (read external, write to Dataverse, export Dataverse, or bi-directional Dynamics operational sync), the volume profile, the acceptable latency, and whether the external data must stay authoritative in its source system.
Read the matrix as a routing table, not a ranking. A low-volume, real-time lookup of customer credit status from an external SQL database routes cleanly to a virtual table. A nightly sync of 200,000 order lines from a non-Microsoft ERP into Dataverse routes to the Web API or the Dataverse connector with an alternate-key upsert — never to a virtual table, which would query the ERP on every page load. Dynamics 365 Sales sharing customers with Dynamics 365 Finance routes to dual-write, not to a hand-rolled flow. A Power BI dashboard over five years of Dataverse history routes to Link to Fabric or Synapse Link, not to the Power BI connector, which would throttle long before the refresh finished. And a 'send new leads to marketing automation' requirement routes to a Power Automate trigger, because it is event-driven, low-volume, and needs to react within minutes.
- Route by direction of flow, volume, latency, system-of-record, and whether both ends are Dynamics
- Virtual tables: real-time read of external data, no duplication
- Power Automate + connector: event-driven, near-real-time, idempotent upserts
- Dual-write: F&O ↔ Dataverse operational bi-directional maps only
- Web API: custom code, high throughput, full control
- Power BI connector for moderate analytics; Link to Fabric / Synapse Link above that
| Requirement | Volume | Latency | Recommended mechanism |
|---|---|---|---|
| Read external data in model-driven apps; source stays authoritative | Low to moderate | Real-time | Virtual table (connector or OData v4 provider) |
| React to a Dataverse row change and act in another system | Low to moderate | Near-real-time | Dataverse connector trigger in Power Automate |
| Sync records from a third-party system into Dataverse | Moderate | Scheduled / near-real-time | Dataverse connector upsert (alternate key) or Web API |
| Bi-directional operational sync F&O ↔ CE apps | Mapped entities | Near-real-time live | Dual-write (after initial sync) |
| High-throughput migration or custom-code integration | High | Batch | OData v4 Web API with batching and retry-on-429 |
| Interactive Power BI / Excel reporting | Low to moderate | Import or DirectQuery | Power Query Dataverse connector |
| Large-scale analytics, data warehouse, or ML | Very high | Near-real-time push | Link to Fabric (SaaS) or Azure Synapse Link (BYO storage) |
| Fan-out Dataverse changes to many LOB listeners | Event stream | Async | Azure Service Bus / Event Hubs service endpoint |
| Wrap a third-party REST API with no connector | Any | Per call | Custom connector (+ Power Automate orchestration) |
SME vs mid-market: which stack you actually need
The same decision matrix applies at every scale, but the default stack should not. SMEs with one Dynamics 365 Sales or Customer Service environment, a handful of SaaS tools, and a small IT team usually win with low-code first: virtual tables for reference data, Power Automate with alternate-key upserts for event-driven sync, the Power BI connector in Import mode for operational dashboards, and a custom connector only when a SaaS product has no published connector. That combination ships in days, stays solution-aware for ALM, and fails in obvious places (flow run history) rather than silent Service Bus dead-letters nobody is watching.
Mid-market and multi-app Dynamics estates change the defaults. If you run finance and operations apps alongside customer engagement, dual-write becomes mandatory infrastructure — not optional middleware. If reporting spans multi-year history or many concurrent analysts, Link to Fabric (when Fabric is the analytics standard) or Azure Synapse Link (when you already own a lake and multi-tool estate) replaces the Power BI connector as the primary analytics path. If several external systems must react to the same Account or Order change without each owning a flow connection, Azure Service Bus topics beat a thicket of Power Automate child flows on reliability and fan-out.
Budget the non-happy path. SMEs should still design for the 6,000-request service-protection window and connector throttle, but they can often stay inside Power Automate with pagination and concurrency controls. Mid-market teams should assume they will hit 429s under load, implement retry-on-429 in Web API clients, monitor Service Bus system jobs, and treat dual-write error queues as production incidents. In both cases, name an owner for each integration surface — an integration no one owns is the one that fails the week you hire a new controller.
- SMEs: low-code first — virtual tables, Power Automate, Power BI Import, custom connectors
- F&O + CE: dual-write is infrastructure, not a project side quest
- Mid-market analytics: Link to Fabric or Synapse Link, not the Power BI connector alone
- Multi-consumer events: Service Bus topics over per-system child flows
- Name an owner and design for 429s before go-live, not after the first outage
| Profile | Operational sync | Analytics | Events / extensions |
|---|---|---|---|
| SME — CE apps + a few SaaS tools | Power Automate upserts; virtual tables for lookups | Power BI Import connector | Custom connectors; plug-ins only if unavoidable |
| SME — CE + light F&O footprint | Dual-write for shared entities; flows for the rest | Power BI Import; Fabric link when reporting grows | Flows first; Service Bus only if listeners multiply |
| Mid-market — full F&O + CE | Dual-write as core; Web API for non-mapped systems | Link to Fabric or Synapse Link + Direct Lake | Service Bus / Event Hubs for LOB fan-out |
| Mid-market — multi-cloud / multi-ERP | Web API + iPaaS; virtual tables at the edge | Synapse Link (BYO lake) or Fabric + shortcuts | Service Bus topics; custom providers sparingly |
The constraints every option shares: throttling, security, and ALM
Every mechanism above runs on the same underlying Dataverse service, so they share the same guardrails — and ignoring them is the fastest way to build an integration that works in dev and falls over in production. Throttling is governed by the service-protection API limits: 6,000 requests, 20 minutes of combined execution time, and roughly 52 concurrent requests per user per web server in a five-minute sliding window, with breaches returning HTTP 429 and a Retry-After header. The Dataverse connector inherits a 6,000-call / 300-second limit per connection, and the Power Query connector inherits the same underlying request quotas. Any integration that loops and calls Dataverse per row must paginate, batch, and implement retry-on-429 — there is no mechanism that exempts you from these limits.
Security travels with the data. Authentication across the code path is Microsoft Entra ID — OAuth for interactive flows, service principals or client certificates for unattended automation, and connection references so that connections are governed as solution components rather than hard-coded credentials. Virtual tables add a layer: the virtual connector provider enforces access through connector permissions and security roles, and you can scope create / read / update / delete per role, but virtual-table rows do not support Dataverse auditing or field-level security the way physical tables do. Design the security model before you build the integration, not after — retrofitting column security onto a flow that already runs with an over-privileged service principal is painful.
Application lifecycle management is the under-discussed requirement. Virtual tables created through a virtual connector provider are solution-aware and should ship inside a managed solution with their connection reference. Custom connectors and flows are solution components too. Synapse and Fabric Link configurations, by contrast, live outside the Dataverse solution layer — in Azure or Fabric — so they need their own deployment and environment-promotion story. The practical rule is that an integration is not done when it works in one environment; it is done when it can be promoted from dev to test to production as a tracked, repeatable unit, with the external endpoints parameterised by environment.
- Service-protection limits (6,000 req / 5-min window, 429 + Retry-After) apply to every mechanism
- Auth is Entra ID — OAuth, service principal, or client certificate; use connection references
- Virtual tables enforce role-based access but lack auditing and field-level security
- Virtual tables, custom connectors, and flows are solution-aware; Synapse/Fabric Link is not
- An integration is only production-ready when it promotes across environments as a tracked unit
Patterns that work and anti-patterns that bite
Some integration shapes recur because they are robust, and some recur because they are easy to build and expensive to run. The healthiest pattern for read-mostly external data is the virtual table guarded by $select and $filter at the provider, so the external system never returns more than the screen needs. The healthiest pattern for event-driven sync is a Dataverse-connector trigger with an alternate-key upsert on the target, scoped to fire only on the attributes that matter and with concurrency control to prevent fan-out storms. The healthiest pattern for Dynamics front-office / back-office unity is dual-write with a clean initial sync, then only the table maps you need in live mode. The healthiest pattern for analytics is to keep transactional Dataverse and the analytics tier separate — Link to Fabric or Synapse Link for the heavy read path, the Power BI connector for light operational dashboards — so reporting never competes with users for API quota. Closing the insight loop by exposing Fabric results as virtual tables (rather than writing analytics jobs back through the operational API) is the pattern Microsoft documents for low-code action on lakehouse insights.
The anti-patterns are equally consistent. Per-row Power Automate child flows (a parent lists rows, then spawns a flow per row) exhaust the connector throttle and the 6,000-request window rapidly; the fix is to do the work inside one flow with an 'Apply to each' and batching, or to move the operation to the Web API or a Service Bus consumer. Pointing the Power BI connector at a multi-million-row table and expecting a fast refresh ignores the documented ~500 rows/sec guidance; the fix is Link to Fabric or Synapse Link. Using a virtual table for high-volume transactional writes assumes the external system can absorb query-time writes under Dataverse's concurrency — it usually cannot. Replacing dual-write with a homemade pair of flows between F&O and CE recreates a product Microsoft already supports, usually with worse error handling. And mixing the analytics read path and the operational write path in one flow creates feedback loops that are easy to build and very hard to debug.
There is also a strategic layer to the decision: how Dataverse fits into a wider ERP and data estate. For SMEs running Dynamics 365 customer-engagement apps alongside a separate ERP, the integration architecture around Dataverse is usually the single biggest determinant of whether the two systems feel like one platform or two silos. The broader patterns for wiring an ERP estate — point-to-point versus hub-and-spoke, event-driven versus batch, API-led versus shared database — apply directly here, and choosing the Dataverse mechanism is really choosing one spoke in that larger topology.
- Healthy: virtual tables with tight $select/$filter; alternate-key upserts; dual-write for F&O↔CE; analytics tier off the transactional API
- Healthy: Fabric insights back into apps via virtual tables, not by reverse-writing the analytics link
- Anti-pattern: per-row child flows; Power BI connector on huge tables; virtual tables for heavy writes; homemade F&O sync instead of dual-write
- Anti-pattern: one flow mixing the analytics read path and the operational write path
- Dataverse integration is one spoke in a larger ERP integration topology — choose accordingly
A design checklist before you build
Before committing to a mechanism, answer eight questions. Which direction does the data flow — into Dataverse, out of Dataverse, bi-directional Dynamics operational sync, or analytics-only export? Are both ends Microsoft Dynamics apps that dual-write already supports, or is at least one side third-party? What is the realistic peak volume per hour, not the average? What latency can the business actually tolerate — real-time, near-real-time (seconds/minutes), Fabric-scale minutes, or scheduled? Does the external system need to stay the authoritative source, or is Dataverse the system of record? How will the integration authenticate, and is that credential governed as a connection reference, Entra service principal, or Azure SAS endpoint? Which service-protection limit or connector throttle will you hit first under load, and what is the retry strategy? And how will the integration be promoted across environments as a solution, dual-write map set, or IaC-managed Azure/Fabric artefact?
These questions exist to force the routing decision before any code is written. An integration that answers them cleanly almost always lands on one of the mainstream mechanisms with an obvious fit; an integration that cannot answer them is not ready to build, regardless of how simple the first prototype looked. The cost of a half-day design conversation is trivial next to the cost of rebuilding a throttled per-row flow, re-homing a dashboard that never should have used the Power BI connector at multi-million-row scale, or re-implementing dual-write as a pair of brittle flows.
Finally, treat the integration as a product with an owner, not a one-off project. External systems change their APIs, Dataverse evolves its limits and connectors, Fabric link storage grows with tracked tables, and volumes grow. The mechanisms that age best are the ones with observability built in — flow run histories, dual-write error queues, plug-in trace logs for virtual-table providers, Service Bus system jobs, Fabric/Synapse link monitoring, and Web API retry telemetry — and a named owner who notices when the shape of the data changes. An integration no one owns is an integration that will fail silently at the worst possible moment.
- Answer direction, Dynamics-vs-third-party, peak volume, latency, source-of-record, auth, throttle ceiling, and ALM before building
- Clear answers route cleanly to dual-write, virtual tables, Power Automate, Web API, Fabric/Synapse, or Service Bus
- A half-day design conversation is cheaper than rebuilding a throttled or mis-routed integration
- Build in observability (including dual-write queues and Service Bus jobs) and name an owner
Frequently asked questions
What are the main ways to integrate Dataverse with external systems?
Six first-class paths: virtual tables (read external data at query time without copying it), the Microsoft Dataverse connector in Power Automate (event-driven triggers and create/update/upsert/delete actions), the OData v4 Web API (direct REST for custom code), dual-write (near-real-time bi-directional sync between finance and operations apps and Dataverse-hosted CE apps), the Power Query / Power BI Dataverse connector (Import or DirectQuery for analytics), and Link to Microsoft Fabric / Azure Synapse Link (near-real-time analytics replicas). Custom connectors, plug-ins, and Azure Service Bus endpoints fill the gaps. Choose by direction, volume, latency, and system-of-record.
When should I use virtual tables instead of copying data into Dataverse?
Use virtual tables when you need read-mostly access to an external system of record that must stay authoritative — for example, surfacing a SQL Server, Salesforce, or Fabric/OneLake dataset inside a model-driven app without duplicating it. Avoid virtual tables when you need auditing, rollup or calculated columns, charts and dashboards, the Currency/Image/Customer data types, or high-volume transactional writes, because virtual tables do not support those features and query-time external calls do not scale to heavy write loads.
How do I upsert records into Dataverse from Power Automate?
Use the Dataverse connector's 'Add a new row' or 'Update a row' action with an upsert pattern keyed on an alternate key. First define an alternate key on the target table (for example, the external system's record ID), then configure the action to match on that key so it updates the row if it exists and creates it if it does not. This is idempotent and safe to re-run, which a plain create is not. The connector is throttled at 6,000 calls per 300-second window per connection, so paginate and batch rather than spawning a child flow per row.
Is the Dataverse Web API the same as the Power Automate connector?
No. The Web API is the OData v4 REST interface you call directly over HTTP from custom code — it supports GET/POST/PATCH/DELETE plus functions and actions, works from any language, and gives you full control over batching, retry, and transactions. The Dataverse connector is a premium Power Platform connector that wraps Dataverse operations as triggers and actions for low-code use in Power Automate, Power Apps, and Copilot Studio. Both hit the same underlying service-protection limits; the Web API is for when you need control the connector cannot give.
What is dual-write and when should I use it?
Dual-write is Microsoft's near-real-time bi-directional integration between Dynamics 365 finance and operations apps (Finance, Supply Chain Management, Commerce, and related F&O workloads) and a Dataverse environment hosting customer-engagement apps. You set it up through Lifecycle Services Power Platform integration, run an initial synchronisation for existing data, then enable table maps for live sync. Use it when F&O and CE must share operational entities such as customers, products, and price lists. Do not use it as a general connector for third-party ERPs or arbitrary SaaS tools — those still need virtual tables, Power Automate, or the Web API.
Should I connect Power BI to Dataverse with the connector or use Fabric / Synapse Link?
Use the Power Query Dataverse connector (Import or DirectQuery) for moderate datasets and operational dashboards — it is generally available and supports live DirectQuery. Switch to Link to Microsoft Fabric or Azure Synapse Link when the dataset is large or refreshes are frequent, because the connector retrieves roughly 500 rows per second and Microsoft recommends it for analytics, not bulk extraction. Fabric and Synapse links land data in Delta/Parquet for Direct Lake and lakehouse workloads without thrashing the transactional API.
What is the difference between Link to Fabric and Azure Synapse Link for Dataverse?
Link to Fabric is the no-copy, no-ETL SaaS path: Dataverse creates shortcuts into OneLake, keeps data under Dataverse governance, adds Track-changes tables by default, and bills the analytics replica primarily as additional Dataverse storage. Azure Synapse Link exports continuously into storage you own (ADLS Gen2 / Synapse) so IT admins choose tables and build pipelines with Synapse, Fabric, Databricks, or other tools. Microsoft recommends Link to Fabric when you are already on or moving to Fabric; keep Synapse Link when you need BYO storage control or are upgrading legacy Export-to-data-lake / BYOD estates without a Fabric commitment yet.
How fresh is Dataverse data in Microsoft Fabric?
Microsoft describes Link to Fabric as a near-real-time read-only replica. Update jobs run on a frequent cadence; depending on change volume, organisations commonly see updated Parquet files within roughly 15 to 45 minutes. Only tables with Track changes enabled participate. Linked tables consume Dataverse database storage — monitor capacity in the Power Platform admin center. For sub-minute operational reactions, use Power Automate triggers, dual-write, or Service Bus — not the analytics link.
What ports and endpoints does the Dataverse Power BI connector need?
The Power Query Dataverse connector uses the Tabular Data Stream (TDS) endpoint, which must be enabled in your environment, and requires TCP port 1433 to be open. If port 1433 is blocked, you can use port 5558 by appending it to the environment URL (for example, yourenvironmentid.crm.dynamics.com,5558). A closed port is the most common cause of connection errors in locked-down corporate networks, so check this first when a refresh fails.
Do Dataverse API limits apply to virtual tables and Power Automate flows?
Yes. All mechanisms run on the same Dataverse service and share the service-protection limits: 6,000 requests, 20 minutes of execution time, and roughly 52 concurrent requests per user per web server in a five-minute window, with breaches returning HTTP 429 and a Retry-After header. Virtual-table calls consume quota against both Dataverse and the external system, and the Power Automate connector is throttled at 6,000 calls per 300-second window per connection. Any per-row loop must paginate, batch, and implement retry.
Can I write back to Dataverse through Synapse or Fabric Link?
Not through the analytics link itself. Link to Fabric and Azure Synapse Link are outbound, read-oriented paths. Microsoft's supported pattern for acting on Fabric insights is to surface those insights back into Dataverse as virtual tables connected to OneLake / Fabric, then drive Power Apps or Power Automate — or to write operational changes through the Dataverse connector, Web API, or dual-write. Keep analytics replication and operational write-back in separate flows to avoid data loops.
How do I push Dataverse events to Azure Service Bus or Event Hubs?
Register a service endpoint with the Plug-in Registration tool so Dataverse can post the runtime execution context to Azure Service Bus (queue, topic, one-way, two-way, REST) or Event Hubs. An out-of-box Azure-aware plug-in or a custom Azure-aware plug-in initiates the post through the asynchronous service. Listener apps consume RemoteExecutionContext messages (XML, JSON, or .NET binary). Register steps asynchronously for performance, monitor system jobs for failed posts, and design for the 192 KB payload behaviour Microsoft documents for large contexts.
Sources & methodology
15 citedEvery pricing figure and statistic on this page is traced to a primary or vendor source with a verification date. Where partner pages are cited, their platform bias is disclosed in-line.
- 01A virtual table is a custom Dataverse table whose columns contain data from an external data source, connected at runtime without data replication; it comprises a data provider, a data source row, and the virtual table↗learn.microsoft.com · verified Microsoft Learn — 'Create and edit virtual tables that contain data from an external data source' defines virtual tables verbatim ('A virtual table is a custom table in Microsoft Dataverse that has columns containing data from an external data source … without the need for data replication'), lists the three components, and documents the restrictions (no auditing, no rollup/calculated columns, no Currency/Image/Customer types, no charts/dashboards, cannot convert existing tables).
- 02Virtual connector providers support SQL Server, SharePoint, Microsoft Fabric, Salesforce, Oracle Database, Snowflake, PostgreSQL, and Azure Databricks, using Power Platform connectors with connection references and ALM support↗learn.microsoft.com · verified Microsoft Learn — 'Create virtual tables using the virtual connector provider' enumerates the eight supported providers, explains the data source / data provider / connection / connection reference components, connector permission sharing via security roles, and solution/ALM support.
- 03The Dataverse Web API implements OData v4 (an OASIS standard) for RESTful access across languages, mapping CRUD to GET/POST/PATCH/DELETE and richer operations to functions and actions↗learn.microsoft.com · verified Microsoft Learn — 'Use the Microsoft Dataverse Web API' states the Web API 'implements the OData (Open Data Protocol), version 4.0, an OASIS standard,' documents GET/POST/PATCH/DELETE plus functions/actions, Xrm.WebApi for model-driven apps, and getting-started paths for PowerShell, JavaScript, and .NET.
- 04The OData v4 Data Provider requires an Edm.Guid identifier, requires nullable-property matching, cannot connect Dataverse-to-Dataverse, and documents EDM-to-Dataverse type mapping↗learn.microsoft.com · verified Microsoft Learn — 'OData v4 Data Provider configuration, requirements, and best practices' documents the GUID requirement, nullability matching, the EDM type mapping table, server-side vs client-side paging, timeout, and the cross-environment limitation.
- 05The Microsoft Dataverse connector (formerly Common Data Service current environment) is a premium connector with triggers and actions (add/update/upsert/delete/list/relate rows, perform bound action), throttled at 6,000 calls per 300 seconds, supporting OAuth, Service Principal, and client-certificate auth↗learn.microsoft.com · verified Microsoft Learn / Connectors — 'Microsoft Dataverse' connector reference documents availability in Copilot Studio, Power Apps, and Power Automate across all regions, the three auth types with shareability, the 6,000-call / 300-second throttle, and the full action and trigger set including upsert and bound actions.
- 06The Power Query Dataverse connector is GA, supports Import and DirectQuery, uses the TDS endpoint over port 1433 or 5558, is suited to analytics not bulk extraction (~500 rows/sec), and lists Synapse Link and OData as alternative connections↗learn.microsoft.com · verified Microsoft Learn — 'Dataverse' Power Query connector reference documents GA status, products (Excel, Power BI semantic models and dataflows, Fabric Dataflow Gen2, Power Apps dataflows, Customer Insights), Import and DirectQuery capabilities, the TDS endpoint and port requirements, the ~500 rows/sec retrieval guidance, and the 'Alternative Dataverse connections' section pointing to Synapse Link and OData.
- 07Azure Synapse Link for Dataverse (formerly Export to data lake) continuously pushes data, metadata, and CUD transactions to Azure Synapse Analytics and Azure Data Lake Storage Gen2 in Common Data Model format, using change tracking with no refresh intervals to configure↗learn.microsoft.com · verified Microsoft Learn — 'What is Azure Synapse Link for Dataverse?' documents the rename from Export to data lake (May 2021), continuous replication to Synapse and ADLS Gen2, CDM format, the push-not-pull model using change tracking, and replication of standard/custom tables and create/update/delete transactions.
- 08Link to Microsoft Fabric is a no-copy, no-ETL SaaS integration that makes Dataverse / Dynamics 365 data available in OneLake via shortcuts, generates a lakehouse, SQL endpoint, and Power BI dataset, keeps data under Dataverse governance, defaults to Track-changes tables, and consumes additional Dataverse storage; Microsoft compares it directly with Azure Synapse Link (BYO storage, admin-selected tables)↗learn.microsoft.com · verified Microsoft Learn — 'Link your Dataverse environment to Microsoft Fabric and unlock deep insights' (updated 2026-07-20) documents Link to Fabric from Power Apps, OneLake shortcuts, no BYO storage/Synapse workspace, all nonsystem Track-changes tables by default, Dataverse storage consumption, single Fabric workspace per environment today, and the official Link to Fabric vs Azure Synapse Link comparison table.
- 09Microsoft recommends Link to Fabric when organisations already use or plan Fabric; Fabric link is a near-real-time read-only insights replica with frequent update jobs (commonly ~15–45 minutes depending on volume); transition guidance also covers retiring BYOD / Export to Data Lake in favour of Fabric link or Synapse Link↗learn.microsoft.com · verified Microsoft Learn — 'Transition from legacy data integration services to Fabric link and Azure Synapse Link for Dataverse' (updated 2026-03-30) recommends Fabric link for Fabric-bound estates, documents no-copy SaaS vs export-to-own-storage, near-real-time replica behaviour, Dataverse storage quota impact with illustrative compression example, and legacy BYOD / Export to Data Lake retirement paths.
- 10Dual-write establishes a near-real-time bi-directional connection between a finance and operations environment and a Dataverse environment for customer-engagement apps; setup is via Lifecycle Services, with initial synchronisation before live table maps and multiple greenfield/brownfield scenarios↗learn.microsoft.com · verified Microsoft Learn — 'Guidance for dual-write setup' (updated 2026-01-22) defines F&O vs Dataverse CE roles, LCS setup, initial sync requirements, company bootstrap with ISO codes, and supported new/existing environment pairings for live synchronisation.
- 11Dataverse posts runtime execution context to Azure Service Bus (queues, topics, one-way/two-way/REST relays) and Event Hubs via registered service endpoints and Azure-aware plug-ins; asynchronous service handles posts; payloads over 192 KB strip certain properties and can fail↗learn.microsoft.com · verified Microsoft Learn — 'Azure Service Bus integration' (updated 2026-04-01) documents RemoteExecutionContext posts, OOB and custom Azure-aware plug-ins, contract types (queue, one-way, two-way, REST, topic, Event Hubs), SAS security, system-job monitoring, and the 192 KB payload stripping/failure behaviour.
- 12Microsoft Fabric Data Factory connects to Dataverse via the Power Query connector (Import/DirectQuery), supports Mirroring for a near-real-time replica in OneLake and Copy jobs with CDC, and lists Synapse Link and OData as alternatives↗learn.microsoft.com · verified Microsoft Learn — 'Set up your Dataverse connection' (Fabric Data Factory) documents the Dataverse connector capabilities (Server URL, Import, DirectQuery, Include relationship columns), auth types for copy and Dataflow Gen2, and the 'Alternative Dataverse connections' referencing Azure Synapse Link and OData; the Data Factory overview documents Mirroring and CDC copy jobs as near-real-time data-movement methods on OneLake.
- 13Dataverse service-protection API limits are 6,000 requests, 20 minutes (1,200s) execution time, and 52+ concurrent requests per user per web server in a five-minute window, returning 429 with Retry-After↗learn.microsoft.com · verified Microsoft Learn — 'Service protection API limits' documents the three facets, per-web-server defaults, the 429 + Retry-After behaviour, and how these limits are inherited by connectors and the Web API.
- 14DirectQuery in Power BI defines a one-million-row limit for cloud sources, targets sub-five-second response times, and times out queries exceeding four minutes in the Power BI service↗learn.microsoft.com · verified Microsoft Learn — 'Use DirectQuery in Power BI Desktop' documents the Import-vs-DirectQuery distinction, performance and load considerations (five-second target, 30-second poor-experience threshold, four-minute timeout), and the one-million-row limit for cloud sources.
- 15Practitioner and product coverage through mid-2026 continues to highlight Link to Fabric table-level controls, faster sync investment, and dual-write as the native F&O↔Dataverse operational path↗msdynamicsworld.com · verified MSDynamicsWorld (2026-07-14) reports Dataverse Fabric Link faster sync and table-level controls; companion industry posts (e.g. X @msdynamicsworld 2026-07-16, @GilbertQue 2026-07-15) echo table selection and ingestion improvements. Dual-write operational framing corroborated by Microsoft dual-write docs and 2026 F&O innovation coverage.
Related services & solutions
Not sure which Dataverse integration fits your data?
Book an ERP Readiness Call with Flectic. We are a platform-neutral partner implementing Dynamics 365 and Odoo for SMEs across Canada, the UK, and the US, with AI-accelerated delivery designed to ship up to 3x faster. In 30 minutes we will map your data flows, tell you which Dataverse mechanism (virtual tables, Power Automate, the Web API, dual-write, the Power BI connector, or Link to Fabric / Synapse Link) actually fits your volume and latency, and whether Dynamics 365 or Odoo is the better platform for your business.