Tailored SubscriptionFREE

A newsletter CTA that asks before it asks for an address: subjects, then cadence, then the email, and the column swaps itself for a confirmation that reads back exactly what was chosen.

Cta92: Tailored Subscription

A newsletter CTA that asks before it asks for an address: subjects, then cadence, then the email. The column swaps itself for a confirmation that reads back exactly what was chosen.

Free block

This block is free. No license or account is required: install it with the CLI and use it in unlimited projects.

Installation

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/cta92"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/cta92"

That installs the block file, the badge6 eyebrow and button1 seal CTA it is built from, and the questionnaire primitive.

Quick start

tsx
import { Cta92, cta92Demo } from "@/components/beste/block/cta92";

export default function Page() {
  return <Cta92 {...cta92Demo} />;
}
tsx
import { Cta92 } from "@/components/beste/block/cta92";

export default function Page() {
  return (
    <Cta92
      badge={{ label: "Newsletter" }}
      meta="4,100 readers"
      heading="Subscribe to the parts you actually read"
      description="One list, three subjects, and a cadence you choose."
      promises={[
        {
          title: "You pick the subjects",
          description: "Anything you leave out is never sent.",
        },
        {
          title: "Leaving is one click",
          description: "The unsubscribe link sits at the top of every email.",
        },
      ]}
      image={{
        src: "https://images.unsplash.com/photo-1585241645927-c7a8e5840c42",
        alt: "Printed newsletter issues stacked on a desk",
      }}
      caption="Every issue is written, edited, and sent by the same two people."
      note="No sponsorships, and the list is never shared."
      button={{ label: "Read the last issue", href: "https://beste.co" }}
      shortcuts="numbers"
      topicsStep={{ title: "What should we send you?", description: "Pick as many as you like." }}
      topics={[
        { value: "notes", label: "Engineering notes", description: "What we changed." },
        { value: "design", label: "Design teardowns" },
      ]}
      cadenceStep={{ title: "How often is welcome?" }}
      cadences={[
        { value: "weekly", label: "Weekly", description: "Thursday mornings." },
        { value: "monthly", label: "Monthly" },
      ]}
      emailStep={{
        title: "Where should it arrive?",
        label: "Email address",
        placeholder: "you@company.com",
      }}
      labels={{ submit: "Confirm my subscription", confirmationTitle: "Check your inbox" }}
    />
  );
}

Props

PropTypeDefaultDescription
badgeBadgeEyebrow above the rule, rendered with Badge6.
metastringShort line beside the eyebrow, across the hairline divider.
headingstringSection heading.
descriptionstringSection description under the heading.
imageCoverImagePhotograph in the left column, at a fixed height.
captionstringLine under the photograph.
promisesPromiseItem[][]Bordered cells in a three-up row under both columns: what the subscription is and is not.
notestringMuted line under the promise cells.
topicsStepStepCopy for the first question. Omit it to drop the step.
topicsOption[][]Checkbox choices for the first question.
cadenceStepStepCopy for the second question. Omit it to drop the step.
cadencesOption[][]Radio choices for the second question.
emailStepEmailStepCopy and placeholder for the address step.
shortcuts"letters" | "numbers"Prints a shortcut on every choice of the active step.
buttonActionButtonButton1 seal CTA under the confirmation.
labelsCta92Labels{}Overrides for the buttons and the confirmation copy.
classNamestringMerged onto the section element.
ts
type Badge = { label: string };
type ActionButton = { label: string; href: string };
type CoverImage = { src: string; alt: string };

type PromiseItem = { title: string; description: string };
type Option = { value: string; label: string; description?: string };

type Step = { title: string; description?: string };
type EmailStep = Step & { label: string; placeholder?: string };

type Cta92Labels = {
  previous?: string;
  next?: string;
  submit?: string;
  restart?: string;
  confirmationTitle?: string;
  confirmationDescription?: string;
  topicsSummary?: string;
  cadenceSummary?: string;
  emailSummary?: string;
};

Behavior notes

More CTA blocks

View all CTA
PRO

cta65

Newsletter CTA

Split card with a subscribe form beside an image.

FREE

cta8

Centered Newsletter CTA

Minimal centered call-to-action with heading, description, and action buttons. Perfect for newsletter signups and conversion sections.

PRO

cta27

Pill Tags CTA

Call-to-action with scattered topic pills and tags showing what subscribers receive. Perfect for newsletter and content subscription sections.

PRO

cta31

Newsletter Preview CTA

Preview card showing a sample newsletter issue with subscribe call-to-action. Perfect for giving visitors a taste of content before subscribing.

PRO

cta9

Split Layout Newsletter CTA

Two-column call-to-action with decorative image on one side and feature list with action buttons on the other. Perfect for visually rich conversion sections.

PRO

cta26

Countdown CTA

Urgency-driven call-to-action with countdown numbers and limited-time offer messaging. Perfect for launches and time-sensitive promotions.