Evergreen
Per-visitor evergreen. First touch starts the clock for that buyer.
trigger: first_visit
deadline: 72h
surface: checkout + emailThe countdown isn't theater. It's bound to a coupon's `expires_at` and a promo tier's window — so when zero hits, the next price resolves and the discount actually stops.
The same deadline renders on the checkout, on the marketing page, and inside the inbox. One source of truth, three surfaces.
The same resolve call returns price, coupon, seconds_remaining and a redirect — so the engine fits a Plandalf checkout, Stripe Checkout, Shopify, or a custom form.
Test the promo end-to-end with a stub timeline. Once it's live, the deadline takes care of itself.
Offer ends in
variant: clean
Offer ends in
variant: boxed
HURRY! Ends in
variant: urgent
Offer ends in
variant: minimal
Offer ends in
variant: neon
Offer ends in
variant: purple
Offer ends in
variant: light
Doors close in
variant: sunset
Early bird ends
variant: mint
Live now
variant: ocean
Offer ends in
variant: slate
Flash sale ends
variant: cherry
VIP pricing ends
variant: gold
Subscriptions close
variant: paper
> countdown.tick
variant: terminal
Pre-order ends in
variant: rose
Doors close at midnight
variant: midnight
Theme every variant down to color, font, and size. Same promo source — SVG on the web, animated GIF in email, both ticking the same deadline.
Bound to a participant record — survives incognito, devices, and cleared cookies.
Cookie-based. Resets on incognito, on a new device, or when the user clears storage.
When zero hits, the next price tier resolves. The checkout sells the new price.
Timer hits zero, banner hides, page still sells at the same price.
Same engine renders an animated GIF. Per-recipient deadline via merge tag.
Separate add-on or different SaaS — and the deadline drifts from the on-site one.
Seven named styles (clean, boxed, urgent, minimal, neon, purple, light) — theme-able to color, font, and size.
One or two templates with a logo swap. Anything else is a custom dev job.
Launch promo combines both — price moves on date AND on units sold.
One dimension only. Pick a clock or a counter.
Same resolve call returns price, coupon, and seconds_remaining — route to any checkout you already run.
Vendor-locked. Lives inside one funnel builder.
Real `expires_at` on the coupon. When the timer hits zero, the code stops working.
Timer expires, coupon stays redeemable for weeks. Customers learn to wait.
Rehearse the full promo — tier resolution, countdown, coupon — with a stub timeline before flipping live.
Hope it works. Refund the test charges later.
capabilities compared across checkout design, pricing, promos, testing, and embedding.
Categories are honest summaries of how templated countdown tools behave today. We don't name names — you've used them.
A timer without an Offer is a clock with nothing behind it. A great Plandalf setup pairs an Offer (the checkout your customer sees) with a Timer (the promo that resolves the price). One record in Plandalf, one source of truth, one deadline across every surface.
Don’t add a timer to an offer that doesn’t actually have a deadline. Customers notice fake urgency, and a fake countdown poisons the well for the real ones later. Use timers when the deadline is real and worth communicating.
Use case
Open enrollment for a week, close it cleanly, and redirect post-window traffic to a waitlist.
Guide
Stack an expiring coupon with a visible countdown and a promo banner. Test mode lets you rehearse before traffic shows up.
Guide
Embed a countdown GIF in the campaign — the same deadline that's enforced on the checkout.
The 10-step playbook for running a real launch window — sequencing the promo, the coupon, the email countdown, and the post-deadline redirect without any of them drifting out of sync.
Drives any checkout — Stripe Checkout, SamCart, Shopify, custom form. Deepest fit: Plandalf Timers + Plandalf Offers.
Returns price, coupon, seconds_remaining, spots_remaining.
Hosted page, bump, upsell, theme. Renders the resolved decision to the buyer.
Save offer reads the same live promo state — no second tool, no drift.
Per-visitor evergreen. First touch starts the clock for that buyer.
trigger: first_visit
deadline: 72h
surface: checkout + emailShort-window upsell right after opt-in. Great for the first hour.
trigger: subscribed
deadline: 60m
offer: one_timeOpen cart, close cart. Everyone sees the same launch window.
starts: launch_open
ends: launch_close
mode: sharedFixed window for everyone — Black Friday, day-of, weekend-only.
segment: warm_leads
deadline: 6h
coupon: FLASHEnds on quantity or time, whichever happens first.
limit: 50
deadline: 24h
end_when: eitherBring a lost buyer back with a deadline that follows the cart.
trigger: cart_left
deadline: 23h
channel: emailTimer opens and expires from the moment they watch.
trigger: video_75
deadline: 30m
surface: replayStarts when someone lands on a specific page or private link.
trigger: page_view
path: /private-offer
deadline: 48hA sitewide banner points every visitor to the campaign state.
surface: top_bar
deadline: shared
cta: /checkoutRecurring date range every year — summer, holiday, end-of-season.
season:
from: "06-01"
to: "08-31"Weekly or monthly rolling deadlines without manual resets.
cadence: weekly
cohort: signup_week
deadline: sundayMulti-tier launch waves for waitlists, partners, and VIP cohorts.
waves:
- vip
- waitlist
- publicOne resolve call. The engine returns price, coupon_code, seconds_remaining, spots_remaining, and an optional redirect_url.
Flash sale ends
One sitewide deadline. Coupon dies at the same second the banner does.
VIP pricing ends
First 100 get founding price. After that, deadline closes the door.
Offer ends in
First touch starts a 48-hour clock that survives incognito and new devices.
Doors close at midnight
Same deadline ticks in the inbox and on the checkout — to the second.






























// Resolve a promo for the current visitor.
// Survives incognito, new devices, cleared cookies.
const promo = await plandalf.promos.resolve('launch_cohort_03', {
participant: 'visitor_8f2c4a',
});
// {
// price: 'price_founding_249',
// coupon_code: 'EARLY100',
// seconds_remaining: 7423,
// redirect_url: null,
// tier: 'founding_member'
// }
// Same call resolves identically on the checkout,
// the landing page, and the email GIF generator.
Most templated tools have one promo type. Pick the matching Plandalf type — deadline, flash sale, early bird — and copy the deadline across.
One OAuth click. Coupons sync from your existing catalog so you don't lose attribution.
Pick one of the named variants or theme down to color, font, and size. This is the step that takes the longest — usually 20 minutes.
Drop the email GIF tag into your campaign. Webhooks update HubSpot, Klaviyo, or your CRM when a tier resolves.
Most teams have their first real promo live the same day. Nothing on the old tool stops working while you cut over.

Stock-aware early-bird tier — when the first 50 are gone, the price steps up automatically.

Coupon `expires_at` and the displayed countdown read the same record — they can't drift.

Animated GIF countdown in the campaign matches the banner on the checkout — to the second.
A deadline should change checkout behavior: coupon, price, redirect, quantity, save offer, or launch window. Keep the timer tied to the record that controls the offer.
Explore this stepUse embedded promos, email countdown GIFs, hosted landing pages, and checkout links from the same deadline state so the buyer sees one consistent campaign.
Explore this stepTimers works best when the resolved promo state lands in a Plandalf Offer with products, prices, coupons, order bumps, upsells, invoices, and automation.
Explore this stepCoupon expiration, usage limits, discount type, and deadline campaigns should live together so the promo cannot keep promising a price that checkout no longer honors.
Explore this stepWhen a timer expires, the resolved state can route into checkout, redirects, webhooks, automations, and sequences instead of stopping at a visual countdown.
Explore this stepUse the docs when a builder needs deadline campaigns, countdowns, coupon expiry, price tiers, and campaign state explained.
Create the promo record before wiring a launch window, flash sale, evergreen deadline, or expiring coupon into checkout.
Render the same deadline campaign on a site, app page, offer page, or checkout surface.
Use CTA links when the timer should move the buyer into a checkout, hosted landing page, or offer flow.
Use hosted landing pages when the campaign needs a deadline-aware page without rebuilding the whole site.
Use this stack to connect coupons, deadline campaigns, Offers, checkout behavior, email timers, and follow-up sequences.
Route the resolved promo state into Offers so products, prices, coupons, invoices, order bumps, and upsells stay aligned.
Compare Timers and Offers when the campaign needs both a deadline engine and a buying surface.