Staaarter

Billing Churn Prevention Offer

A retention prompt for the cancellation flow, showing a discounted price against the original, a short list of features the customer would keep, and two actions: claim the offer or continue canceling. Meant to sit as the first step of a cancel flow, before the actual cancellation confirmation.

By Staaarter Team
Billing
Updated May 6, 2026
Docs
Live preview

Docs

Installation

A real shadcn registry command, not a copy-paste stand-in: it fetches this block plus its badge, button dependencies and any missing npm packages, and installs them straight into your project.

npx shadcn add https://staaarter.com/r/billing-churn-prevention-offer.json

Prefer not to use the CLI? Copy the source from the Code toggle above into src/components/blocks/billing/billing34.tsx instead.

Usage

The file also exports billing34Demo, the exact props behind the preview above. Spread it to get a working section in one line, then replace it with your own data.

import { Billing34, billing34Demo } from "@/components/blocks/billing/billing34";

export default function Page() {
  return <Billing34 {...billing34Demo} />;
}

Props

PropTypeDefaultDescription
eyebrowstring"Limited-time offer"Small badge text above the heading.
headingstringnoneMain offer heading.
descriptionstringnoneSupporting text under the heading.
originalPricestringnonePreformatted original price, shown struck through next to the discounted price.
discountedPricestringnonePreformatted discounted price, shown large and first.
priceSuffixstring"/mo"Text appended after the discounted price, such as a billing period.
expiresLabelstringnoneOptional line under the price for an expiration note, omitted if not passed.
featuresstring[]noneFeature strings listed with check icons, meant to reinforce what the customer keeps.
claimLabelstring"Claim this offer"Label for the primary action.
claimHrefstringnoneDestination for the claim action, rendered as a next/link.
declineLabelstring"No thanks, continue to cancel"Label for the secondary action.
declineHrefstringnoneDestination for the decline action, rendered as a next/link.
classNamestringnoneExtra classes for the outer container.

Behavior notes

  • Both the claim and decline actions render as next/link, not buttons with onClick handlers, so wiring either one to apply a coupon or proceed with cancellation happens at the route or handler they point to.
  • The discount amount isn't computed by the component; originalPrice and discountedPrice are independent strings you calculate and format yourself.
  • expiresLabel is entirely optional and the layout doesn't reserve space for it, so omitting it just removes that line rather than leaving a gap.
  • The feature list has no built-in limit, but it's designed for a short, high-value set of items rather than a full feature comparison table.
  • There's no countdown timer or animation built in; the eyebrow badge and expiresLabel text are the only urgency cues.

Frequently asked questions