People assume the hard part of leaving Tableau is the data. It is not. The Hyper file is a SQL database with a supported API; every table becomes Parquet in an afternoon. The hard part is the twelve years of decisions encoded in the workbook: what a field is called, how it aggregates, what Profit Ratio means, which sheet goes where on the executive dashboard.
Fields become the model
Every <column> in the datasource carries a caption, a datatype, a role (dimension or measure) and a default aggregation. That maps almost one to one onto a semantic model: captions become labels, measures with a Sum become SUM(...) metrics, dimensions become dimensions with their type. Folders and hierarchies come along as metadata. The result is a model that already speaks the business’s names, which is what makes the AI useful on day one.
Calculated fields: three tiers
This is where honesty matters. Tableau’s formula language is a mix of things that translate cleanly and things that have no SQL equivalent without knowing how the sheet was laid out.
| Tier | Examples | What happens |
|---|---|---|
| translated | SUM([Profit])/SUM([Sales]), IF … THEN … ELSEIF … END, ZN, COUNTD, DATETRUNC, DATEDIFF, string functions | becomes DuckDB SQL and runs as is; string literals re-quoted, casts made explicit |
| translated-verify | DATEADD intervals, a field the extract does not contain, functions that may not map one to one | runs, flagged for a person to check |
| manual | LOD expressions ({FIXED …}), table calculations (RUNNING_SUM, WINDOW_AVG, RANK), ATTR, USERNAME | reported with the formula and the reason; a person rewrites it as a window function or subquery |
In practice the first tier covers most of a typical workbook. Table calculations are the ones that need thought, because their meaning depends on the sheet’s addressing — something the formula alone does not say.
Sheets become widgets
Tableau’s marks-and-shelves model is closer to a chart grammar than people expect. A mark type (Bar, Line, Area, Circle, Text) and the fields on the Rows, Columns and Color shelves read directly as a chart spec: the dimension on Columns is x, the measure on Rows is y, the field on Color is the series. A truncated date on a continuous axis (tmn:Order Date) is a month grain. A Text mark with only measures is a KPI tile.
Dashboards become a grid
Dashboard zones carry absolute coordinates in hundred-thousandths of the canvas. We snap them to a twelve-column grid. Filter and parameter zones are noted in the report rather than faked. The layout will not be pixel-identical; it will be the same dashboard.
The report is the product
Every import ends with a fidelity report: sheets converted / partial / manual, calculations by tier, tables and row counts, dashboards created. Nobody discovers three weeks later that a number was silently wrong. That is the difference between a migration tool and a demo.
What does not come across
Live connections without an extract (we report the connection details so the datasource can be created against your own credentials). Custom SQL that only Tableau’s engine understands. Dual-axis charts, which we do not support on purpose. Legacy .tde extracts, which need one open in Tableau Desktop to upgrade. And anything that was really a workaround for a missing metric definition — those are better fixed in the model than carried across.