TABLEAU • PUBLISHING, SHARING, AND GOVERNANCE

Scheduled Refreshes — Schedule extract refreshes and manage failures conceptually

Automate data freshness and build resilient refresh pipelines on Tableau Server and Tableau Cloud.

Historical Context & Motivation

Modern business intelligence platforms must serve dashboards whose underlying data changes constantly—transactional databases accumulate rows, cloud APIs emit new payloads, and data lakes ingest streaming events around the clock. In the early days of BI, analysts manually exported CSV files and re-imported them each morning, a tedious and error-prone ritual that left organizations working with stale information for hours or even days. Scheduled refreshes emerged as the answer to this operational bottleneck: a server-side mechanism that automatically re-queries source databases, rebuilds the optimized columnar snapshot known as a Tableau extract, and publishes fresh data to consumers without any manual intervention. Understanding how these schedules work—and how failures propagate—is essential knowledge for anyone deploying Tableau at scale.

2009
Tableau Server 5 — First Scheduled Extracts
Tableau Server introduced server-side extract refresh schedules, replacing manual desktop publishing workflows and enabling overnight batch updates for the first time.
2013
Incremental Extracts
Tableau added incremental refresh support, allowing extracts to append only new rows rather than re-downloading the entire dataset—dramatically cutting refresh times for append-heavy tables.
2018
Hyper Engine & .hyper Extracts
The Hyper engine replaced the legacy TDE format with the columnar, transactional .hyper file, boosting both query speed and extract creation throughput by an order of magnitude.
2020
Tableau Cloud — Managed Schedules & Bridge
Tableau Cloud introduced managed schedules and Tableau Bridge, a lightweight agent that tunnels into private networks so cloud-hosted sites can refresh extracts from on-premises databases without VPN configuration.
2023
Continuous & Event-Driven Refreshes
Tableau expanded its scheduling model with more granular cadences and REST API–driven refresh triggers, enabling event-driven architectures where an upstream ETL pipeline can kick off a refresh the moment new data lands.

The central question this lesson addresses is straightforward yet operationally critical: how do you design a reliable refresh strategy that keeps dashboards fresh, minimizes server load, and gracefully handles the inevitable failures that arise from network outages, credential expiration, and schema drift? We will explore the underlying mechanics, failure taxonomy, and best practices that govern this pipeline.

Core Principles & Definitions

Before diving into scheduling mechanics, it is important to ground ourselves in the foundational concepts that underpin extract-based analytics in Tableau. An extract is a compressed, columnar snapshot of a data source stored in the .hyper format. Unlike a live connection, which forwards every user query to the source database in real time, an extract is materialized on the Tableau server and queried locally by the Hyper engine. This architecture trades real-time freshness for dramatically faster query performance, reduced load on transactional databases, and offline availability. The scheduled refresh is the mechanism that keeps these materialized snapshots synchronized with the source of truth.

1

Full Refresh

Drops the existing extract and rebuilds it from scratch by re-executing the original query against the data source. Guarantees complete consistency but can be time- and resource-intensive for large tables.
2

Incremental Refresh

Appends only rows whose key column value exceeds the current maximum in the extract. Significantly faster than a full refresh for append-only tables, but does not capture updates or deletes to historical rows.
3

Schedule Object

A named, reusable time-based rule (e.g., 'Daily at 02:00 UTC') defined at the server or site level. Multiple extracts can be assigned to a single schedule, enabling centralized cadence management.
4

Refresh Task

The binding between a specific extract and a schedule. When the schedule fires, the Backgrounder process dequeues the task, connects to the source, executes the query, and replaces or appends to the .hyper file.
5

Backgrounder Process

A dedicated Tableau Server process responsible for running extract refreshes, subscriptions, and flow tasks. Organizations scale refresh capacity by adding Backgrounder nodes to the cluster.
KEY TAKEAWAY
Think of a scheduled extract refresh like a cron job for your data warehouse cache. Just as cron periodically triggers a script on a Unix server, a Tableau schedule periodically triggers a Backgrounder process to re-materialize a cached query result. The extract is the cache artifact; the schedule is the eviction/rebuild policy. If the rebuild fails, stale data persists—the old cache is never deleted—which is both a safety net and a stealth hazard, because consumers may unknowingly view outdated information.

Visual Explanation — The Refresh Lifecycle

The diagram traces an extract refresh from schedule trigger through task queuing, source query, Hyper build, and atomic swap. The bottom section enumerates the four principal failure categories—each of which preserves the previous extract and fires an alert notification.

The lifecycle depicted above follows a well-defined sequence that mirrors a classic producer–consumer pipeline. When the clock reaches the scheduled time, the server enqueues a refresh task into the Backgrounder's internal job queue. The Backgrounder process dequeues the task, establishes a connection to the upstream data source using embedded or separately stored credentials, and executes the extract query. If the refresh type is full, a temporary .hyper file is built from scratch; if it is incremental, new rows are appended to the existing file. Upon successful completion, the server performs an atomic swap—replacing the old extract file with the new one in a single, indivisible operation so that dashboard users never see a partially built extract.

Critically, when any step in this pipeline fails, Tableau does not delete the existing extract. The old, now-stale snapshot remains in place and continues to serve queries. This design is analogous to a blue-green deployment strategy in software engineering: the new artifact must be fully healthy before the router switches traffic to it, and if the build fails, the old artifact remains live.

How Scheduling Works — Mechanisms & Configuration

Schedule Creation and Assignment

On Tableau Server, server administrators define named schedules at the server level using the Settings → Schedules page or the REST API. A schedule specifies a recurrence pattern (hourly, daily, weekly, monthly), a start time in the server's configured time zone, and an optional priority integer from 0 (highest) to 100 (lowest). When a content owner publishes or updates a workbook or data source with an extract, they assign it to one of these predefined schedules. Multiple extracts can share a schedule; the Backgrounder serializes or parallelizes their execution depending on the number of available Backgrounder worker threads.

On Tableau Cloud, the model is slightly different. Schedules are not site-wide shared objects; instead, each extract owner configures a refresh cadence directly on the published data source or workbook. The minimum interval on Tableau Cloud is 15 minutes for Tableau Bridge connections and hourly for cloud-native connectors. For sources behind a firewall, Tableau Bridge acts as a reverse-tunnel agent: it runs on an on-premises machine, polls the Tableau Cloud site for pending refresh tasks, and executes them locally, pushing the resulting .hyper file back to the cloud.

Priority and Concurrency

When multiple refresh tasks are enqueued simultaneously—a common scenario at midnight when all 'daily' schedules fire at once—the Backgrounder dequeues tasks in priority order. Within the same priority level, tasks are processed in FIFO order. The total concurrency is determined by the number of Backgrounder processes multiplied by the backgrounder.querylimit setting. If all threads are occupied, queued tasks wait, potentially delaying downstream dashboards. This is the classic thundering herd problem familiar from operating systems and distributed computing, and the remedy is the same: stagger your schedules.

EFFECTIVE REFRESH THROUGHPUT
T = (N_bg × C_thread) / avg(t_refresh)
Where T = extracts refreshed per hour, N_bg = number of Backgrounder processes, C_thread = concurrent threads per Backgrounder (typically 1–2 for extract refreshes), and avg(t_refresh) = mean refresh duration in hours. This model helps capacity planners determine whether additional Backgrounder nodes are needed.

REST API and Event-Driven Refreshes

Beyond time-based schedules, Tableau's REST API exposes the POST /api/{version}/sites/{siteId}/datasources/{datasourceId}/refresh endpoint, which allows external systems—CI/CD pipelines, Airflow DAGs, or dbt post-hooks—to trigger an extract refresh programmatically. This event-driven pattern decouples refresh timing from a fixed clock and instead ties it to data availability. When your upstream ETL writes a completion marker file, a webhook fires the Tableau refresh, guaranteeing that the dashboard updates within minutes of new data landing rather than waiting for the next scheduled window.

Failure Taxonomy & Alerting

Extract refresh failures are inevitable in production environments, and a robust governance strategy requires classifying failures by root cause so that the appropriate remediation can be applied. Tableau groups failures into several categories, each surfaced through the Background Tasks for Extracts administrative view, the Backgrounder log files (typically backgrounder-*.log), and the email alert system. Understanding this taxonomy helps administrators triage incidents efficiently.

The failure classification tree groups refresh errors into three families: authentication errors (credential or token issues), data source errors (schema drift, query timeouts), and infrastructure errors (disk space, process crashes). The bottom box summarizes the five-step failure response protocol that Tableau Server follows.

Alerting and Suspension Policies

When a refresh task fails, Tableau Server sends an email notification to the content owner (and optionally to the site administrator). The email includes a truncated error message and a link to the administrative view for more details. On Tableau Server, administrators can configure a consecutive failure threshold via tsm configuration set -k backgrounder.failure_threshold_for_job_suspension. After the extract fails this many times in a row—the default is five—the task is automatically suspended, preventing it from consuming Backgrounder cycles on subsequent schedule runs. The owner receives a suspension notification and must manually resume the task after addressing the root cause.

🔔 Monitoring Tip
Use the built-in administrative view Background Tasks for Extracts (available under Status → Site Status on Tableau Server) to monitor refresh success rates, durations, and queue wait times. For programmatic monitoring, query the background_jobs table in the Tableau Server Repository (PostgreSQL) or integrate with the Webhooks API to push failure events into Slack, PagerDuty, or any incident management system.

Worked Example — Designing a Refresh Strategy

Consider a mid-sized e-commerce company that publishes three critical extracts to Tableau Server. The Sales Dashboard pulls from a 50-million-row PostgreSQL transactions table and must be updated nightly. The Inventory Tracker connects to a Snowflake warehouse and needs hourly updates. The Marketing Attribution workbook reads from a Google BigQuery dataset that is refreshed by an Airflow DAG at irregular intervals. The server has two Backgrounder processes, each running a single concurrent thread.

Designing a Multi-Extract Refresh Plan
1
Step 1 — Assess Data Freshness RequirementsThe Sales Dashboard requires data no older than one business day, so a daily full refresh suffices—scheduled after the nightly ETL completes at 03:00 UTC. The Inventory Tracker has a stricter SLA of one hour, requiring an hourly incremental refresh. Marketing Attribution should be event-driven, triggered by Airflow upon DAG completion.
Sales: daily full at 03:00 · Inventory: hourly incremental · Marketing: API-triggered
2
Step 2 — Choose Full vs. Incremental for Each ExtractThe Sales transactions table receives both inserts and updates (e.g., refunds modify existing rows), so an incremental refresh would miss updates—full refresh is required. The Inventory Tracker's Snowflake table is append-only with a monotonically increasing updated_at timestamp, making it an ideal candidate for incremental refresh on that column. Marketing Attribution also qualifies for incremental since new touchpoints are only appended.
Sales → full · Inventory → incremental on updated_at · Marketing → incremental on event_timestamp
3
Step 3 — Stagger Schedules to Avoid the Thundering HerdWith only two Backgrounder threads, we cannot run the Sales full refresh (estimated 25 minutes) simultaneously with an hourly Inventory refresh. We assign Sales to a schedule at 03:00 UTC and offset the Inventory hourly schedule to the :30 mark of every hour. This guarantees that the Sales task completes before the 03:30 Inventory run begins, preventing queue backlog.
Sales: 03:00 UTC · Inventory: :30 every hour · Marketing: on-demand via REST API
4
Step 4 — Configure Failure HandlingWe set the failure suspension threshold to 3 consecutive failures for the Sales extract (since a single nightly attempt means three days without data is the maximum acceptable outage before escalation) and 5 for the Inventory extract (since it runs hourly and transient failures are more common). We configure a webhook to post failures to the #data-alerts Slack channel via a Tableau Server webhook event of type ExtractRefreshFailed.
Sales: suspend after 3 failures · Inventory: suspend after 5 · Slack webhook for all failures
5
Step 5 — Validate with Capacity CheckUsing the throughput formula T = (N_bg × C_thread) / avg(t_refresh), we estimate capacity. With N_bg = 2, C_thread = 1, and avg(t_refresh) ≈ 0.1 hours (6 minutes average across all three extracts), we get T = 2 / 0.1 = 20 extracts per hour. With 25 hourly refresh tasks (24 Inventory + 1 Marketing on average), we are slightly over capacity. We recommend adding a third Backgrounder node or reducing the Inventory cadence to every 2 hours.
T = 20/hr vs. 25 tasks/hr → Add a 3rd Backgrounder or reduce Inventory to bi-hourly

Full vs. Incremental vs. Live — Tradeoff Analysis

Comparison of data connection strategies in Tableau
DimensionFull Extract RefreshIncremental Extract RefreshLive Connection
Data FreshnessStale until next refresh window (minutes to hours)Stale for new rows only; historical rows may be outdatedReal-time; every query hits the source
Handles Updates/DeletesYes — entire dataset is rebuiltNo — only appends new rows beyond the high-water markYes — queries reflect current state
Refresh DurationProportional to full dataset sizeProportional to new rows since last refreshN/A — no extract to build
Source LoadHigh — full table scan each cycleLow — query filters on key columnContinuous — every dashboard render queries source
Query PerformanceFast — Hyper engine serves local columnar dataFast — same Hyper engine benefitsDepends on source database performance
Best ForMutable datasets, small-to-medium tables, data warehousesAppend-only event logs, time-series data, large tablesSmall, fast databases where real-time is non-negotiable
KEY TAKEAWAY
Choosing between full, incremental, and live is analogous to choosing between a write-invalidate cache, a write-append log, and a cache-bypass architecture in systems design. Full refresh is like invalidating and rebuilding the entire cache—safe and consistent but expensive. Incremental refresh is like appending to a write-ahead log—fast and efficient but unable to capture mutations. Live connection is like bypassing the cache entirely—always fresh but at the cost of source-side latency on every read. The optimal strategy depends on your data mutation patterns and freshness SLA.

Connection to Advanced Topics — Governance at Scale

Scheduled refreshes are one component of a broader data governance strategy on the Tableau platform. As organizations scale beyond a few dozen extracts to hundreds or thousands, more sophisticated orchestration patterns become necessary. The concepts learned in this lesson serve as the foundation for several advanced capabilities that extend the refresh paradigm into enterprise-grade data operations.

From foundational refresh concepts to advanced governance capabilities
This Lesson's ConceptAdvanced Extension
Named schedules with hourly/daily cadencesTableau Prep Conductor — scheduled flows that perform complex ETL transformations before extract creation
REST API–triggered refreshesWebhook-based orchestration — chaining refreshes in DAGs via event-driven triggers and external orchestrators like Airflow or Prefect
Email failure alertsContent Migration Plans & Data Quality Warnings — governance features that flag stale or untrusted data sources with visual badges on dashboards
Backgrounder capacity planningResource Monitoring Tool (RMT) — real-time monitoring agent for Tableau Server that tracks Backgrounder CPU, memory, and queue depth over time
Single-site extract managementVirtual Connections with Extract Policies — centralized, row-level-security–aware extracts shared across multiple workbooks, refreshed once for all consumers

As you advance in Tableau administration, you will encounter virtual connections and extract policies that consolidate refresh management for hundreds of workbooks into a single governed data asset. These features build directly upon the scheduling and failure-handling primitives covered in this lesson. Mastering the fundamentals of refresh cadence design, failure classification, and capacity estimation positions you to evaluate these advanced features with the right mental model—one grounded in systems thinking about caching, concurrency, and fault tolerance.

Practice Problems

PROBLEM 1CONCEPTUAL
When a scheduled extract refresh fails on Tableau Server, the existing extract is not deleted—the stale data continues to serve queries. Explain why this design decision was made, and describe a scenario where it could become a hidden risk for business decision-making.
PROBLEM 2BASIC CALCULATION
A Tableau Server cluster has 4 Backgrounder processes, each running 1 concurrent extract refresh thread. The average refresh duration is 8 minutes. How many extract refreshes can this cluster complete per hour? If the organization has 40 extracts all scheduled at the top of every hour, what is the expected queue wait time for the last extract in the batch?
PROBLEM 3INTERMEDIATE
You manage a published data source whose underlying PostgreSQL table contains 200 million rows. Rows are inserted at a rate of ~500,000 per day and historical rows are never updated or deleted. The full extract refresh currently takes 45 minutes. You want to switch to incremental refresh. (a) What column property must the key column satisfy? (b) Estimate the incremental refresh duration if it is proportional to the number of new rows. (c) Identify one scenario where you would still need to schedule periodic full refreshes even after switching to incremental.
PROBLEM 4APPLIED
Your organization runs an Airflow DAG that loads data into Snowflake every day at a variable time between 01:00 and 04:00 UTC. A Tableau extract must be refreshed after the DAG completes. Design a refresh strategy that avoids scheduling the extract at a fixed time (since the DAG completion time varies). Describe the specific API calls and orchestration logic you would implement.
PROBLEM 5CRITICAL THINKING
A colleague argues that Tableau should support automatic retry with exponential backoff for failed extract refreshes, similar to how cloud message queues (e.g., AWS SQS) handle failed consumer operations. Evaluate this proposal: what are the potential benefits, and what risks or complications could arise from implementing automatic retries with backoff in the context of Tableau extract refreshes? Consider Backgrounder resource contention, source database impact, and failure categories that are inherently non-transient.

Summary

Tableau's scheduled extract refreshes automate the process of keeping materialized .hyper extracts synchronized with upstream data sources. A full refresh rebuilds the entire extract from scratch, ensuring consistency even when historical rows are updated or deleted, while an incremental refresh appends only new rows beyond a monotonic key, minimizing source load and refresh duration for append-only datasets. The Backgrounder process executes these tasks, and its capacity—determined by the number of processes and concurrent threads—must be carefully planned against the total refresh workload to avoid queue saturation.

Failures are classified into authentication errors, data source errors (schema drift, timeouts), and infrastructure errors (disk exhaustion, OOM crashes). Tableau's fail-safe design preserves the stale extract on failure, guaranteeing dashboard availability at the cost of data freshness—a tradeoff that requires proactive monitoring via administrative views, log analysis, and webhook-based alerting. For event-driven architectures, the REST API enables external systems to trigger refreshes programmatically, decoupling data freshness from fixed clock schedules. Mastering these primitives prepares you for advanced governance patterns including virtual connections, Prep Conductor flows, and enterprise-scale orchestration with tools like Airflow.

Varsity Tutors • Tableau • Scheduled Refreshes — Schedule extract refreshes and manage failures conceptually