Browse the library
Blocks / Conversion
Offer banner
ProSeasonal offer for a local business on a warm ember panel: price with regular price, what is included, a live countdown, fine print, a claim button and an optional photo.
Source included with Facade Pro
You get the full TypeScript source (411 lines), installed straight into your project, yours to edit.
Unlock for $149"use client";
import * as React from "react";
import { OfferBanner } from "@/components/facade/offer-banner";
/** End of the current month at 11:59 pm, so the demo countdown is always running. */
function endOfMonth() {
const now = new Date();
return new Date(now.getFullYear(), now.getMonth() + 1, 0, 23, 59, 0);
}
export default function Demo() {
const end = React.useMemo(endOfMonth, []);
const day = end.toLocaleDateString("en-US", { month: "long", day: "numeric" });
return (
<OfferBanner
eyebrow="This month only"
title="Water heater flush and safety check"
price="$89"
regularPrice="$149"
priceNote={`through ${day}`}
description="Sediment shortens the life of a tank and raises your gas bill. We drain and flush it, test the relief valve and check the anode rod, in about an hour."
includes={["Full tank drain and flush", "Relief valve and burner test", "Anode rod check", "Written report with photos"]}
endsAt={end.toISOString()}
finePrint="Tank water heaters up to 80 gallons within our service area. Parts and repairs are quoted before any work starts. One visit per address, not combinable with other offers."
claimCta={{ label: "Book my $89 flush", href: "#book" }}
secondaryCta={{ label: "Call (512) 555-0193", href: "tel:+15125550193" }}
image={{
src: "https://images.unsplash.com/photo-1620653713380-7a34b773fef8?auto=format&fit=crop&w=1000&q=70",
alt: "Plumber tightening the supply line on a tank water heater",
width: 1000,
height: 900,
focus: "50% 30%",
}}
/>
);
}Installation
npx shadcn@latest add @facadeui/offer-bannerPro items install from the private @facadeui registry with your license key. Set it up once.
Usage
import { OfferBanner } from "@/components/facade/offer-banner";
export default function Page() {
return <OfferBanner />;
}Props
OfferBannerProps is exported, so you can extend or wrap it. Every prop has a default; <OfferBanner /> renders the example above.
| Prop | Type | Description |
|---|---|---|
| eyebrow | string | |
| title | string | |
| price | string | Offer price as shown, e.g. "$89". |
| regularPrice | string | Regular price, shown struck through next to the offer price. |
| priceNote | string | Small text after the price, e.g. "per system". |
| description | string | |
| includes | string[] | What the offer includes, shown as a short checklist. |
| endsAt | string | ISO date with offset ("2026-11-30T23:59:00-05:00"). Leave out to hide the countdown. |
| countdownLabel | string | |
| expiredText | string | Replaces the countdown and the claim button once the offer has ended. |
| finePrint | string | Terms, limits and exclusions. Keep them honest and complete. |
| claimCta | { label: string; href: string } | |
| onClaim | () => void | Called when the claim button is clicked. Use it for analytics or to open a booking dialog. |
| secondaryCta | { label: string; href: string } | |
| image | OfferBannerImage | Optional photo on the right (below the copy on phones). |
| palette | EmberPaletteInput | Surface colors. Defaults to "ember". |
| cycle | boolean | Cross-fade slowly between the presets. |
| className | string |
Ask your agent
With the Facade MCP server connected, this prompt is enough:
Add the Facade offer banner to this page and adapt the copy to our business.
FAQ
How do I install the offer banner?
Add the @facadeui registry with your license key to components.json once, then run npx shadcn@latest add @facadeui/offer-banner. The source lands in components/facade/offer-banner.tsx and you own it.
Is the offer banner free?
No, it is part of Facade Pro. One license is $149 one-time for one developer and covers unlimited client projects; Team is $399 for up to 10 developers.
Can I customize the offer banner?
Yes. It is plain React and Tailwind source in your project. Colors come from semantic tokens such as bg-brand, so your globals.css restyles it. 18 props are typed and exported as OfferBannerProps.