Documentation
Page blocksCall to action

Call To Action Signup

An email-capture call-to-action block — heading, copy, and a form that posts to a same-origin endpoint.

v0.1.0Page blockCall to action familyEmail capture
import type { Block } from 'payload'import { callToActionFields } from '@/blocks/shared/callToActionFields'import { validateSameOriginFormAction } from '@/blocks/shared/safeUrls'export const CallToActionSignup: Block = {  slug: 'callToActionSignup',  interfaceName: 'CallToActionSignupBlock',  fields: [    // Shared call-to-action core (title, description). Variant-specific fields    // follow; edit the shared shape in @/blocks/shared/callToActionFields.    ...callToActionFields,    {      name: 'emailPlaceholder',      type: 'text',    },    {      name: 'submitLabel',      type: 'text',    },    {      name: 'action',      type: 'text',      validate: validateSameOriginFormAction,      admin: {        description: 'Same-origin path where the email form posts, such as /api/newsletter.',      },    },  ],  labels: {    plural: 'Call To Action Signup Blocks',    singular: 'Call To Action Signup',  },}

Installation

npx payload-components add call-to-action-signup

Copy the files straight from the registry, then wire the Payload fragments by hand:

pnpm dlx shadcn@latest add https://www.payload-components.xyz/r/call-to-action-signup.json

What it installs

Copies 4 source files into your project:

  • src/blocks/shared/callToActionFields.tsshared
  • src/blocks/shared/safeUrls.ts
  • src/blocks/CallToActionSignup/config.ts
  • src/blocks/CallToActionSignup/Component.tsx

…and makes 4 edits to wire the block into your project:

Registers the blocksrc/collections/Pages/index.ts
Maps the renderersrc/blocks/RenderBlocks.tsx
Regenerates typessrc/payload-types.ts
Regenerates the admin import mapsrc/app/(payload)/admin/importMap.js
callToActionFields.ts is the shared field core for this family — every variant composes it. Editing it updates each installed block at once, and re-running an install never overwrites a copy you have changed.

Re-running the install converges: it detects existing wiring, skips it, and records install state in .payload-components/state.json.

This variant also installs the shadcn button component and adds lucide-react for the form's mail and send icons. The form is server-rendered — set action to a same-origin handler such as /api/newsletter.

Content model

title and description come from the shared callToActionFields base; the form fields are specific to this variant.

Prop

Type

Usage

Add the block to a page. In the Payload admin, open (or create) a Page and add the CallToActionSignup block to its layout.
Fill the content. Complete the fields from the content model above — the component ships sample content you can start from.
Publish. Save and publish the page; the block renders through RenderBlocks on the frontend, fully typed — no extra wiring.

Requirements

Target
payload-website-starter
Payload
v3
Next.js
15 / 16
shadcn UI
button

Your project must already expose components.json, src/payload.config.ts, src/blocks/RenderBlocks.tsx, src/collections/Pages/index.ts — the surfaces payload-components add patches. The CLI verifies this against the support matrix before touching anything.

In this family