Skip to content
D365 Reference

The D365 F&O Extraction Guide

How to get Dynamics 365 Finance & Operations data into a Databricks lakehouse in 2026 — the supported landing paths now that Export to Data Lake is retired, the June 2026 low-latency sync engine and what migrating to it entails, the metadata columns the sync adds, how to handle soft deletes and incremental loads, and when to land raw tables vs entity-shaped exports.

Verified September 2026

Vendor behavior below is current to the date above — verify against current Microsoft documentation before you build.

F&O → lakehouse landscape (2026)

The landscape shifted recently, so start here. Export to Data Lake — the older F&O export that wrote CSV to an ADLS Gen2 account you operated (a separate legacy path from BYOD, which exported entity shapes to your own Azure SQL database) — was deprecated on October 15, 2023, with existing users able to continue only until November 1, 2024 (both dates published on Microsoft's Export to Data Lake page (opens in new tab)). Microsoft's transition FAQ (opens in new tab) documents the migration path. There is now a hard end to the runway: Microsoft's lifecycle overview (opens in new tab) — the live source for these dates, so reverify there — states the service will be permanently stopped on November 30, 2026. After that it exports no new or changed data (files already exported to your lake remain in place), and Microsoft says extensions won't be granted after that date — which puts an expiry on the past-due extension route (aka.ms/SynapseLinkPastDue (opens in new tab)) that existed for tenants that missed the 2024 deadline. The same page names Microsoft's stated replacement: Link to Microsoft Fabric with low-latency sync (covered in its own section below). Treat Export to Data Lake as end-of-life on a live countdown: if you inherited a pipeline built on it, it needs migrating before November 30, 2026 — not extending.

As of September 2026 the two supported paths for landing F&O data are Synapse Link for Dataverse and Fabric Link. Both are Microsoft-managed exports that surface F&O tables as Delta — Synapse Link into a storage account you own (ADLS Gen2), Fabric Link into OneLake. One practical constraint worth knowing up front: for F&O full-table sync the output is Delta only; CSV is not available on that path. That is a change from the old export world, and it is the reason the whole rest of this guide assumes Delta in a lakehouse.

Two mid-2026 changes are worth knowing before you read older vendor posts. In mid-2026 Microsoft rolled out a rewritten low-latency sync engine for Fabric Link (announced June 9; GA staged region by region through late July) — covered in its own section belowbecause migrating an existing link to it is not a toggle. And by early August 2026 the Power Apps entry point was renamed: the “Azure Synapse Link” navigation item became Link data, with Fabric links presented as the recommended path and Synapse Link moved under an “Other Links” section. Read that signal correctly — Fabric is where Microsoft's investment is going, but Synapse Link is not going away: Microsoft's transition FAQ (opens in new tab) states that it is not being retired, and that Microsoft intends to support exporting to your own storage “well into the future.”

PathLands inFormatReach it from Databricks via
Synapse Link for DataverseADLS Gen2Delta (default)External location over the storage account
Fabric LinkOneLakeDeltaOneLake shortcut / external location

Low-latency sync (mid-2026)

On June 9, 2026 Microsoft announced a rewritten Fabric Link sync engine (opens in new tab), with general availability staged region by region from mid-July through late July 2026 — so “when it shipped” depends on your station, not the announcement date. The old pipeline read from the Dataverse database, wrote an intermediate CSV, then converted that to Delta Parquet; the new engine drops the CSV hop and writes directly to Delta Parquet. For F&O tables Microsoft cites throughput of 1M+ records per hour per table — lab figures, but against the roughly 100k–700k/hour the old engine managed, the jump is real. This is Fabric Link only; the Synapse Link → ADLS path is unchanged.

Enablement is automatic, per region station — there is no opt-in. Once your station has it, new Fabric links use the new engine (the link shows a “Low-latency mode” flag in the Link data page). The catch is existing links: an existing Fabric Link profile stays on the old engine until you unlink and relink, and relinking triggers a full initial sync of every configured table. Treat that as a re-onboarding event for your Databricks pipelines — schedule it off-peak and expect the initial load to take a while on large tables — not a settings toggle. Two more migration facts from Microsoft's Fabric Link documentation (opens in new tab): the relinked profile carries live data only, so if you use long-term retention, retained rows stop surfacing through the Fabric shortcuts until Microsoft completes a promised retained-data migration (retention itself keeps running); and F&O environments must be on a supported build before low-latency sync works — that same documentation maintains the current table of minimum platform and application builds per F&O version (10.0.47, 10.0.48, and 10.0.49 as of September 2026), so check Help & Support → About against it and apply the latest quality update if you're below the floor.

One schema change needs engineering attention before you relink: the new engine writes timestamp columns as INT64; the INT96 encoding the previous engine used is not supported. For Databricks this is mostly good news — INT64 is the modern Parquet timestamp encoding and Spark reads it natively — but audit anything downstream that special-cased INT96 (custom Parquet readers, type-mapping code, semantic models over the same tables) before the switch, per Microsoft's own guidance.

The new engine also brings an optional Change Data Feed (opens in new tab) capability (documented August 2026): with low-latency sync active, Fabric Link can preserve roughly 24 hours of row-level change history via Delta Lake's Change Data Feed (opens in new tab) (the underlying open-source mechanism, documented independently of Microsoft), enabling time-travel and change-based reads directly against the synced tables. It is opt-in per environment through the Power Platform admin center — useful if your incremental pipeline wants real change rows instead of diffing snapshots. Two cautions from the same documentation: the ~24-hour window means it complements, not replaces, the watermark-based MERGE pattern below, and Microsoft warns CDF is memory- and compute-intensive and can raise overall sync latency even in low-latency mode — weigh that tradeoff before enabling it.

Landing in Databricks

The manual path is the same either way: point a Unity Catalog external location at the ADLS Gen2 container (or the OneLake path), register the landed Delta folders, and expose them as a bronze schema — the raw, source-aligned layer you build silver and gold on top of. The <catalog>.<schema> placeholders in every boilerplate snippet on this site are meant to point at exactly that bronze layer.

There is also a managed alternative: Databricks Lakeflow Connect for Dynamics 365, a first-party connector built on top of Synapse Link. It lands F&O data incrementally under Unity Catalog governance without you wiring the external location and MERGE logic by hand. Release status and feature coverage evolve quickly, so check the connector's current documentation (opens in new tab) for your cloud before you design around it rather than assuming it's there. Where it is available, it removes most of the plumbing in the next section; where it isn't, the manual MERGE below is the fallback. The managed connector reads Synapse Link exports in ADLS Gen2; it does not consume Fabric Link. Its Parquet ingestion path is Beta as of September 2026, so check the format-specific setup (opens in new tab) before choosing it. As of September 2026 the connector documentation publishes the operational limits worth designing against: a cap of 250 tables per pipeline, SCD type 2 support, and column renames arriving as a new column plus a deleted column rather than a rename. The sharp edge is that automated schema evolution does not cover data-type changes — a type change on the source breaks the pipeline rather than flowing through it.

Incremental & soft deletes

The sync is incremental, and — this is the part that trips up a first pipeline — deletes don't remove rows, they arrive as soft deletes: the row reappears in the batch with IsDelete = true. Ignore that flag and deleted records live on in bronze forever, inflating every count and sum built on top. As of September 2026 the sink itself purges these deleted Delta rows after 28 days, which sets a hard operating limit — if your pipeline lags more than 28 days it can miss the delete signal entirely, so bronze must stay current.

The safe load is two steps. First dedup each incoming batch on RecId, keeping the row with the latest sysrowversion— Microsoft's documented watermark field — with SinkModifiedOn as tiebreak, so a record updated several times in one window collapses to its final state. Then MERGE into bronze, translating IsDelete = true into a physical DELETEand everything else into an upsert — so bronze reflects the true current state of F&O and downstream counts stay correct. The skeleton below does both.

-- Incremental upsert from a Synapse Link / Fabric Link staged batch into a
-- bronze Delta table. Dedup on RecId keeping the latest sysrowversion (the
-- documented watermark; SinkModifiedOn ties within a Delta conversion), then
-- MERGE — applying soft deletes (IsDelete) as physical deletes in bronze.
-- Delta-path batches only: on the incremental-update (CSV) profile, deleted
-- rows carry only Id with an empty body — see the note below the skeleton.
MERGE INTO bronze.inventtrans AS tgt
USING (
  SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (
      PARTITION BY recid ORDER BY sysrowversion DESC, sinkmodifiedon DESC
    ) AS rn
    FROM staging.inventtrans
  ) WHERE rn = 1
) AS src
ON tgt.recid = src.recid
WHEN MATCHED AND src.isdelete = true  THEN DELETE
WHEN MATCHED AND src.isdelete = false THEN UPDATE SET *
WHEN NOT MATCHED AND src.isdelete = false THEN INSERT *

One landing shape this guide hasn't named yet changes that skeleton: the incremental-update (CSV) profile. Microsoft's Synapse Link F&O documentation (opens in new tab) describes it as a separate Synapse Link profile that lands the same F&O tables as CSV files in time-stamped folders — no Synapse workspace or Spark pool required — for feeding your own downstream warehouse. The critical difference for the load logic: on that path a deleted row arrives carrying only its Id (plus IsDelete = true) with the body of the record empty. The MERGE skeleton above is written for the Delta path, where a soft delete becomes a physical DELETEbefore any column is read — that part survives — but don't reuse the pattern of trusting a delete row's other columns anywhere else in a CSV-profile pipeline: an empty-bodied delete row that reaches an UPDATE SET * or a downstream join blanks real values. On the CSV path, treat delete rows as an Id-only signal and look up any fields you need from the last non-deleted version of the record.

Tables vs data entities

F&O exposes its data on two axes, and you'll use both. Raw tables are the physical schema — transaction grain, every column, the shapes the quirks guide describes. Data entities are export-shaped views: pre-joined, business-named, convenient. Where a good entity exists, landing it saves you the joins.

Landing an entity also has operational gates that landing a table doesn't. Microsoft's Synapse Link documentation (opens in new tab) documents three: an F&O entity must first be enabled as a Dataverse virtual entity, then have row-version change tracking turned on, before it can be selected for sync at all — and change tracking can't be enabled for every entity: enabling it can fail validation with “chosen entity doesn't pass the validation rules,” which means some entities simply cannot be landed. Entities that do land arrive under the mserp_ prefix — look for mserp_salesorderheaderv2entity in your lake, not salesorderheaderv2entity— the same class of naming trap as the lowercase column names covered earlier. If the entity you wanted fails validation, fall back to the raw-table route: every entity page in this reference generates the SQL that rebuilds the entity's shape from its landed tables — Microsoft's own documented fallback for this scenario is the FastTrack EntityUtil solution (opens in new tab), which builds the entity shape as views over those same landed tables.

The catch is that entities don't cover everything. Several core supply-chain objects have no standard export entity and can only be reached by landing the raw table: InventTrans, InventSum (only aggregate on-hand entities exist, not the full detail), InventDim, ReqTrans, DirPartyTable, the AR/AP open-item ledgers (CustTrans and VendTrans), and the warehouse work tables (WHSWorkTable exposes only a lines entity). These are exactly the transaction- and dimension-grain objects analytics needs most, so raw-table landing isn't optional — it's the backbone of any real F&O extract.

That is why this reference documents both axes: land raw tables for the grain entities can't give you, and lean on entities where they exist to skip the joins. When you go the raw-table route, each entity page here includes SQL that rebuilds the entity from its landed tables — so you can reproduce the convenient shape yourself and validate it against what the entity export would have returned.

Maintained by Summit Analytics, a supply chain analytics practice. The tools and references are free — the consulting is selective.

Part of the Summit Analytics reference library.

Work with the practice

Not affiliated with or endorsed by Microsoft. Microsoft, Dynamics 365, and Microsoft Fabric are trademarks of the Microsoft group of companies.