Hooks for document changes to trigger custom logic and automation

7 replies
Last updated: Mar 30, 2022
Hey, does anyone know if there is a way to hook into document content changes and run custom logic before/after they happen? For example, if a boolean field is changed on one document, I'd like to detect that change in a hook that allows me to automate the creation of another type of document?
AI Update

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:

  1. Listen to specific events - React when documents are created, updated, deleted, or published
  2. Filter which documents trigger your function - Use GROQ queries to only run logic for specific document types or conditions
  3. Access full document context - Read and write to your dataset with full Sanity API access
  4. 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

  1. Initialize a Blueprint (Sanity's infrastructure-as-code config):

    npx sanity@latest blueprints init
  2. Add a function:

    npx sanity@latest blueprints add function
  3. Deploy:

    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 thread
7 replies
Hey User. Yes it is! We have two options for achieving this:
1.
Custom document actions allow you to override the default Userdio actions (such as "publish"). This allows you to run any code you require in response to document changes made in the Userdio.2.
GROQ-powered webhooks can notify a web service when documents are created, updated, or deleted. This allows you to run any code you require in response to document changes made in the Userdio or the API.Both of these options will allow you to create a new document in response to the creation/update of a source document.
Thanks User, I've been playing around with document actions for modifying the document currently being edited, but not seen how to create a new document - would you mind pointing me in the direction of what you would do to create a new doc?
No problem! You can do this using the Sanity client, which allows you to interact with any document.
First, import the client:


import sanityClient from 'part:@sanity/base/client'
Then set the API version:


const client = sanityClient.withConfig({ apiVersion: '2022-03-30' })
Now you can use the client to perform actions.
Here are the docs for creating documents using the client .
Thanks so much for your help! I also need to react to document changes made via the API as well as the studio, so as you suggest I will use webhooks. However, do you know if there is a potential feature down the line to have hooks similar to webhooks, but where we can fire some custom logic locally within our studio code? Similar to strapi lifecycle hooks if you are familiar with those!
As you noted, you need a server that is always available to respond to changes. Sanity Userdio is purely a client-side app, so unfortunately there is no server running to respond to changes. Sanity's GROQ-powered webhooks and Strapi's Server Hooks are roughly analogous, with the only difference being that Sanity doesn't provide any abstraction for handling webhooks (although we do have a tool for verifying webhook requests ).
We've found Vercel to be a great option for bundling your Userdio and webhook handlers together in the same project. If you deploy to Vercel,
you can create an `api` directory inside your Userdio project to contain your webhook handlers .
Ah of course, I hadn't thought about studio being client-side only! Thanks again User
You're welcome 🙂. Let us know if we can help with anything else!

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.

Was this answer helpful?