When I was pushing new code to my second Vercel account, I hit this error:
“We’re writing to notify you that a Deploy Hook attempted to deploy a commit from UseName to YourName’s projects on Vercel through GitHub, but they are not a member of the team.”
Or sometimes the shorter version:
“Git author must have access to the project on Vercel to create deployments.”
At first, I thought it was a simple permission issue, but it turned out to be a fundamental limitation of how Vercel handles multiple accounts. In this post, I’ll explain how I fixed it and how you can too.
The Problem
This error typically occurs when you have multiple Vercel accounts linked to the same GitHub account. Vercel’s GitHub integration can’t determine which account to authenticate against, so the deployment fails even though you have access to the project.
In my case, I had a personal Vercel account and a work account, both connected to my GitHub. When I pushed to my personal project, Vercel couldn’t figure out which account context to use for the deployment.
What Was Actually Happening
After digging through the Vercel docs and Stack Overflow threads, I found the root cause: Vercel couldn’t verify my Git author identity for the deployment.
Here’s what happens: When you push to a private repository, Vercel checks if the commit author (based on your Git email) matches a user with access to the Vercel project. In my case, I had multiple Vercel accounts, and the Git integration couldn’t properly authenticate which account context to use. The email mapping between Git, GitHub, and Vercel got confused, causing the deployment to fail.
The Fix That Actually Works
Forget the GitHub integration. Use deploy hooks instead.
In Vercel:
- Project Settings → Git → Deploy Hooks
- Create a hook for your branch
- Copy the webhook URL
In GitHub:
- Add the URL as a repository secret:
VERCEL_DEPLOY_HOOK_URL
- Create
.github/workflows/deploy.yml:
name: Deploy to Vercel
on:
push:
branches:
- main # Change this to your branch name
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Trigger Vercel Deployment
run: curl -X POST "$VERCEL_DEPLOY_HOOK_URL"
env:
VERCEL_DEPLOY_HOOK_URL: ${{ secrets.VERCEL_DEPLOY_HOOK_URL }}
That’s it. Push code, the webhook fires, and the deployment happens. No auth errors.
Pro Tip
If you're juggling multiple Vercel accounts or deploying client projects, use deploy hooks from the start. One webhook per project, no confusion about which account is active.
Why This Is Better Anyway
The default GitHub integration works great-until you have multiple Vercel accounts. Then it becomes a guessing game of which account Vercel thinks you’re authenticated with. Deploy hooks bypass this entirely.
No permission mapping. The webhook doesn’t care about Git commit emails or which Vercel account you’re “supposed” to be using. It just deploys.
You control when deployments happen. Add conditions, run tests first, make it manual with workflow_dispatch. Whatever you need.
It’s explicit. No mystery about what triggers a build. Just a simple HTTP POST when your workflow runs.
What I Tried First
Before finding this solution, I tried fixing the GitHub integration:
- Changed my commit email to match each Vercel account
- Added myself as a collaborator to my own project
- Recreated the project from scratch
- Tried different branch names
None of it worked because the root issue is Vercel’s identity mapping when you have multiple accounts. You can’t fix that from your end.
Test It Manually
Before setting up the workflow, test the webhook with curl:
curl -X POST "https://api.vercel.com/v1/integrations/deploy/prj_xxx/xxx"
If it works, you’ll get:
{"job":"deployment created successfully"}
This is way faster than making test commits to debug.
Security Note
Treat the webhook URL like a password. Anyone with it can trigger builds of your code. That's why we store it in GitHub secrets instead of committing it to the repo.
Useful Variations
Deploy after tests pass:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: npm test
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- run: curl -X POST "$VERCEL_DEPLOY_HOOK_URL"
env:
VERCEL_DEPLOY_HOOK_URL: ${{ secrets.VERCEL_DEPLOY_HOOK_URL }}
Manual deploys only:
on:
workflow_dispatch:
Then trigger it from Actions → Run workflow in GitHub.
Multiple environments:
on:
push:
branches: [main, staging]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- if: github.ref == 'refs/heads/main'
run: curl -X POST "$PROD_HOOK"
env:
PROD_HOOK: ${{ secrets.VERCEL_DEPLOY_HOOK_PROD }}
- if: github.ref == 'refs/heads/staging'
run: curl -X POST "$STAGING_HOOK"
env:
STAGING_HOOK: ${{ secrets.VERCEL_DEPLOY_HOOK_STAGING }}
One Downside
Deploy hooks don’t auto-delete old deployments like the GitHub integration does. They accumulate in your Vercel dashboard. Not a huge deal, but you’ll need to clean them up manually every few weeks.
Should You Do This?
If you’re hitting the “Git author must have access” error, yes. This fixes it immediately.
If the GitHub integration works fine for you, it’s probably not worth switching. But I’d still recommend understanding how deploy hooks work. It’s useful knowledge to have.
For new projects with multiple Vercel accounts? I’m starting with deploy hooks now. Simpler setup, more control, no auth headaches.
It took 10 minutes to set up. I haven’t had a single deployment issue since.
Stay up to date
Get notified when I publish something new, and unsubscribe at any time.
Comments
Nothing yet. Say the first thing.
Sign in to join the conversation.