Dual-Write Explained: Finance and Operations, Dataverse and Virtual Entities

What dual-write does, how it differs from virtual entities (virtual tables), which one fits each integration need, the pitfalls worth designing out, and how Business Central reaches Dataverse instead.

Dual-write is Microsoft's out-of-box infrastructure for near-real-time, two-way integration between finance and operations apps and customer engagement apps through Dataverse. When a record such as a customer changes on one side, the change is written to the other, so both systems keep their own copy and stay in step. Virtual entities, also called virtual tables, work the other way round: Dataverse shows Finance and Operations data without copying it, and the data stays in Finance and Operations. Use dual-write when both sides must hold and edit the same records; use virtual entities when Dataverse users mainly need to see current ERP data. Business Central reaches Dataverse through its own connection and virtual tables instead.

What is dual-write, in plain terms?

Dual-write is the integration Microsoft provides between finance and operations apps (Dynamics 365 Finance, Supply Chain Management, Commerce and the related apps) and the customer engagement apps that run on Dataverse, such as Dynamics 365 Sales, Customer Service and Field Service. Microsoft describes it as an out-of-box infrastructure that provides near-real-time, bidirectional integration through Dataverse. In practice that means a customer created by a salesperson in Dynamics 365 Sales appears in Finance and Operations shortly afterwards, and a credit limit changed by the finance team in Finance and Operations appears on the account in Sales.

The important word is copy. With dual-write, each side stores its own physical copy of the shared records. Dataverse holds the customer engagement copy, Finance and Operations holds its own, and dual-write keeps the two aligned. That is what makes it useful, because Sales, Customer Service, Power Apps and Power Automate all work on real Dataverse rows, and also what makes it a design job: every synchronized table and field becomes a contract between two systems that two teams change.

  • Which tables are shared at all: customers, contacts, products and prices are the usual core; many tables are better left on one side.
  • Which fields travel with each table, and in which direction, rather than everything that can be mapped.
  • Which system owns each field, so the finance team and the sales team are never editing the same value from two places.
  • How Finance and Operations legal entities line up with Dataverse business units, teams and record ownership.
  • What happens to a record that fails to sync, who sees the error, and who fixes it the same day.

How do virtual entities (virtual tables) differ from dual-write?

Virtual entities take the opposite approach. Finance and Operations acts as a virtual data source in Dataverse: its OData entities appear in Dataverse as virtual tables, and the data does not reside in Dataverse. When a user opens a form or a view that shows a virtual table, the rows are read from Finance and Operations at that moment. Nothing is copied, so there is no second copy to keep aligned, and also no local copy to fall back on.

Microsoft uses both names. The Finance and Operations documentation says virtual entities; Dataverse calls the same objects virtual tables. They are one feature seen from two sides.

QuestionDual-writeVirtual entities (virtual tables)
Where does the data live?In both systems: Finance and Operations and Dataverse each store a copy.Only in Finance and Operations; Dataverse shows it on request.
How current is it?Near-real-time, as changes are written across.As current as the source, because each read goes to Finance and Operations.
Does it use Dataverse storage?Yes, the synchronized rows are stored in Dataverse.The rows themselves stay in Finance and Operations.
What does the CRM side get?Real Dataverse rows that Sales, Customer Service, Power Apps and Power Automate treat like any other table.Current ERP values on forms, views and apps, without a copy to maintain.
What has to be designed?Table and field mappings, direction, field ownership, keys, initial load and error handling.Which entities to expose, who may see them, and how screens behave when the source is slow or unavailable.
Typical useShared master data that both sides create and edit: customers, contacts, products.Reference and transactional data the CRM side mainly reads: stock levels, invoice history, order status.

When should you use dual-write, and when virtual entities?

The deciding question is who needs to change the data, and how much of it there is. If both the CRM and the ERP side create and edit the same records, and the CRM side needs them as genuine Dataverse rows for its own processes, dual-write is the right tool. If the CRM side mainly needs to see ERP data so that a salesperson or a service agent can answer a customer, virtual entities give current values without the cost of keeping a second copy.

Most real projects use both. Customers, contacts and products are shared through dual-write, because both sides own parts of them. Invoice history, open orders and stock levels are shown through virtual entities, because the CRM side reads them and copying large transactional tables adds load for little gain. Anything that is neither, such as a nightly export to a data warehouse, belongs in a batch integration rather than either of the two.

  • Choose dual-write when both sides edit the record, when CRM processes such as workflows, Power Automate flows or security rules must run on it as Dataverse data, or when users need it on the CRM side even while the ERP is busy.
  • Choose virtual entities when the CRM side mainly reads, when the data is large or changes constantly, or when one source of truth matters more than a local copy.
  • Choose a batch or API integration when the data moves on a schedule, goes to a third system, or is far too large for row by row synchronization.
  • Write the choice down per table. A one-page decision list saves weeks of argument in testing.

Who is this guide for, and who needs a different route?

It is for architects, IT managers and finance system owners who run, or are about to run, Dynamics 365 Sales, Customer Service or Field Service together with Dynamics 365 Finance, Supply Chain Management or Commerce, and who need the customer, product and order data to mean the same thing on both sides. It is also for Microsoft partners scoping that integration for a client.

If your ERP is Business Central, the route is different: Business Central connects to Dataverse through its own connection and virtual tables, covered further down. Business Central fits small and mid-sized companies that want finance, inventory, projects and light manufacturing in one cloud system. Finance and Operations fits larger organizations with several legal entities, deep supply chain or production needs, or retail operations on Commerce. If you also run Dynamics 365 Customer Engagement, both connect to it through Dataverse.

What are the typical dual-write pitfalls?

Dual-write rarely fails for technical reasons alone. It fails when the integration is switched on before the two teams have agreed what the shared data means. The list below is what we check first when a dual-write design is already in trouble, and what we design out from the start on a new one.

  • Mapping everything because it is possible. Every extra table and field is another place for the two systems to disagree; start with the smallest set that runs the shared process.
  • Nobody owns the field. When both the sales team and the finance team edit the same value, changes overwrite each other and nobody can say which one is right. Give every shared field one owning system.
  • Duplicates before the first sync. The same customer often exists in the CRM and the ERP under different numbers. Agree the matching key and clean the data before the initial load, or both copies arrive twice.
  • Legal entities and business units that were never aligned. Finance and Operations organizes data by legal entity; Dataverse organizes access by business units, teams and owners. Decide how one maps to the other first.
  • Custom logic firing on synchronized writes. A plugin in Dataverse or X++ code in Finance and Operations that reacts to every change can create loops or stop a record from saving on the other side. Review both sides for logic that assumes a human made the edit.
  • Sync errors with no owner. A record that did not sync is a business problem, such as an order that never reached the warehouse. Name the person who checks the errors every day and the process for fixing them.
  • Test environments linked to the wrong counterpart environment. After a sandbox is refreshed or copied, check which Finance and Operations environment is linked to which Dataverse environment before anyone tests.
  • Large transactional volumes in near-real-time sync. High-volume tables add load on both sides; show them through virtual entities or move them in batch instead.

How does Business Central connect to Dataverse instead?

Dual-write is built for finance and operations apps. Business Central has its own route. It connects to Dataverse through the Set up Dataverse connection assisted setup, with one-way or two-way synchronization per table, and that connection is the route Microsoft documents for integrating Business Central with Dynamics 365 Sales. For data that should be visible in Dataverse without being copied, the Business Central Virtual Table app exposes Business Central data as virtual tables: the data stays in Business Central, the virtual tables are built on API v2.0, and custom APIs can be exposed as well.

The design questions are the same as for dual-write: which tables are shared, which side owns each field, which data is only shown rather than copied, and who handles the errors. The tooling and the extension language differ, which is why the CRM and ERP integration is designed per ERP rather than from one template.

QuestionBusiness CentralFinance and Operations
Typical organizationSmall and mid-sized organizations: finance, sales, purchasing, inventory, projects, manufacturing, warehouse and service management in one system.Larger, complex, multi-entity organizations: deep supply chain, warehouse, production, multi-country finance, Commerce.
Copying data into DataverseDataverse connection, set up with the Set up Dataverse connection assisted setup, one-way or two-way per table.Dual-write, near-real-time and bidirectional through Dataverse.
Showing data without copyingBusiness Central virtual tables through the Business Central Virtual Table app.Virtual entities (virtual tables) over OData entities.
Integration with Dynamics 365 SalesThrough the Dataverse connection.Through dual-write and virtual entities.
Extension languageAL extensions in Visual Studio Code.X++ in Visual Studio.

How do you plan a dual-write or virtual entity project?

Start from the processes that cross the boundary, not from the list of tables the tool can map. Quote to order, customer onboarding, credit checks, product and price updates and service work that ends in an invoice are the usual candidates. For each one, write down which system starts it, which system finishes it and which data both need along the way. The integration design then follows almost mechanically. Delivery of that design is our CRM and ERP integration service.

  • List the cross-system processes and the people who run them, on both the CRM and the ERP side.
  • For each table involved, choose dual-write, virtual entity or batch integration, and record why.
  • Assign one owning system per shared field, and agree the matching keys for records that already exist on both sides.
  • Clean and deduplicate the data on both sides before the initial load, then rehearse the load in a test environment.
  • Review custom logic on both sides, Dataverse plugins and flows as well as X++ extensions, for behaviour on synchronized writes.
  • Name the owner of sync errors and the daily check, and test the error path deliberately, not only the happy path.
  • Go live table by table where the processes allow it, rather than switching on every mapping on the same day.

How does Solzet deliver dual-write and CRM and ERP integration?

Solzet works on both sides of the Microsoft business stack. We know Dataverse and Dynamics 365 Customer Engagement deeply, and we implement Business Central and Finance and Operations. That means one team designs the CRM, the ERP and the integration between them: Customer Engagement with Business Central through the Dataverse connection and virtual tables, Customer Engagement with Finance and Operations through dual-write and virtual entities, and Power Platform across both.

For the ERP side, see Dynamics 365 Finance and Operations and Dynamics 365 Business Central; for the CRM side, Dynamics 365 consulting. Where Microsoft licensing does not suit the CRM side, a custom CRM can integrate with Finance and Operations through its OData entities instead. More decision guides are collected on the Solzet guides page.

What do people ask us?

What is dual-write in Dynamics 365?

Dual-write is the out-of-box infrastructure Microsoft provides for near-real-time, bidirectional integration between finance and operations apps, such as Dynamics 365 Finance and Supply Chain Management, and customer engagement apps, such as Dynamics 365 Sales, through Dataverse. Both sides keep their own copy of the shared records, and dual-write keeps the copies aligned.

What is the difference between dual-write and virtual entities?

Dual-write copies data, so Finance and Operations and Dataverse each store the shared records and changes flow both ways in near-real-time. Virtual entities, also called virtual tables, copy nothing: Finance and Operations OData entities appear in Dataverse, and the data stays in Finance and Operations and is read when needed. Dual-write suits shared master data; virtual entities suit data the CRM side mainly reads.

Can we use dual-write and virtual entities together?

Yes. Most well-designed integrations do. Shared master data such as customers, contacts and products goes through dual-write because both sides edit it, while invoice history, open orders and stock levels are shown through virtual entities because the CRM side mainly reads them. The choice is made and recorded per table.

Does Business Central use dual-write?

Dual-write is built for finance and operations apps. Business Central connects to Dataverse through the Set up Dataverse connection assisted setup, with one-way or two-way synchronization, which is also the route for integrating with Dynamics 365 Sales. Data that should only be visible in Dataverse is exposed through the Business Central Virtual Table app as virtual tables, with the data staying in Business Central.

Is dual-write real time?

Microsoft describes dual-write as near-real-time. A change on one side is written to the other shortly afterwards, which is fast enough for a salesperson to see a customer created in Finance and Operations, or for the finance team to see an account created in Sales. Bulk data that moves on a schedule belongs in a batch integration instead.

What usually goes wrong with dual-write?

Design rather than technology: too many tables and fields mapped, shared fields that both teams edit, duplicate customers loaded twice in the initial sync, legal entities never aligned with Dataverse business units, custom logic reacting to synchronized writes, sync errors that nobody owns, and test environments linked to the wrong counterpart environment after a refresh.

Do virtual entities copy Finance and Operations data into Dataverse?

They work without copying. Finance and Operations acts as a virtual data source: its OData entities appear in Dataverse as virtual tables, the data stays in Finance and Operations, and each read goes to the source. That keeps one source of truth, and it means screens depend on Finance and Operations being available.

Does Solzet implement Finance and Operations and the dual-write integration with Customer Engagement?

Yes. Solzet implements Dynamics 365 Business Central and Finance and Operations, alongside Customer Engagement and Power Platform. We handle implementation, extensions in AL and X++, migrations from Dynamics NAV, Dynamics GP, Dynamics AX and 1C, the Business Central Armenian localization, and the integration between your CRM and ERP, including dual-write and virtual entities.

Which solution is right for your business?

Tell us what you need. A senior consultant replies within one business day with a recommendation (Customer Engagement, Business Central, Finance and Operations, Power Platform or a custom-built CRM), not a sales script.