Troubleshooting guide

Site paused by your host with no code change: how to fix it

Your production site goes offline or deploys stop working, and nothing in your repo changed. The cause is the hosting account: its billing, quotas, abuse filters, sign-in, or an incident on the platform.

12 min read Updated 8 Nov 2026Last reviewed 8 Nov 2026How we collect cases

What you'll see

  • The production domain returns 503 with DEPLOYMENT_PAUSED on Vercel, or a 'Site not available' page on Netlify, and nobody has deployed recently.
  • Production deploys are blocked by a billing, credits or account message, even though the usage page shows most of your allowance left.
  • A free backend service stops answering part-way through the month, or a free database becomes unreachable about 30 days after you created it.
  • Your frontend or mobile app gets an HTML challenge page from its own API where it expects JSON, so parsing fails.
  • You can't sign in to the host's dashboard to fix any of this, because the 2FA device is gone and the recovery email never arrives.
  • The host's status page shows a build, CDN or deploy incident, and your release is stuck behind it.

Why it happens

Cause 1

A usage limit or spend cap paused production

On Vercel Pro, Spend Management can pause the production deployment of every project on the team once the On-Demand Budget is reached. Visitors then get a 503 DEPLOYMENT_PAUSED error. On Vercel Hobby, going over a usage limit usually means waiting 30 days before you can use the feature again. On Netlify's credit-based plans, running out of credits pauses all web projects on the team.

Cause 2

The billing state changed: failed card, expired trial, expiring free resource

A failed payment, or a trial that ends with no card on file, leaves the account in bad standing. Vercel lists that as a cause of DEPLOYMENT_PAUSED. Free tiers have their own limits and expiry dates. Render suspends all Free web services once the 750 monthly instance hours are used up, and a free Render Postgres database expires 30 days after creation. None of these involve a commit, so your repo history won't explain the outage.

Cause 3

An account flag disagrees with your actual usage

In several of our reports, a credits or billing flag on the account blocked production deploys even though the usage page showed most credits unused. Changing plans while troubleshooting can make this worse. In one case the account moved to a credit-based plan, used up the credits and paused deploys. Clearing a flag like this usually means going through the host's support team, so your recovery time depends on their queue.

Cause 4

Bot and DDoS filters challenge your own API traffic

Crawlers can use up a small plan's quota and trigger a pause. The filters meant to stop them can also block your real clients. Cloudflare says Bot Fight Mode and Super Bot Fight Mode may challenge API or mobile app traffic. A fetch() call or a native client can't solve a challenge meant for a browser.

Cause 5

The owner is locked out, or the platform is down

If one person holds the only owner login and loses their second factor, nobody can pay the invoice, resume the project or repoint anything. Separately, incidents at the CDN or build service can block deploys and over-the-air updates, even when your code hasn't changed.

How to fix it

  1. Confirm what is failing, from outside the host

    Request the production domain and one API route from a machine that isn't on the host. A 503 with DEPLOYMENT_PAUSED points to a spend or billing pause, a 'Site not available' page to a Netlify pause, and an HTML challenge where you expect JSON to a bot filter. Then check the host's status page, its Activity log and the account owner's inbox for a pause or billing email.

    curl -sS -o /dev/null -w '%{http_code} %{content_type}\n' https://yourdomain.com/api/health
  2. Clear the cause, then resume each project

    Pay the failed invoice, raise the Vercel On-Demand Budget, or buy Netlify credits. On Vercel, raising the spend amount does not unpause anything. You must resume each project yourself, in the dashboard or through the REST API.

    curl -X POST "https://api.vercel.com/v1/projects/$PROJECT_ID/unpause?teamId=$TEAM_ID" \
      -H "Authorization: Bearer $VERCEL_TOKEN"
  3. Escalate a wrong flag with evidence, and don't change plans while you wait

    If the usage page contradicts the block, open a support ticket. Include the team or account ID, a screenshot of remaining usage, the exact error, the deploy ID and the time it started. Don't switch plans to test a theory. A new plan can move you to a different metering model with different limits.

  4. Add billing alerts and a backup payment method

    Add a second payment method and make sure billing emails go to an inbox someone reads. On Vercel Pro, set an On-Demand Budget: web and email notifications fire at 50%, 75% and 100%, and SMS at 100%. Then decide whether Pause Production Deployments should stay on. On Netlify Personal or Pro, turn on auto recharge if you would rather pay an extra charge than have your sites go offline.

  5. Rate-limit crawlers before they spend your quota

    robots.txt only asks crawlers to behave, and Google's documentation says it can't enforce crawler behavior. Add a WAF rate-limit rule on your expensive routes instead. On Vercel it's under Firewall, Configure, New Rule, Rate Limit, with a default of 100 requests per 60 seconds per IP and a 429 action. Hobby plans get one such rule per project.

  6. Stop browser challenges on your API paths

    Cloudflare Bot Fight Mode can't be skipped with WAF custom rules or Page Rules. If it challenges your API or mobile clients, turn it off for that zone. On Pro plans and above, you can instead use Super Bot Fight Mode with a WAF custom rule that applies the Skip action to your API path.

  7. Make the account recoverable and monitor it from outside

    Register both an authenticator app and a passkey, store the single-use recovery codes offline, and give a second person owner access. Run an external uptime check on the production domain that alerts a phone directly, not an inbox tied to the host. Keep DNS at a provider you can sign in to independently of the host, so you can repoint the domain if the host is unreachable.

Check it's fixed

  • From a network outside the host, the production page returns 200 and an API route returns 200 with application/json, not a challenge page.
  • The external uptime monitor sends a test alert to a phone or address that doesn't depend on the hosting account.
  • The billing page shows a working backup payment method, spend or credit notifications are on, and you have written down what the plan does at its limit (pause, suspend or charge).
  • A second owner has signed in successfully, and you know where the recovery codes are stored.

Specific fixes

Stuck on one exact error? These pages go deeper on one symptom each.

Fix it with Gemmein

On Gemmein, a first failed charge changes nothing: a plan lapses only when Stripe gives up after its own retries. Going past the account's pooled storage brings an email and a grace period, never an automatic charge or tier change. When a plan does lapse, nothing is deleted, the owner gets the apps_paused alert, and paying again restores everything at once.

  1. Read what each allowance does when it runs out

    Past the account's pooled storage, the owner gets an email and a grace of the lesser of +10% or 7 days, with no automatic charge and no automatic tier change, and files already stored stay. Downloads and email are fair use: past them, Gemmein reaches out and nothing is refused or charged automatically, and a tier's active-people figure is never a limit or a price.

  2. Make room when uploads or functions wait

    After the grace, new uploads wait until files are deleted, a storage pack is added or the account moves up a tier. A storage pack is +50 GB for $5 a month on any paid tier, pre-chosen in Usage & billing and never metered. Past the pooled Edge function runs, Live function calls pause until the next period starts or the account moves to a bigger plan, and moving tier is the founder's choice in Usage & billing.

  3. Bring a lapsed plan back by paying

    When no app on the account has an active plan any more, the app whose plan lapsed goes back to Development (Live switches off, nothing deleted), and every other app pauses in Development, read-only, with exports still working, until a plan is active again; with no app ever live, the oldest app stays usable. A refused write answers app_paused with "This app is paused because your plan isn't active. Update your card in Stripe to keep building." The owner gets the apps_paused alert, and paying again restores everything at once.

Questions

I raised my Vercel spend amount. Why is the site still down?

Vercel doesn't unpause projects when you increase the spend amount. Resume each project in the dashboard or with POST /v1/projects/{projectId}/unpause.


Will robots.txt stop crawlers from using up my plan?

No. Reputable crawlers follow it, but it can't enforce anything. Use a WAF rate-limit or block rule on the routes that cost you usage.


Can I add a skip rule so Cloudflare Bot Fight Mode ignores /api?

No. Bot Fight Mode can't be skipped with WAF custom rules or Page Rules. Turn it off for that zone, or use Super Bot Fight Mode (Pro and above) with a Skip rule.


My free Render database disappeared after a month. Is the data gone?

Free Render Postgres databases expire 30 days after creation. You then have a 14-day grace period to upgrade before Render permanently deletes the database and its data.


Should I turn off pause-on-spend so production never goes down?

You are choosing between an outage and an unbounded bill. One middle ground is to keep alerts at 50% and 75%, set the cap above normal peak usage, and rate-limit the routes that crawlers hit.


Sources

Last reviewed 8 Nov 2026. What changed: 1 line(s) reworded. Checked against: vercel.com, vercel.com, vercel.com, vercel.com, docs.netlify.com, render.com, developers.cloudflare.com, developers.google.com. How we check this

← Back to the full report