Getting Shopify webhook to work with sanity but the function in the Netlify environment catches an error.
The error message is clear: your Sanity API token doesn't have sufficient permissions to create documents. The 403 Forbidden status with "permission 'create' required" means the token being used in your Netlify function lacks write access.
The Problem
Looking at the code in that repo, the function is trying to execute a transaction that creates/updates product documents:
client
.transaction()
.createIfNotExists(product)
.patch(data.id.toString(), patch => patch.set(product))
.commit()This requires a token with Editor permissions or a custom role that includes create/write permissions.
How to Fix It
1. Check Your Current Token Role
In your Netlify environment variables, you should have something like SANITY_API_TOKEN or similar. The token currently configured likely has Viewer (read-only) permissions.
2. Create a New Token with Write Permissions
According to the Sanity API tokens documentation, you need to create a robot token with appropriate permissions:
- Run
npx sanity@latest managefrom your project directory, or access Sanity Manage from your Studio menu - Navigate to the API tab
- Click Add API Token
- Give it a descriptive name (e.g., "Shopify Webhook - Production")
- Assign it the Editor role (or a custom role with create/update permissions)
- Copy the token immediately (you won't see it again)
3. Update Netlify Environment Variables
- Go to your Netlify site dashboard
- Navigate to Site settings → Environment variables
- Update the Sanity token variable with your new Editor token
- Redeploy your site (or trigger a function rebuild)
Security Best Practice
Since this token has write permissions, it should never be exposed in frontend code. In your case, it's correctly being used server-side in a Netlify function, which is the right approach. The function acts as a secure intermediary between Shopify webhooks and your Sanity project.
Debugging Tips
To verify the token is working:
- Check which token variable name the function expects - Look at how the Sanity client is initialized in the function to confirm the exact environment variable name
- Verify the environment variable is set in Netlify - Sometimes variables don't propagate correctly after updates
- Test locally first - Set the token in your local
.envfile and test the webhook locally using Shopify's webhook testing or a tool like ngrok - Check the token hasn't expired - Robot tokens don't expire by default, but personal tokens might
The token needs the Editor role at minimum because your transaction uses createIfNotExists() which requires create permissions. Once you've updated to a token with proper permissions, the webhook should work correctly.
Show original thread2 replies
Sanity – Build the way you think, not the way your CMS thinks
Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.