Skip to content

Live on this page — the banner at the top is ours

Banners that make you money
on autopilot

Set it up once — in the dashboard or through your AI agent — and the banner runs itself.

2-minute setup · previewed on your own homepage

I have an agent? OpenClaw · ChatGPT · Hermes · Claude · Codex · Cursor · any MCP client

Free plan · No card

your agent · acme-store

add a Black Friday bar to acme.com — 30% off, make it sparkle

create_bannerschedule_sitecheck_install

Booked Nov 25 – 30. From here OfferBanner runs it: BFCM30 is created in your Stripe account before the window opens, and stops working on Nov 30.

One message in, one scheduled campaign out

Banners work. Running them is the chore.

Every promotion means a coupon code hardcoded in your codebase, a rebuild and a deploy — and after all that, no way to see how many people clicked. If you are a founder, this is the task that always loses to real work.

So we automated it.

components/PromoBar.tsx — every single promotion
  1. const CODE = 'SUMMER10';
  2. const CODE = 'BFCM30';
  3. const ENDS = "2026-07-31";
  4. const ENDS = "2026-11-30";

$ git commit -m "update banner"

$ vercel --prod

building… 2m 41s

clicks: unknown

Install one tag. Never touch your code again.

One script tag, once, before </body>. After that every promotion — the copy, the colours, the dates, the code, the schedule — is set in OfferBanner or asked for through your agent, and your site changes without a rebuild.

We run OfferBanner on this page.

The banner at the top of this page is our production embed: the same ~14KB script you would install. Open devtools and check the network tab. We use it on our own site, so we hit any problem before you do.

The banner running at the top of this page is not a mockup. It is served by the same embed.js snippet customers paste into their own sites, and it renders a real banner from a real OfferBanner site. Everything on it is set from our own dashboard: same product, same rules, no special cases.

Live — site demo
<script src="https://offerbanner.com/embed.js" data-banner="demo" async></script>
Size
~14KB gzipped
Loading
async, never blocks render
Isolation
shadow root
acme.com — schedule

November

1718192021222324252627282930
  • BLACK FRIDAYNov 25 – 27
  • CYBER MONDAYNov 30

Schedule campaigns in advance

Each site has a calendar. Every entry is a banner plus a date window: the banner goes live on the start date and stops on the end date, with no action from you. You can also limit an entry to a list of countries, so the same site can run one sale in the US and a different one in Germany.

acme.com — last 7 days
Views
18,402
Clicks
1,236
Redeemed
96

Code copies / day

See how each banner performs

Views, clicks, CTR and code copies, per banner and per site. Each figure shows its change against the previous window of the same length. The last figure, Redeemed, is read live from your own Stripe: the number of codes that were actually used at checkout, not the number copied.

Three steps. Then it runs itself.

  1. 01

    Paste your URL

    We take a screenshot of your homepage and show your banner on it, in your own colours and font. You see it on your own site before you install anything.

  2. 02

    Install one script tag

    One line before </body>, pasted once and never edited again. ~14KB, loaded async, isolated in a shadow root. Works on Next.js, WordPress, Webflow, Shopify, Framer and plain HTML.

  3. 03

    Change it whenever you want

    Schedule campaigns ahead, switch between holiday presets, rewrite the copy — from the dashboard, the API or your AI agent. Discount codes are created in your own Stripe account, and every campaign ends on its scheduled date.

An editor, real Stripe codes, analytics, and one script tag.

Colour
Preview
Launch week: 20% off your first three monthsClaim the code

An editor with a live preview

The preview renders what visitors will see, not an approximation: text, CTA label, CTA link, colours, size and position. Change the copy on a Friday afternoon and it is live in seconds — no build, no pull request, no waiting for a developer.

Created in your Stripe account

20% off, first 3 months

promotion_code · 100 redemptions

expires in ---:--:--

Your code

Discount codes created in your own Stripe account

Enter the discount you want. OfferBanner calls the Stripe API with your restricted key, creates a coupon and a matching promotion code, and shows that code in the banner with a one-tap copy button. The countdown runs to the code's real expiry date, so the deadline you show is the deadline Stripe enforces. You can also give every visitor their own single-use code, expiring a set number of hours after they claim it.

The key has write access to Coupons and Promotion Codes only. It cannot create charges, read customers or move payouts.

Code copies / day sample

Clicks, code copies and redemptions per banner

Every figure shows its change against the previous window of the same length. The last one is read from your Stripe: not how many people copied the code, but how many paid with it.

<script src="https://offerbanner.com/embed.js" data-banner="demo" async></script>

One line, before </body>.

A ~14KB script, isolated in a shadow root

Served from an edge CDN and loaded async, so it never blocks your rendering. Works on Next.js, WordPress, Webflow, Shopify, Framer and plain HTML. No npm install, no CSS conflicts.

The countdown ends when the code expires in Stripe.

A banner countdown is usually a cookie and a timer: clear the cookie and the deadline is gone. Here the deadline is set on the discount code itself, in your Stripe account, and OfferBanner will not save a banner that shows a different one.

How the deadline is enforced

  1. 01

    One code per visitor, created in your Stripe account

    Switch a banner to per-visitor and no codes are created up front. Each visitor who opens the gift gets their own code, created at that moment in your account with max_redemptions set to 1 — forced by the server, not read from the plan. A leaked per-visitor code has already been used, so it is worthless on a coupon site.

  2. 02

    An expiry counted from each visitor’s claim

    claimTtlHours gives each code its own lifetime: it stops working that many hours after the visitor claimed it, because those hours are written onto the Stripe promotion code. Their checkout rejects the code at the minute the countdown reached zero. A TTL can only shorten a code — one that would run past the campaign is clamped to the campaign’s end date.

  3. 03

    A countdown that does not match the code is rejected

    Ask for a 48-hour countdown on a code that lasts 24 hours and the write fails with countdown_ttl_mismatch — in the dashboard, in the API and in your agent’s tools. A countdown with no code expiry behind it is rejected the same way. The two numbers have to agree before a banner can be saved.

The countdown ends at the minute Stripe stops accepting the code.

Twenty-seven built-in effects, five ways to time when the banner appears.

Click one. The banner at the top of this page is live — watch it change.

27 effects in the editor today · 14 on Free · 13 with Pro

Gift reveal is the one effect you cannot try here. The visitor presses it and a real discount code is handed out, so it only runs in the editor, connected to your own Stripe account.

When the banner appears — four options besides immediately

  1. 01

    After a delay · Pro

    A whole number of seconds, from 1 to 120. The banner appears after the visitor has had time to look at the page.

  2. 02

    After scrolling · Pro

    A percentage of the page, from 10 to 100. Visitors who leave at the top never see the banner, so the view count only includes people who read some of the page.

  3. 03

    On exit intent · Pro

    The banner appears when the pointer moves towards the address bar. A touch screen has no pointer, so on those devices it falls back to appearing at 70% scrolled.

  4. 04

    On a click · Pro

    You give a CSS selector and the banner waits until that element is clicked — your pricing button, or your "get the deal" link.

What gets the code copied

  1. 01

    Countdown

    A real deadline, counted down in the banner. It uses the end date you set or the Stripe code's own expiry, and when it reaches zero it says the offer has ended instead of restarting.

  2. 02

    Final-hour pulse

    In the last hour the clock turns to the signal colour and pulses. It only appears when there is a real deadline behind it.

  3. 03

    Copy bounce

    The code chip bounces the moment it is copied, so the visitor can see that the copy worked.

  4. 04

    Gift reveal

    A badge the visitor presses to reveal a code. With reduced motion turned on, the badge still works: it appears without its pulse, and the code without the box animation.

Now see it on your own site.

Free plan · No card · 2-minute setup

Nil, the maker of OfferBanner

Heyo! It's Nil 👋

The guy who made OfferBanner

I run 20+ websites. One of them, makeform, has 60,000+ users. Running that many sites taught me two things the hard way.

One: promotions work. Every time a site runs one, conversion jumps — a good banner pays for itself in a weekend.

Two: running them is a part-time job. Twenty codebases, hardcoded coupon codes, one deploy to put a promotion up and another to take it down — and after all that, no idea which banner anyone clicked.

So I built myself a system: each site gets one script tag, once. After that I manage every banner by telling my AI agent what I want, and I can finally see the numbers — views, clicks and claims, per banner and per site. Codes are created in my own Stripe account, banners change on schedule, and every campaign ends on its end date.

The banner at the top of this page is running on it right now. If you would rather run promotions than manage them:

— Nilnilni.com

See it on your own site

Free plan · No card · About 2 minutes

Common questions

01Can my AI agent really run this?

Yes. OfferBanner is an MCP server. Point OpenClaw, ChatGPT, Hermes, Claude, Codex, Cursor or any other MCP client at https://offerbanner.com/mcp, approve it once in your browser, and your agent gets the same fifteen tools the dashboard uses: create sites and banners, schedule campaigns, create discount codes, read statistics. There is no API key to copy — you sign in in your browser, not in the chat.

02Do I need an agent to use OfferBanner?

No. The dashboard does everything an agent can do: paste your URL, pick a preset, paste one script tag. An agent is a faster way to work, not a requirement.

03Will it slow my site down?

No. It is about 14KB gzipped, served from an edge CDN close to your visitors and loaded async, so it never blocks rendering or parsing. It is smaller than a single hero image.

04Do I need Stripe to use OfferBanner?

No. The banner, the calendar, the effects and the statistics all work without a Stripe key. Stripe is only needed if you want OfferBanner to create real discount codes for you. You can connect a key later, or never.

05Is it safe to paste a Stripe key?

Yes. It is a restricted key that can only create coupons and promotion codes. It cannot charge anyone, read customers, move money or touch payouts. The worst a leaked key can do is create unused coupons in your account. Keys are encrypted at rest and never sent to the browser, and you can revoke one in two clicks; the banner keeps working without it.

06Do the discount codes actually work at checkout?

Yes. They are ordinary Stripe promotion codes in your own account, and they work in Stripe Checkout, Payment Links and the Billing portal like any code you create by hand. OfferBanner creates them; they live in your Stripe account.

07Does the code actually expire, or is that just a countdown?

It expires. A shared code is created in Stripe with the campaign’s end date on it, so it stops working when the banner comes down. A per-visitor code has its own expiry, counted from the moment that visitor claimed it: their checkout rejects it at exactly the minute the countdown reached zero. And a banner whose countdown does not match its code’s expiry cannot be saved — the dashboard and the agent tools both reject it.

08Will the banner break my layout?

No. It renders inside a shadow root, so your CSS cannot affect it and its styles cannot affect your page. Top banners push page content down. A sticky or fixed header ignores that and will slide under the banner when the visitor scrolls; we publish the banner’s height as a CSS variable, so one line fixes it: top: var(--offerbanner-height, 0px) on that header. Bottom banners float above the content and can be dismissed.

09Can I change a banner without redeploying?

Yes. The snippet fetches your current banner settings when it loads, so an edit in the dashboard is live everywhere the script is installed within seconds. Changing marketing copy is no longer a code change.

10What happens if I hit the Free plan limit?

Nothing is deleted, and nothing you built is lost. The Free plan gives you one banner showing at a time per site, with a small "Powered by OfferBanner" badge on it, so a second banner stays a draft until you pause the first. Your dates keep working: a campaign booked for a date window starts and stops on its own. A campaign aimed at particular countries is saved on your calendar and marked "Goes live with Pro" — it is the real booking, waiting. Pro is one payment of $49 that puts it on air and takes the badge off. There is no subscription to cancel and nothing renews.

The last banner on this page

Your next promotion can be live in about two minutes

One script tag. Real Stripe codes. Unmetered views. Free plan, no card required. Or let your AI agent set the whole thing up for you.

Create your first banner

Free plan · No card · 2-minute setup Compare the plans