Insight · Microsoft Power BI

    Why Your Power BI Refresh Keeps Failing (and How to Stop It)

    Eight causes account for almost every Power BI refresh failure. Here is how to tell which one you have, fix it, and stop it recurring next month.

    Nick de Vrye, CTOPublished 28 August 202610 min read read
    Navy Solv Systems title card reading 'Fixing Power BI Refresh Failures' with a monitoring pulse line motif.

    In Short: Why Do Power BI Refreshes Fail?

    Eight causes account for nearly all of them: expired credentials, gateway problems, query timeouts, memory limits, source schema changes, source-side throttling, privacy or data-type conflicts, and refresh contention. The error message usually identifies which once you know the vocabulary. The durable fix is almost never "retry" - it is removing the condition that made the refresh fragile.

    Grid of the eight causes of Power BI refresh failure: credentials, gateway, timeout, memory, schema change, throttling, type or privacy conflicts, and contention.
    Grid of the eight causes of Power BI refresh failure: credentials, gateway, timeout, memory, schema change, throttling, type or privacy conflicts, and contention.

    Diagnose Before You Fix

    The most common mistake is restarting a failed refresh and hoping. It works often enough to feel like a fix, which is exactly why estates accumulate refreshes that fail once or twice a week forever.

    Start in the refresh history for the dataset. It gives you the failure message, the duration before failure, and the pattern - and the pattern matters as much as the message. A refresh that fails at the same time each day is contending with something. One that fails after exactly the same duration is timing out. One that started failing on a specific date had something change under it.

    The Eight Causes

    1. Expired or invalid credentials

    The most frequent cause by a wide margin, and the easiest to prevent. A service account password expires, an OAuth token needs reauthorisation, or someone leaves and their personal credentials go with them.

    Fix: re-enter credentials on the dataset. Prevent: use service accounts with non-expiring passwords, owned by a team rather than a person, and never store an individual's credentials on a production dataset.

    2. Gateway offline, outdated or misconfigured

    On-premises sources refresh through the on-premises data gateway. If the machine hosting it reboots, the service stops, or the version falls too far behind, refreshes fail.

    Fix: confirm the gateway is running and current. Prevent: install it on a server rather than someone's desktop, run it as a clustered pair so one node can fail, and keep it updated.

    3. Query timeout

    The refresh takes longer than the allowed window. Time limits differ by licence tier and are considerably stricter on shared capacity.

    Fix in the moment: reduce what the refresh does. Fix properly: incremental refresh so you load days rather than years, and move transformation upstream into the source or a Fabric pipeline.

    4. Memory limit exceeded

    Often surfaces as a resource-exceeded error. The dataset needs more memory during refresh than the tier allows - and refresh needs meaningfully more than the model's resting size.

    Fix: shrink the model. Remove unused columns, drop high-cardinality text you never group by, split datetime into date and time. Then: incremental refresh. Buying capacity works but is the expensive answer, and an inefficient model will simply grow into the new tier.

    5. Source schema changed

    Someone renamed a column, changed a data type, or removed a field. Power Query has the old shape hardcoded in its steps and fails.

    Fix: update the query. Prevent: select columns explicitly rather than relying on position, avoid steps that break on unexpected columns, and where you control the source, put a view in front of the table so the contract is stable.

    6. Source-side throttling

    SaaS APIs enforce rate limits. A full extract of a large object will hit them, and the failure often looks like a generic connection error rather than an obvious quota message.

    Fix: load incrementally against a modified timestamp, use batch endpoints, and stagger schedules. Our HubSpot and Business Central guides cover this per source.

    7. Privacy levels and data type conflicts

    Combining sources with incompatible privacy levels blocks folding and can fail outright. Type mismatches - a column that is text in one system and numeric in another - fail at load.

    Fix: set privacy levels deliberately rather than leaving defaults to collide, and enforce types explicitly early in the query rather than letting them be inferred.

    8. Refresh contention

    Several large refreshes scheduled at the same time on the same capacity queue and time out. This is the classic cause of "it fails on Mondays" - because everything got scheduled for 6am.

    Fix: stagger schedules deliberately. On Fabric, watch consumption in the Capacity Metrics app to see what is contending, and read our capacity sizing guide if throttling is routine.

    The Pattern Behind Most of Them

    Look at that list and a theme emerges: most refresh failures are architectural, not operational. Credentials tied to a person, transformation done in Power Query instead of upstream, full loads where incremental would do, schedules set by whoever created each dataset.

    Estates that refresh reliably tend to share four properties: data transformed before it reaches Power BI, incremental loading on anything large, service accounts owned by teams, and schedules planned centrally rather than accumulated.

    Make Failures Visible

    The worst version of this problem is not the failure - it is the finance director discovering it, in a meeting, from a number that looks wrong.

    Configure failure notifications to reach a monitored inbox or Teams channel rather than the dataset owner's personal email. Anyone relying on a report should be able to see when it last refreshed successfully. And log failures over time: three failures a month on the same dataset is a design problem, not bad luck.

    Where Solv Systems Comes In

    We are usually called in after the third month of weekly failures, and the work is rarely the refresh itself. It is moving transformation upstream, introducing incremental loading, replacing personal credentials with governed service accounts, and putting monitoring in place so problems surface before the business finds them.

    If your refreshes fail often enough that someone checks them each morning, that is a fixable design problem rather than the cost of doing business.

    Sources and Further Reading

    Frequently asked

    Most failures trace to one of eight causes: expired credentials, a gateway that is offline or outdated, a query timeout, exceeding the memory limit for your licence tier, a source schema change, source-side throttling, a data type or privacy-level conflict, or simply too many refreshes queued against the same capacity. The error message usually points at one of these once you know what to look for.

    Refreshes are subject to time limits that differ by licence tier, and shared capacity is considerably stricter than dedicated capacity. Rather than memorising a number, treat a timeout as a signal that the refresh is doing more work than it should - the durable fix is incremental refresh or moving transformation upstream, not asking for more time.

    Check the gateway is online and running a current version, then confirm the data source credentials stored against it are still valid. Gateway failures are more often a stale credential or an expired service account password than a genuine connectivity problem.

    Because Desktop uses your local credentials and network, and the Service does not. The Service needs its own stored credentials, and any on-premises source needs a gateway. A refresh that only works locally almost always means one of those two is missing or misconfigured.

    The dataset needs more memory than your licence tier allows during refresh, which typically means the model is too large, the transformations are too heavy, or both. Reducing columns, applying incremental refresh, and pushing transformation upstream all help - increasing capacity is the expensive answer, not the first one.

    Treat reliability as a design property. Load incrementally rather than fully, transform upstream rather than in Power Query, use service accounts whose passwords do not expire silently, stagger refresh schedules so they do not contend, and alert on failure so you find out before the business does.