Novu Framework allows you to use Zod to define the Control and Payload schemas for your workflows.

Add Zod to your project


Install Zod Packages

npm install zod zod-to-json-schema

Novu requires the zod-to-json-schema package to generate JSON schemas from your Zod definitions.


Use Zod in your workflow

After installation, the Zod schemas can be used interchangeably with the controlSchema and payloadSchema options in your workflow definitions.

import { workflow } from '@novu/framework';
import { z } from 'zod';

export const testWorkflow = workflow('test-workflow', async ({ step, payload }) => {
    await'send-email', async (controls) => {
        return {
            subject: controls.subject,
            body: 'Hello, World!',
        controlSchema: z.object({
            subject: z.string().default('A test subject'),
}, {
    payloadSchema: z.object({
        userName: z.string(),

Controls and Payload UI

When you define a controlSchema for a step, Novu will automatically generate a UI for the controls in the workflow editor.

  • Form Input Title - Will be derived from the key of the Zod schema. Unfortunately Zod does not support custom titles at this point.
  • Form Input Type - Will be derived from the Zod schema type, with support for string, number, boolean, and enum and array types.
  • Default Value - Will be derived from the Zod schema default value.
  • Validation - Will be derived from the Zod schema validation rules, including min, max, email, url, regex and etc…