Offboarding a Tableau user without breaking Monday
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.
Two Tableau credentials doing two different jobs. One carries a person’s permissions. The other extends a platform capability. Picking the right one keeps a permission model you spent years building in charge of who sees what.
Updated · 5 min read
These are two routes to two different places. Treating them as interchangeable is the most consequential credential mistake in a Tableau integration. The mistake is common, because both of them work.
The rule here is written into the code, and stated in the module that implements it. Every user signs in with their own Tableau token. That token carries their exact Tableau permissions. It is the governance boundary for every read, every write, and every assistant or tool call made for them.
Signing in belongs to the personal token alone. A one-click path that skipped it did exist at one point, and it was retired deliberately. The resolver was removed, and the gateway now turns down a connect attempt that is JWT-shaped.
The reason is practical rather than architectural. Let a service credential sign a person in, and every action after that carries the service account’s permissions rather than the person’s. The Tableau permission model your team spent years building then stops deciding who can see what.
It covers platform capability: a person is already signed in, and the platform itself needs a token of its own. Embedding is the live example. A real Tableau view rendered inside another surface needs a token the embedding API will accept, and a personal token is the wrong shape for that.
The second one produces support tickets that look like product flakiness. They are a credential collision. It is worth checking first whenever a scheduled job and a person seem to be interfering with each other.
Secrets in this suite are session-only. That holds cleanly until something has to run at two in the morning with nobody signed in. A session-only secret cannot exist at that hour, by definition.
There is one exception, and it is explicit rather than implied. An operator clicks to lock in a token for scheduled runs. It is encrypted at rest under a machine key, never logged, and never echoed back to the browser. The describe call returns the token name only. One click removes it. The interface recommends a dedicated automation token, for the collision reason above.
An exception a person has to click is an exception somebody can find later. An exception that happens automatically is one nobody can audit, and eventually one nobody remembers agreeing to.
A scheduled job can try a personal token first and fall back to a Connected App JWT. That is a sensible design. It can also hide a broken credential for months, because from the outside the run keeps succeeding.
The fix is small and it matters. Record which credential actually authenticated, and show it on the row. A fallback that happens invisibly is a fallback nobody ever repairs. The first anyone hears of it is the day the fallback fails as well.
Four checks, and the fourth is the one worth being slow about. Everything else on this page is downstream of getting it right.
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.
The approve to run rule, in plain words. The assistant reads, explains and proposes, and a person owns the write path. What that costs, what it buys, and three questions to ask of any AI feature.
An assertion is a sentence. Evidence is something a second person can check without asking you. What an audit trail has to contain, what a hash actually proves, and what to require of any tool that claims to produce one.