JSTAcademy
0 XP
Dashboard
Crash Courses
Hooks
10 min
Masters+175 XP
Crash Courses · Masters

Hooks

Automate logic with Payload lifecycle hooks — before/after operations.
10 min read+175 XP on completionCert: Payload CMS Crash Course
Tap any word in the text below to start reading from there.

Hooks

Hooks are Payload's automation layer — they run before or after database operations and can modify data, trigger side effects, or cancel operations.

Auto-generate Slug

// collections/Posts.ts
import type { CollectionConfig } from 'payload'
import slugify from 'slugify'

export const Posts: CollectionConfig = {
  slug: 'posts',
  hooks: {
    beforeChange: [
      async ({ data, operation }) => {
        if (operation === 'create' && data.title) {
          data.slug = slugify(data.title, { lower: true, strict: true })
        }
        return data
      },
    ],
  },
  // ...
}

After Create: Send Welcome Email

hooks: {
  afterChange: [
    async ({ doc, operation, req }) => {
      if (operation === 'create') {
        await sendWelcomeEmail(doc.email, doc.displayName)
      }
      return doc
    },
  ],
},

beforeRead: Transform Data

hooks: {
  beforeRead: [
    ({ doc }) => {
      return {
        ...doc,
        // Add computed field
        fullName: `${doc.firstName} ${doc.lastName}`,
        // Mask sensitive data
        email: doc.email?.replace(/(.)(.*)(@.*)/, (_, f, m, e) => f + '*'.repeat(m.length) + e),
      }
    },
  ],
},

Field Hook

{
  name: 'password',
  type: 'text',
  hooks: {
    beforeChange: [
      async ({ value }) => {
        if (!value) return value
        return hashPassword(value)  // hash before saving
      },
    ],
    afterRead: [
      () => undefined,  // never return the hash
    ],
  },
}
0%