---
title: "Airdate Early-bird Price: setup guide"
description: Airdate Early-bird Price is a free HubSpot module. You type a full price and up to 6 early-bird tiers, each with the moment it ends.
---

[Skip to content](https://www.airdatethemes.com/airdate-early-bird-docs#main-content)

[![Northwind](https://www.airdatethemes.com/hs-fs/hubfs/airdate-demo/northwind-logo.png?width=600&height=192&name=northwind-logo.png "Northwind")](https://149405016.hs-sites-eu1.com/en/growth-sessions?hsLang=en)

- [Sessions](https://www.airdatethemes.com/en/growth-sessions#sessions)
- [Replays](https://www.airdatethemes.com/en/growth-sessions#replays)
- [Speakers](https://www.airdatethemes.com/en/growth-sessions#speakers)
- [FAQ](https://www.airdatethemes.com/en/growth-sessions#faq)

- [Sessions](https://www.airdatethemes.com/en/growth-sessions#sessions)
- [Replays](https://www.airdatethemes.com/en/growth-sessions#replays)
- [Speakers](https://www.airdatethemes.com/en/growth-sessions#speakers)
- [FAQ](https://www.airdatethemes.com/en/growth-sessions#faq)

[Save my seat](https://149405016.hs-sites-eu1.com/en/growth-sessions?hsLang=en#register)

Documentation

# Airdate Early-bird Price: setup guide

Airdate Early-bird Price is a free HubSpot module. You type a full price and up to 6 early-bird tiers, each with the moment it ends. Visitors see the price of the moment, the full price struck through, and how long the offer lasts in their own time zone. When a tier ends, the price switches by itself, even on a page that is already open.

It works on every HubSpot plan. No app to install, no account to create, no outside script.

**Important:** the module only shows a price. It does not change what your payment or registration tool charges. Set the same prices and the same end dates in your checkout. See "Limits" below.

## 1. Install and add the module

1. Install Airdate Early-bird Price from the HubSpot Template Marketplace.
2. Open a website page, landing page or blog post in the editor.
3. In the **Add** panel, search for **Airdate Early-bird Price** and drag it where you want the price.
4. Set the **Full price** and the **Currency**, give each row of **Early-bird tiers** a price and an **Ends at** date, set the **Button** link, then publish.

A new module comes with two sample tiers and no end dates. In the editor, tiers without a date get sample dates (10 days from today for the first row, 30 days for the second, and so on) so the block never looks empty. On the live page, a tier without a date is ignored: until you set the dates, visitors see the full price alone, and a yellow note in the editor says so.

## 2. Heading

- **Heading** and **Heading level** (H2, H3 or H4): the title above the price, "Conference pass" by default. Leave it empty to show none. Pick the level that fits the outline of your page.

## 3. Price

- **Full price**: the price once every early-bird tier has ended, such as `490`. Type the number only, without the currency sign.
- **Currency**: a three-letter code, such as `EUR`, `USD`, `GBP`, `CAD` or `CHF`. See "Currency and number format" below.
- **After the price**: a few words after the price, such as "per person" or "per year". Leave it empty to show none.

## 4. Early-bird tiers

One row per tier, up to 6. Type them in any order: the module sorts them by end date.

- **Tier name**: such as "Super early bird" or "Launch price". It is shown above the price while the tier is on, and in the tier list.
- **Price**: the price during this tier, a number without the currency sign. It must be lower than the full price, or the tier is ignored.
- **Ends at**: the date and time the tier ends. It is one exact moment: the price switches at that instant for every visitor, wherever they are.

With no row at all, the module shows the full price alone.

## 5. Show every tier

On by default. Under the price, a list shows every tier with its price and "until" its end date, then a last row "Full price" with "after" the end date of the last tier. Tiers that are over are struck through, and the tier of the moment has an accent edge and its name in the accent color. Once every tier has ended, the "Full price" row is the one marked.

Turn it off to show only the price of the moment, its tier name and the "ends" line.

## 6. Note and button

- **Note under the price**: one line in smaller text, such as "VAT included. Free cancellation up to 14 days before." Leave it empty to show none.
- **Button**: a **Button text** and a **Link** (an outside address, a page of your site or an email address), with the option to open it in a new tab. The button shows only when both the text and the link are set. Point it to your registration or payment page.

## 7. Texts

Every word the module adds is a field, in the **Texts** group. Write them in your page's language. In each one, `{n}` is replaced by a number, a time or a date:

- Ends in days ("Ends in {n} days"), Ends tomorrow ("Ends tomorrow, {n}", with the time), Ends today ("Ends today, {n}", with the time), Ends in hours ("Ends in {n} hours"), Ends in minutes ("Ends in {n} minutes"), and their singular forms ("Ends in 1 hour", "Ends in 1 minute");
- Tier end date ("until {n}") and Full price start ("after {n}"), used in the tier list;
- Full price row ("Full price"), the name of the last row of the list;
- Price of 0 ("Free");
- Struck price, for screen readers ("Full price"): the words read before the struck price;
- After the last tier ("Early-bird prices have ended.");
- Editor note for a tier without an end date.

Dates, times and amounts follow the language of the page.

## 8. Appearance

In the **Style** tab: accent (the tier name, the "ends" line and the current row of the list), text, secondary text (the struck price, "per person", dates and the note), background, border, button, button text, corner radius (0 to 32 px) and alignment (left or center). The module uses your theme's font.

## How the price of the moment is chosen

1. Tiers without a **Price** or without an **Ends at** date are left out on the live page. In the editor, a tier without a date gets a sample date.
2. Tiers whose price is not lower than the full price are left out.
3. The remaining tiers are sorted by end date.
4. The price shown is that of the first tier whose end moment has not passed. When every tier has ended, the full price shows alone, with the line "Early-bird prices have ended."

Tiers left out are hidden from the tier list too. While a tier is on, its name shows above the price and the full price is struck through next to it.

The module does not check that later tiers cost more than earlier ones: it takes the first tier to end, whatever its price. Type your tiers so each one costs less than the next.

## The "ends" line

Under the price, while a tier is on, one line says how long it lasts. It is worked out in the visitor's time zone:

- two calendar days away or more: "Ends in 12 days · March 1, 2031" (the number of days and the date);
- the next calendar day: "Ends tomorrow, 11:59 PM GMT+1" (the time, with the short name of the visitor's zone);
- the same day, 12 hours or more left: "Ends today, 11:59 PM GMT+1";
- the same day, less than 12 hours left: "Ends in 5 hours" (whole hours, rounded down);
- the same day, less than an hour left: "Ends in 19 minutes".

The day counts are calendar days: a tier that ends just after midnight reads "Ends tomorrow, 12:30 AM GMT+1" even when it is only a few hours away.

The price switches at the same instant for everyone, but each visitor reads that instant in their own zone. A tier ending on March 1 at 11:59 PM in Paris reads "until March 1" and "2:59 PM" for a visitor in Los Angeles, and "until March 2" and "11:59 AM" for a visitor in Auckland. The dates of the tier list follow the same rule.

The line is checked again every minute; above ten minutes it counts in steps of five, so screen readers only hear it when its words change, and the price switches at the exact end moment, so a page left open stays right. Cached pages stay right too: the price is worked out in the visitor's browser.

## Currency and number format

- Type a three-letter currency code. Lower case works too (`chf`).
- The format follows the language of the page: 490 EUR reads "€490" on an English page and "490 €" on a French one; CHF on a Swiss German page reads "CHF 290".
- Whole prices show without decimals. A price with cents shows two decimals.
- A price of 0 reads "Free" (a field of **Texts**).
- Any other three-letter code is shown as typed, placed as the language of the page places currencies, such as "XYZ 490" on an English page.
- Leave the field empty for a plain number with no currency sign.

## Without JavaScript

The price is written in the page itself. If a visitor's browser does not run JavaScript, or a search engine reads the page, the full price shows as typed, such as "490 EUR", with the heading, "per person", the note and the button. The tier list stays hidden until the script has sorted and dated it, so tiers that are over or not cheaper never show by mistake. Only the live parts are missing: the price of the moment, the struck price, the tier name above the price and the "ends" line. Search engines see the full price.

## Accessibility

- The struck full price is preceded by hidden words for screen readers, "Full price €490", so it is not read as a bare second number. The words are in **Texts**.
- In the tier list, the tier of the moment is marked as the current item for screen readers. Tiers that are over are struck through and dimmed, not shown by color alone.
- The "ends" line is a status region: screen readers can announce its changes without moving focus.
- The tier list is an ordered list.
- The button is at least 48 px high and has a visible focus outline in the accent color.
- The heading level is yours to choose, to fit the outline of the page.

## Limits

- **The price is display only.** The module does not change what your payment, ticketing or registration tool charges, and it does not know it. Set the same prices and the same end dates in your checkout, or visitors may see one price and pay another.
- The switch uses the clock of the visitor's device. A visitor whose clock is wrong sees the wrong tier. Your checkout is what decides the price actually paid.
- One price per module. For several passes or tickets, add one module per price.
- Up to 6 tiers per module.
- One currency per module. There is no conversion into the visitor's currency.
- No coupon codes, no seat count, no per-date prices.
- The prices are typed in the module. They are not synced with HubSpot products, payments or your CRM.

## FAQ

**Does it need Content Hub Pro?**  
No. It works on every HubSpot plan, including free.

**Does it work in emails?**  
No. It works in website pages, landing pages and blog pages (posts and listing).

**Will visitors pay the early-bird price?**  
Only if your payment or registration tool charges it. The module shows the price; your checkout sets it. Give both the same prices and dates.

**My page shows the full price only. Why?**  
Check that each tier has an **Ends at** date that has not passed, and a price lower than the **Full price**. In the editor, tiers without a date get sample dates, but on the live page they are ignored.

**Do I need to update the page when a tier ends?**  
No. The price, the struck price, the tier list and the "ends" line change by themselves at the end moment, even on a page that is already open.

**Can I translate the labels?**  
Yes. All texts are fields, in the **Texts** group. Dates, times and amounts follow the language of the page.

**Can I use it more than once on a page?**  
Yes. Each module has its own prices, tiers and settings.

## Texts in French, German and Spanish

Every word the module shows is a field. To use the module on a page in another language, open the module in the editor and paste these texts in the matching fields. Keep the words in braces, such as `{n}`, as they are: the module replaces them. Dates, times and numbers already follow the language of the page.

### French (Français)

| Field | Text to paste |
| --- | --- |
| After the price | par personne |
| Button text | Réserver mon pass |
| Ends in days ({n} = days) | Fin dans {n} jours |
| Ends tomorrow ({n} = time) | Fin demain à {n} |
| Ends today ({n} = time) | Fin aujourd’hui à {n} |
| Ends in hours ({n} = hours) | Fin dans {n} heures |
| Ends in minutes ({n} = minutes) | Fin dans {n} minutes |
| Tier end date ({n} = date) | jusqu’au {n} |
| Full price start ({n} = date) | après le {n} |
| Full price row | Plein tarif |
| Price of 0 | Gratuit |
| Struck price, for screen readers | Plein tarif |
| After the last tier | Les tarifs early bird sont terminés. |
| Ends in one hour | Fin dans 1 heure |
| Ends in one minute | Fin dans 1 minute |
| Editor note: tier without an end date | Un palier n’a pas de date de fin : il s’affiche ici avec une date d’exemple, mais pas sur la page publiée. Renseignez « Ends at » pour chaque palier. |

### German (Deutsch)

| Field | Text to paste |
| --- | --- |
| After the price | pro Person |
| Button text | Pass buchen |
| Ends in days ({n} = days) | Endet in {n} Tagen |
| Ends tomorrow ({n} = time) | Endet morgen um {n} |
| Ends today ({n} = time) | Endet heute um {n} |
| Ends in hours ({n} = hours) | Endet in {n} Stunden |
| Ends in minutes ({n} = minutes) | Endet in {n} Minuten |
| Tier end date ({n} = date) | bis {n} |
| Full price start ({n} = date) | nach dem {n} |
| Full price row | Normalpreis |
| Price of 0 | Kostenlos |
| Struck price, for screen readers | Normalpreis |
| After the last tier | Die Frühbucherpreise sind abgelaufen. |
| Ends in one hour | Endet in 1 Stunde |
| Ends in one minute | Endet in 1 Minute |
| Editor note: tier without an end date | Eine Preisstufe hat kein Enddatum: Sie erscheint hier mit einem Beispieldatum, aber nicht auf der Live-Seite. Legen Sie für jede Stufe „Ends at“ fest. |

### Spanish (Español)

| Field | Text to paste |
| --- | --- |
| After the price | por persona |
| Button text | Reservar mi pase |
| Ends in days ({n} = days) | Termina en {n} días |
| Ends tomorrow ({n} = time) | Termina mañana, {n} |
| Ends today ({n} = time) | Termina hoy, {n} |
| Ends in hours ({n} = hours) | Termina en {n} horas |
| Ends in minutes ({n} = minutes) | Termina en {n} minutos |
| Tier end date ({n} = date) | hasta el {n} |
| Full price start ({n} = date) | después del {n} |
| Full price row | Precio normal |
| Price of 0 | Gratis |
| Struck price, for screen readers | Precio normal |
| After the last tier | Los precios de reserva anticipada han finalizado. |
| Ends in one hour | Termina en 1 hora |
| Ends in one minute | Termina en 1 minuto |
| Editor note: tier without an end date | Un tramo no tiene fecha de fin: aparece aquí con una fecha de ejemplo, pero no en la página publicada. Indique «Ends at» en cada tramo. |

## Support

Questions or a bug? Email [support@airdatethemes.com](mailto:support@airdatethemes.com), in English or French. We answer within two business days.

## Going further

This module shows one price with its early-bird tiers. **Almanac**, our premium theme for organisations that run on dates, handles early-bird prices per programme and per date, each tied to its own cohort's deadline. Coming soon to the marketplace.

For recurring webinars, **Airdate Webinar** (199 $) shows the next session with a countdown, the agenda and the replays. [See it on the marketplace](https://ecosystem.hubspot.com/marketplace/website/airdate-webinar-theme-by-emilien-poinsot).

Three other free modules of ours, released one by one on the marketplace, work well beside it: **Airdate Add to Calendar**, so visitors save the date in their calendar; **Airdate Upcoming Dates**, to list the next dates of a course or event with seats left and registration deadlines; and **Airdate Event Schedule**, for the programme of the day, hour by hour.

[Follow us on Facebook](https://www.facebook.com/) [Follow us on LinkedIn](https://www.linkedin.com/) [Follow us on Twitter](https://www.twitter.com/) [Follow us on Instagram](https://www.instagram.com/)

© 2026 All rights reserved.