| name | content-promotion-runbook |
| description | Step-by-step runbook for promoting Tableau workbooks and data sources from development through test to production using the Content Migration Tool, REST API, and tabcmd — with pre-promotion checklists, rollback steps, and the governance gates that prevent silent data breaks. Owned by tableau-admin. |
Content Promotion Runbook
When to invoke
- Promoting a new or updated workbook from dev → test → prod.
- Onboarding a new project to a repeatable promotion pipeline.
- Debugging a promotion that broke a dashboard (broken data source connections, wrong extracts, missing permissions).
- Replacing a manual hand-republish workflow with an automated one.
Principle: promote, never rebuild
Hand-republishing a workbook in each environment (open Tableau Desktop, reconnect to the prod server, republish) is the highest-risk promotion method — connection strings, credentials, and permissions are reset by hand, producing silent differences. Use CMT or REST API to promote as an artifact.
Pre-promotion checklist (fill out before every promotion)
Option A — Content Migration Tool (CMT) — recommended for most promotions
CMT is the Tableau-supported GUI + CLI tool for promoting content between sites and environments.
Plan steps:
1. Source: Site/Project/Workbook or Data Source
2. Target: Site/Project in the target environment
3. Mapping: map data source connection strings dev→prod (Connections tab)
4. Options: overwrite existing, preserve permissions, include extract OR reconnect to published DS
5. Run → review the migration report for errors
Key mapping rules:
- Always map connection strings explicitly — CMT will not auto-discover prod credentials.
- If the workbook uses embedded credentials, rotate them post-promotion and use a service account, not a personal credential.
- Select "Preserve permissions" only if the target project's permission model matches the source — mismatched models silently over-grant.
Option B — REST API promotion (for CI/CD pipelines)
import tableauserverclient as TSC
server = TSC.Server("https://prod-tableau.company.com", use_server_version=True)
tableau_auth = TSC.PersonalAccessTokenAuth("svc_deploy", PAT_SECRET, "DefaultSite")
with server.auth.sign_in(tableau_auth):
workbook_path = source_server.workbooks.download(workbook_id, filepath="/tmp")
target_project = find_project(server, "Production/Finance")
publish_mode = TSC.Server.PublishMode.Overwrite
new_wb = TSC.WorkbookItem(target_project.id)
server.workbooks.publish(new_wb, workbook_path, publish_mode,
connections=prod_connection_credentials)
Connection credentials must be supplied at publish time — never embedded in the .twbx or the script. Use a secrets manager or CI/CD environment variable.
Option C — tabcmd (for scripted, low-complexity promotions)
tabcmd login --server https://prod-tableau.company.com \
--username svc_deploy --password "${TABCMD_PASSWORD}" \
--site "DefaultSite"
tabcmd publish "Finance_Dashboard.twbx" \
--project "Production/Finance" \
--overwrite \
--db-username "$PROD_DB_USER" \
--db-password "$PROD_DB_PASS"
tabcmd is simpler than REST API but does not support connection mapping for multi-source workbooks. Use CMT or REST API for workbooks with > 1 data source.
Post-promotion verification steps
- Load test: open the promoted workbook as a non-admin user in the target environment. Confirm it loads within 5 s.
- Data spot-check: compare 3 key metrics between the newly promoted view and the source environment. Flag any difference > 0.1 % for investigation.
- RLS spot-check: log in as the designated test user in the target environment. Confirm the user sees only their authorised data.
- Permission spot-check: confirm one Viewer, one Explorer, and one non-member can or cannot access the workbook as expected.
Rollback procedure
If the promoted workbook is broken:
- In Tableau Server/Cloud, navigate to the workbook → Revisions → Restore to the previous version.
- Tableau retains the last 25 revisions (default) — confirm the retention policy before relying on this.
- If revision history was disabled or the previous version is too old: restore from CMT backup (CMT can export content to a local archive before migration — always enable this).
- File a post-mortem: which promotion gate was missing that would have caught this?
Pitfalls
- Manually republishing from Tableau Desktop to the production server — connection strings, credentials, and permissions are reset differently each time; the workbook diverges from the dev canonical.
- Skipping the data spot-check because "the query is the same" — a connection string mapped to the wrong schema, or an extract pointing to the old dev data, passes a load test and fails silently on data.
- Storing the service-account PAT in the
tabcmd script — use environment variables or a secrets manager.
- Promoting a workbook without testing RLS in the target environment — RLS entitlement tables often differ between environments; a test in dev passes while prod exposes unintended rows.