Hooks for document changes to trigger custom logic and automation
Yes! Sanity provides exactly what you're looking for through Sanity Functions - a serverless compute environment that lets you hook into document content changes and run custom logic in response to those events.
How it works
Sanity Functions allow you to create event-driven workflows that react to document changes (create, update, delete, publish, etc.). You can:
- Listen to specific events - React when documents are created, updated, deleted, or published
- Filter which documents trigger your function - Use GROQ queries to only run logic for specific document types or conditions
- Access full document context - Read and write to your dataset with full Sanity API access
- Automate document creation - Create new documents based on changes to other documents
Your use case: Boolean field triggers new document creation
Here's how you'd implement your specific scenario:
Example: When a boolean field changes on a document, automatically create another document
// functions/auto-create-doc/index.ts
import { type DocumentEventHandler } from "@sanity/functions";
import { createClient } from "@sanity/client";
interface MyDocData {
_id: string;
myBooleanField: boolean;
}
export const handler: DocumentEventHandler<MyDocData> = async ({
context,
event,
}) => {
const client = createClient({
...context.clientOptions,
apiVersion: "2025-01-01",
});
// Check if the boolean field was changed to true
if (event.data.myBooleanField === true) {
// Create a new document of another type
await client.create({
_type: 'anotherDocumentType',
title: `Auto-created from ${event.data._id}`,
sourceDocument: {
_type: 'reference',
_ref: event.data._id
},
createdAt: new Date().toISOString()
});
console.log(`Created new document triggered by ${event.data._id}`);
}
};Configure your function in blueprint.json:
{
"blueprintVersion": "2024-10-01",
"resources": [
{
"displayName": "auto-create-on-boolean-change",
"name": "auto-create-doc",
"src": "functions/auto-create-doc",
"type": "sanity.function.document",
"event": {
"on": ["update", "publish"],
"filter": "_type == 'myDocType' && defined(myBooleanField)",
"projection": "{_id, myBooleanField}"
}
}
]
}Getting started
Initialize a Blueprint (Sanity's infrastructure-as-code config):
npx sanity@latest blueprints initAdd a function:
npx sanity@latest blueprints add functionDeploy:
npx sanity@latest blueprints deploy
Why Functions over Webhooks?
While webhooks are also available, Sanity Functions are the modern, recommended approach because they:
- Run natively within Sanity (no external hosting needed)
- Have built-in access to your Sanity client and dataset
- Scale automatically
- Are easier to set up and maintain
- Have better security (no need to expose public endpoints)
Check out the complete guide in the blog post and official documentation for more details!
Show original thread7 replies
Was this answer helpful?
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.