DEV Community

APIBuilderHQ
APIBuilderHQ

Posted on

Vercel Silently Blocked Every Deployment — How I Fixed It with a Deploy Hook

I pushed to GitHub. The build passed. Nothing deployed.

No error in the terminal. No failed build notification in Vercel. No red banner, no warning email, nothing. I checked the Vercel dashboard and my latest commit just wasn't there. The previous deployment was still live, serving old code.

So I pushed again. Same result. Clean build locally, successful push to GitHub, and the live site sitting there unchanged like I hadn't done anything.

This went on for longer than I'd like to admit.

What I Tried That Didn't Work

My first assumption was a caching issue. Vercel's CDN can serve stale content, so I went to Vercel → CDN → Caches → Purge All. Cleared the CDN cache, the ISR cache, the image cache. Forced a new commit:

git commit --allow-empty -m "force: fresh deploy" && git push
Enter fullscreen mode Exit fullscreen mode

Nothing. The deployment simply didn't appear. I tried redeploying from the Vercel dashboard manually — clicked "Redeploy" with "Use existing Build Cache" unchecked. That worked. But the next time I pushed from my terminal, same silence. The push would succeed on GitHub's end. Vercel just wouldn't pick it up.

I spent a full evening convinced the problem was in my Next.js config, then in my branch settings, then in some Vercel webhook I must have broken. None of these were the issue.

The Actual Cause

The problem was a git identity mismatch.

When you connect a GitHub repo to Vercel, Vercel tracks which git identities are authorized to trigger deployments. My Vercel project was originally created under one GitHub identity. But over the course of the project, I'd changed my git username and email — first for privacy reasons, then again when I set up a dedicated dev account. The commits were now coming from an identity Vercel didn't recognize.

Vercel's response to this was completely silent. No "committer does not have contributing access" error surfaced in my terminal. The git push succeeded because GitHub accepted the commit just fine — it's Vercel's deployment trigger that rejected it, and that rejection happened on Vercel's side with no feedback to me.

This is the part that cost me hours: the push worked. The build would have passed. The deployment just never started. There was no signal that anything was wrong unless you went to the Vercel dashboard and noticed the latest deployment was from three pushes ago.

The Fix

The solution is a Vercel Deploy Hook — a URL that triggers a deployment directly, bypassing the git identity check entirely.

To create one: Vercel → your project → Settings → Git → Deploy Hooks. Name it something like main-deploy, point it at your main branch, and save. Vercel gives you a unique URL.

Now instead of relying on Vercel's automatic git-triggered deployments, you trigger it manually:

curl -X POST "https://api.vercel.com/v1/integrations/deploy/your-unique-hook-id"
Enter fullscreen mode Exit fullscreen mode

That's it. The deployment starts immediately, using the latest code on your main branch. It doesn't care what git identity made the commit.

Important: Treat this URL like a secret. Anyone with it can trigger a deployment of your project. Save it somewhere secure — not in your codebase, not in a public doc.

What I Do Now

Every single deployment follows this exact sequence:

# 1. Build locally — must pass with zero errors
npm run build

# 2. Test locally
npm run dev

# 3. Add specific files — never assume they're tracked
git add [specific files]

# 4. Verify files are actually in git
git ls-tree -r HEAD --name-only

# 5. Commit and push
git commit -m "description" && git push

# 6. Trigger Vercel deployment manually
curl -X POST "your-deploy-hook-url"

# 7. Wait 90 seconds, then test on production
Enter fullscreen mode Exit fullscreen mode

Step 4 exists because I also learned — separately and painfully — that files can exist on your local disk but never be committed to git. The build passes locally because the file is there. Vercel 404s because the file isn't in the repo. git ls-tree -r HEAD --name-only shows you exactly what's tracked. If your new file isn't in that list, it's not going to production.

I've run this exact sequence for every deployment since. The deploy hook has never failed. The silence has never returned.


This happened while building APIBuilderHQ, a browser-based API client I shipped in 5 weekends. If you've hit the same Vercel issue, I hope this saves you the evening I lost.

Top comments (0)