Tableau Server to Tableau Cloud: what actually has to move
Content is the easy part of a migration. This is what has to move with it, what tends to break quietly afterwards, and what a governed migration checks before anyone approves a run.
Content mostly behaves. The attachments around it are separate objects with their own owners and their own schedules, and they are what fills a support queue on the Monday. Here is how to enumerate them while the source is still running.
Updated · 7 min read
Content is the part everyone plans for, and it is the part that mostly survives. What sits around a workbook is a set of separate objects, each with an owner, most with a schedule, and none of them visible in a project tree.
Alerts and the schedules behind them belong in the same enumeration, for the same reasons: a person created them, they live on the source, and their owner has to exist on the destination for them to mean anything. Some attachment types have no direct equivalent on a Cloud site, and where that is true the honest plan is to re-create them deliberately, not expect a transfer.
Each optional type is chosen explicitly, and the defaults have a reason behind them. Custom views ride workbooks and are on. The schedule and task types are off, because they often need conversion and will error when the content they attach to sits outside the same run.
The consequence is worth saying plainly, because it is the most common route to a quiet Monday: a run configured in a hurry moves the content, leaves the schedules behind, and reports success at every step. Nothing failed. The schedules were never in scope, and a report of a clean run is a true statement about a smaller job than anybody thought they had approved.
The pre-flight preview lists what is included and what is skipped, by name, before anyone approves. That one line is the highest-value sentence in the whole preview and the easiest to scroll past on the way to the counts.
Dependencies appear there as well. Flow run tasks reference flows: ticking the tasks while flows stay out of the run leaves them nothing to attach to, and they will error in the manifest. The preview says so in advance.
Identity is deliberately not scoped by project, because content cannot be owned on the destination by somebody who is not there yet. That ordering constraint is the one teams most often meet late, usually on the day the calendar has already committed to.
Preserving the original owner is the default, and the owners of everything in the selection are pulled into the user scope automatically so a run does not fall over on a missing one. What still catches people is an owner who resolves to no email-style Tableau ID: with preserve-owner their content errors or is skipped on publish, and that is the single most common reason a migration comes back nearly empty. The preview names it, with a count and a sample of the accounts concerned.
Two kinds of connection arrive looking healthy and behave differently afterwards.
The first is credentials. Published data sources and live connections may need re-authenticating on the destination before extract refreshes succeed. This is Tableau platform behaviour and it applies to any move, which is why the preview states it on every run whatever else is in scope. The first evidence is normally a stale extract, not an error.
The second is reachability. A connection that resolved from a machine inside your own network may not resolve from a hosted site, and that failure arrives at query time, for one person at a time, long after the migration report went green. List every connection by host before the move and mark the ones whose reachability depends on where the server sits.
Permissions in Tableau are inherited from where a thing sits, so content that lands in a different project has a different audience even though the workbook itself is unchanged. Check the ones that moved projects first.
The whole job is a count taken twice. Take the first one while the source is still running.
Six of those seven steps happen before anybody approves anything, and together they are the cheapest hour in the project. The seventh is the one that tells you whether the other six were true.
A post-migration support queue is made of things that are present and quiet. A report nobody is subscribed to any more. An extract that has not refreshed since the move. A personal view somebody had kept for a year. None of them raises an error and none of them appears on a status page. They are reported by users, not by monitoring.
The reconciliation is a count, taken on both sides, by type, compared line by line, with every difference explained on purpose, including the differences you chose. A difference you can name is a decision. A difference you cannot name is a finding, and it is much cheaper as a finding this week than as a discovery next quarter.
Do it in the same week. While the source is still running, a missing subscription is a five-minute fix and a missing refresh task is a form. Once the source is switched off, the same two questions become archaeology, and the person who knew the answer has already started the next project.
The before-count and the after-count belong in one document, taken by the same person, in the same units. Two counts, in two places, in two formats, is how a reconciliation quietly turns into a conversation about methodology.
Content is the easy part of a migration. This is what has to move with it, what tends to break quietly afterwards, and what a governed migration checks before anyone approves a run.
A person leaves. Their name stays on workbooks, schedules and subscriptions, and several of those fail without a sound. What they hold, what breaks, and the order that keeps the license recoverable.
Four things get called governance: certification, ownership, stale content and change control. Here each one is written as a check you can run, not an aim you can state. It also covers the one change that passes a visual review and is still wrong.