Sanity logosanity.ioAll Systems Operational© Sanity 2026
Change Site Theme
Sanity logo

Documentation

    • Overview
    • Platform introduction
    • Next.js quickstart
    • Nuxt.js quickstart
    • Astro quickstart
    • React Router quickstart
    • Studio quickstart
    • Build with AI
    • Content Lake
    • Functions
    • APIs and SDKs
    • Agent Actions
    • Visual Editing
    • Blueprints
    • Platform management
    • Dashboard
    • Studio
    • Canvas
    • Media Library
    • App SDK
    • Content Agent
    • HTTP API
    • CLI
    • Libraries
    • Specifications
    • Changelog
    • User guides
    • Developer guides
    • Courses and certifications
    • Join the community
    • Templates
Studio
Overview

  • Setup and development

    Installation
    Project Structure
    Development
    Hosting and deployment
    Embedding Sanity Studio
    Upgrading Sanity Studio
    Environment Variables
    Using TypeScript in Sanity Studio
    Understanding the latest version of Sanity

  • Configuration

    Introduction
    Workspaces
    Schema and forms
    Conditional fields
    Field Groups
    List Previews
    Connected Content
    Validation
    Initial Value Templates
    Cross Dataset References
    Sort Orders
    Visual editing and preview
    Incoming reference decoration

  • Block Content (Portable Text)

    Introduction
    Configure the Portable Text Editor
    Customize the Portable Text Editor
    Create a Portable Text behavior plugin
    Add Portable Text Editor plugins to Studio
    Common patterns
    Standalone Portable Text Editor

  • Studio customization

    Introduction
    Custom component for Sanity Studio
    Custom authentication
    Custom asset sources
    Diff components
    Form Components
    How form paths work
    Icons
    Favicons
    Localizing Sanity Studio
    New Document Options
    Studio Components
    Studio search configuration
    Focus and UI state in custom inputs
    Real-time safe patches for input components
    Sanity UI
    Studio Tools
    Create a custom Studio tool
    Tools cheat sheet
    Theming

  • Workflows

    The Dashboard tool for Sanity Studio
    Add widgets to dashboard
    Document actions
    Release Actions
    Custom document badges
    Localization
    Content Releases Configuration
    Enable and configure Comments
    Configuring Tasks
    Scheduled drafts
    Scheduled publishing (deprecated)
    Manage notifications

  • Structure builder

    Introduction
    Get started with Structure Builder API
    Override default list views
    Create a link to a single edit page in your main document type list
    Manually group items in a pane
    Dynamically group list items with a GROQ filter
    Create custom document views with Structure Builder
    Cheat sheet
    Structure tool
    Reference

  • Plugins

    Introduction
    Installing and configuring plugins
    Developing plugins
    Publishing plugins
    Internationalizing plugins
    Reference
    Official plugins repo

  • AI Assist

    Installation
    Translation
    Custom field actions
    Field action patterns

  • User guides

    Comments
    Task
    Copy and paste fields
    Compare document versions
    Content Releases
    Scheduled drafts
    View incoming references
    Common keyboard shortcuts

  • Studio schema reference

    Studio schema configuration
    Array
    Block
    Boolean
    Cross Dataset Reference
    Date
    Datetime
    Document
    File
    Geopoint
    Global Document Reference
    Image
    Number
    Object
    Reference
    Slug
    Span
    String
    Text
    URL

  • Studio reference

    Asset Source
    Configuration
    Document
    Document Badges
    Document Actions
    Form
    Form Components
    Hooks
    Structure tool
    Studio Components Reference
    Tools
    Initial Value Templates
    Studio API reference

On this page

Previous

Scheduled drafts

Next

Manage notifications

Was this page helpful?

On this page

  • Features
  • Create and edit schedules directly from the document editor
  • View all your schedules with our dedicated tool
  • View schedule dates in any remote time zone
  • Getting started
  • Uninstall the Scheduled Publishing plugin
  • Add new configuration for Scheduled Publishing
  • Document actions and badges
  • Configure the document action
  • Configure the document badge
  • Frequently Asked Questions
  • What's the relationship between Schedules and my dataset?
  • Will scheduled documents with a validation errors publish?
StudioLast updated January 9, 2026

Scheduled publishing (deprecated)

Schedule your content for future publication and organize upcoming releases – no custom tasks or serverless functions required!

Scheduled publishing is deprecated

Scheduled publishing has been deprecated as of October 2025.

We recommend moving to Scheduled drafts for scheduling individual documents, or Content Releases for building coordinated releases.

Scheduled Publishing is not enabled by default. It can be enabled in the config by setting scheduledPublishing: { enabled: true }. Inversely, you can remove or disable the feature by setting enabled to false or removing the configuration setting.

Scheduled Publishing uses the Sanity Scheduling API which is available on Growth plans and above.

Loading...
Loading...

Features

Create and edit schedules directly from the document editor

  • Create and edit schedules for the document you're working on
  • See current schedule status and potential validation issues

View all your schedules with our dedicated tool

  • Filter all schedules by status or use the calendar to browse by date
  • Edit, delete, and immediately publish schedules
  • Automatically validate upcoming schedules, and identify issues before they're published
  • Easily identify who created a schedule

View schedule dates in any remote time zone

Loading...
  • Change the time zone you want to preview schedules in by clicking the 🌎 Time Zone button when visible. Great when you need to co-ordinate with a global team or want to time publication to specific regions.
  • Easily select time zones by city, time zone abbreviation or name search.
    • Selected time zones are automatically stored in your local storage for future use.

Getting started

If you are starting from scratch, skip the following section on uninstalling the plugin and cleaning up old configuration and jump directly to the next section on how to configure or disable Scheduled Publishing.

Uninstall the Scheduled Publishing plugin

If you are already using Scheduled Publishing plugin, the first step is to get rid of it and update your studio to the latest release. If you already updated your studio you might have gotten an alert about this.

Loading...

Run the following command in your project root to uninstall the plugin:

npm uninstall @sanity/scheduled-publishing

Next, remove the plugin from your studio configuration. Typically you'll find this in ./sanity.config.ts|js. Find and delete the following lines from your configuration:

import {scheduledPublishing} from '@sanity/scheduled-publishing'

export default defineConfig({
  // ...
  plugins: [
    scheduledPublishing()
  ],
})

Your plugin declaration might be a bit more expansive if you've defined a custom time format for the plugin. Delete it all!

import {scheduledPublishing} from '@sanity/scheduled-publishing'

export default defineConfig({
  // ...
  plugins: [
    scheduledPublishing({
      inputDateTimeFormat: 'MM/dd/yyyy h:mm a',
    }),
  ],
})

Protip

You might also have defined some custom document actions and badges to support Scheduled Publishing. You can keep these around, and they'll continue to work after migrating to the core studio functionality. Refer to the section on document actions and badges further on in this article.

Add new configuration for Scheduled Publishing

Note that while very similar to the plugin config this goes into the top-level of your studio configuration. Setting enabled to false will opt you out of using scheduled publishing for the project.

import {defineConfig} from 'sanity'

defineConfig({ 
  // ....
  scheduledPublishing: {
    enabled: true, 
    inputDateTimeFormat: 'MM/dd/yyyy h:mm a',
  }
)

As before, you can add a custom time format if you so wish. If left unspecified, the format will default to dd/MM/yyyy HH:mm.

Document actions and badges

You can further enhance your Scheduled Publishing experience with custom document actions and badges.

Configure the document action

This example assumes you've customized your document actions and would like to only show the Schedule button on movie documents only.

The Schedule document action allows users to both create and edit existing schedules directly from the form editor. It is added to all document types by the plugin, so you should remove it from types that should NOT have it.

import {defineConfig, ScheduleAction} from 'sanity'

export default defineConfig({
  // ...
  document: {
    actions: (previousActions, {schemaType}) => {
      /*
       * Please note that this will only alter the visibility of the button in the studio.
       * Users with document publish permissions will be able to create schedules directly
       * via the Scheduled Publishing API.
       */
      if (schemaType.name !== 'movie') {
        // Remove the schedule action from any documents that is not 'movie'.
        return previousActions.filter((action) => action !== ScheduleAction)
      }
      return previousActions
    },
  },
})

Note that ScheduleAction is now imported from the core sanity package.

Configure the document badge

This example assumes you've customized your own document badges and would like to only show the Scheduled badge on movie documents.

The Scheduled document badge indicates whether the current document is scheduled and, if so, when it will be published. It is added to all document types by the plugin, so you should remove it from types that should NOT have it.

import {defineConfig, ScheduledBadge} from 'sanity'

export default defineConfig({
  // ...

  document: {
    badges: (previousBadges, {schemaType}) => {
      if (schemaType.name !== 'movie') {
        // Remove the schedule badge from any documents that aren't 'movie'.
        return previousBadges.filter((badge) => badge !== ScheduledBadge)
      }
      return previousBadges
    },
  },
})

Note that ScheduleBadge is now imported from the core sanity package.

Frequently Asked Questions

What's the relationship between Schedules and my dataset?

Schedules sit adjacent to your dataset and can be managed using the Scheduling API (which this plugin does for you).

Schedules are a unique resource and are linked to, but do not exist within your Sanity project and dataset. It's important to understand the following behavior:

  • As schedules are not contained within a project’s dataset, you cannot query them via GROQ or GraphQL.
  • Deleting a dataset will immediately delete all schedules.
  • Deleting a project will immediately delete all schedules.
  • sanity dataset export will not include schedules and sanity dataset import does not support importing schedules.
  • Server-side copying of datasets does not include schedules.
  • When a project is disabled or blocked, all scheduled publishes will invariably fail as mutations will not be allowed on the dataset.

More information can be found in the Scheduling API article.

Will scheduled documents with a validation errors publish?

Yes. Documents scheduled to publish in future will do so, even if they contain validation errors. This also applies to scheduled documents that you manually opt to publish immediately via the tool.

  • Article
  • Changelog
Shows the Scheduled publishing interface in Sanity Studio
Shows a scheduled post being edited in Sanity Studio
Shows a modal dialog for selecting time zones
Shows an in-studio alert about the plugin deprecation
npm uninstall @sanity/scheduled-publishing
import {scheduledPublishing} from '@sanity/scheduled-publishing'

export default defineConfig({
  // ...
  plugins: [
    scheduledPublishing()
  ],
})
import {scheduledPublishing} from '@sanity/scheduled-publishing'

export default defineConfig({
  // ...
  plugins: [
    scheduledPublishing({
      inputDateTimeFormat: 'MM/dd/yyyy h:mm a',
    }),
  ],
})
import {defineConfig} from 'sanity'

defineConfig({ 
  // ....
  scheduledPublishing: {
    enabled: true, 
    inputDateTimeFormat: 'MM/dd/yyyy h:mm a',
  }
)
import {defineConfig, ScheduleAction} from 'sanity'

export default defineConfig({
  // ...
  document: {
    actions: (previousActions, {schemaType}) => {
      /*
       * Please note that this will only alter the visibility of the button in the studio.
       * Users with document publish permissions will be able to create schedules directly
       * via the Scheduled Publishing API.
       */
      if (schemaType.name !== 'movie') {
        // Remove the schedule action from any documents that is not 'movie'.
        return previousActions.filter((action) => action !== ScheduleAction)
      }
      return previousActions
    },
  },
})
import {defineConfig, ScheduledBadge} from 'sanity'

export default defineConfig({
  // ...

  document: {
    badges: (previousBadges, {schemaType}) => {
      if (schemaType.name !== 'movie') {
        // Remove the schedule badge from any documents that aren't 'movie'.
        return previousBadges.filter((badge) => badge !== ScheduledBadge)
      }
      return previousBadges
    },
  },
})