---
title: "Almanac theme documentation: setup guide"
description: "Setup guide for Almanac, the HubSpot theme for organisations that run on dates: catalogue, programmes, intakes, enrolment and events."
---

[Skip to content](https://www.airdatethemes.com/almanac-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

# Almanac: setup guide

Almanac is a HubSpot theme for organisations whose website runs on dates: training providers, certification bodies, academies, and teams that run workshops, info sessions and events. You enter each programme, its dates and your events once. The catalogue, programme pages, schedule, calendar, menus, enrolment forms and search engine data follow on their own, and past dates leave the site without anyone touching a page.

It works on every Content Hub plan (Starter, Pro, Enterprise). No HubDB table, no app, no custom object to set up.

## 1. Install and set the theme

1. Install Almanac from the HubSpot Template Marketplace.
2. Go to **Content \> Website pages \> Create**, pick **Almanac**, then a template (start with *Home: training provider*).
3. Open **Edit theme** to set your identity. Every block of the theme reads these settings: 
     - **Colors**: primary (buttons, links), highlight (marker behind key words, "closing soon" tags), text, page and soft backgrounds, dark sections, and the two status colors (open, closing soon).
     - **Fonts**: headings, body, and *Dates and figures* (a monospaced font for dates, prices and tables; pick your body font to turn the effect off).
     - **Layout**: content width, section spacing, corner radius, *Hairline rules* (the thin lines of the printed look) and *Subtle motion*.
     - **Header**: background, logo height, sticky header, menu font. **Footer**: colors.
4. Set your logo and favicon in **Settings \> Content \> Brand kit**: the header and footer logos use them.

## 2. The catalogue: enter everything once

Every Almanac page carries one global module, **Almanac: Catalogue (data)**. In the page editor, scroll to the bottom of the page, click the yellow *Almanac catalogue* note, then **Open in global content editor**. What you change there updates every page of the site.

### Programmes

- **Programme name**, **Programme key** (a short id used in links and forms; leave empty to build it from the name), **Programme page** (see section 3).
- **Category**, **Format** (online, in person, hybrid, self-paced) and **Level**: they drive the catalogue filters, the schedule filters and the programme menu. Type each category the same way everywhere.
- **Duration** (as visitors should read it), **Hours of teaching**, **Certificate**, **Prerequisites**, **Funding options**, **Summary**.
- **Price** (a number, without currency sign; 0 shows "Free", empty shows "Price on request"), **Early-bird price** and **Early-bird ends**: until that moment, the early-bird price is shown with the full price struck through, then the normal price comes back by itself.
- **Image** (optional, 16:10). Without one, the card shows a generated cover: pick its pattern in **Generated cover**.
- **Featured**: featured programmes can be shown alone (home page block) and are used first when a programme page is not linked yet.

### Dates of a programme

Each programme has its own list of **Dates**, one per run. Add them as far ahead as you like; you never need to delete past ones.

- **Starts** and **Ends** (leave *Ends* empty for a one-day date; the last day is shown as typed, in every time zone), **Enrolment deadline** (empty: enrolment closes when the date starts, or earlier with *Close enrolment before the start* in Settings).
- **Location** (a city, a campus or "Online": it feeds the location filter) and its **Time zone**. For in-person dates, pick the time zone of the place: visitors see the time as it is on site, with its zone. For online dates, leave *Visitor's time zone*: each visitor sees the time in their own zone.
- **Show the start time**: off by default (most programmes show days only).
- **Seats left**: update it as people enrol. Empty hides the count; 0 marks the date full.
- **Status**: *Automatic* works it out for you (table below). Pick another status to force it, for example *Waitlist*, or *Cancelled* to hide a date without deleting it. **Offer a waitlist when full** turns "Full" into "Join the waitlist".
- **Price for this date** and **Currency for this date** (if they differ: GBP in London, EUR in Berlin...), **Schedule** (e.g. Tue & Thu, 6–9 pm), **Language**, and **Booking link** for a date sold on another site.

### How statuses are worked out

| Status shown | When | Can visitors enrol? |
| --- | --- | --- |
| Open for enrolment | Before the deadline, with more seats than the "few seats" threshold | Yes |
| Enrolment closes in N days | The deadline is within the "closing soon" window (7 days by default) | Yes |
| N seats left | Seats left at or below the "few seats" threshold (5 by default) | Yes |
| Waitlist open | Status set to Waitlist, or full with "Offer a waitlist" | They join the waitlist |
| Full / Enrolment closed | 0 seats left / the deadline has passed | No |
| (hidden) | The date has started, ended or is cancelled | No |

Everything is computed in the visitor's browser each time a page opens. HubSpot caches pages, so anything computed on the server would go stale; with Almanac, a deadline that passed an hour ago is already closed on every page.

### Events

Info sessions, open days, webinars, workshops, conferences and meetups: title, type, start, duration, time zone, location, registration link (a page, an anchor such as `#register`, or your webinar tool's link), an optional **Programme key** to show the event on that programme's page, and an optional **Event page** built with the *Event* template. Past events leave the lists by themselves; during the event, the button becomes "Join now".

### Settings

- **Currency** (the default; each date can have its own) and **Date language** (dates follow the page language unless you force one).
- **Dates are typed in**: HubSpot stores date and time fields in the time zone of your HubSpot account. Choose *The local time of each date's time zone* and set **My HubSpot account's time zone**: you then type 6 pm for a 6 pm class in Toronto, even if your account is set to Paris. Recommended as soon as you teach in more than one time zone.
- **Enrolment page**: the page built with the *Enrolment* template. Enrol buttons outside a programme page open it with the chosen date.
- **Hidden form field** and, optionally, **Also fill** properties for the programme, the date (YYYY-MM-DD), the place and the request type (enrolment or waitlist), for lists and reports. **'Closing soon' starts**, **'Few seats left' from**, **Close enrolment before the start**.
- **Organisation name** and **Add course and event data for search engines** (section 8).
- **Programme index above the footer**: a plain list of every programme, on every page. It helps visitors and search engines, and feeds the programme menu.

### Words on the site

Every word Almanac writes for you ("Open for enrolment", "Next start", "Enrolment closes in {n} days"...) is a field of the catalogue, under **Words on the site**. `{n}` is replaced by a number or a date. On a multilingual site, translate them in each language version of this global content (see *Multilingual sites* below).

## 3. Programme pages

1. Create one page per programme with the **Programme** template (or **Programme landing page** for ads).
2. In the catalogue, set that page as the programme's **Programme page**. The header, facts, dates table, next date, tuition, sticky bar, enrolment form and Course data of the page now follow that programme.
3. Write the rest of the page as usual: overview, curriculum, instructors, testimonials, FAQ, syllabus download. Type the programme name in the header's **Heading** field too: search engines read it without running scripts.

A block can also show another programme: type its key in the block's **Programme key** field. Until a page is linked, its blocks show your first featured programme, and a yellow note in the editor reminds you to link it.

## 4. Enrolment and forms

1. In **Settings \> Properties**, create a contact property of type *Single-line text* with the internal name `chosen_date` (or another name, set in the catalogue settings).
2. Create your enrolment form and add that property as a **hidden field**. Forms from both HubSpot form editors are supported.
3. Pick the form in the **Almanac: Enrolment form** module (on the Programme and Enrolment templates). Visitors choose a date in the picker; the hidden field receives the programme, date and place, for example `Data Analysis with SQL and Python · 2027-02-01 · London [data-analysis-sql-python-2027-02-01-london]`. The day in that value is the day in the date's own time zone (UTC for online dates), so every contact of the same date gets exactly the same value, wherever they are.
4. Set the form to redirect to a page built with the **Enrolment thank-you** template. It shows the date just chosen with *Add to Google Calendar* and *.ics* buttons.
5. In a workflow triggered by the form, branch on `chosen_date` (contains "London", contains the programme key...) to send the right confirmation and add the contact to the right list.

Enrol buttons on a programme page scroll to the form and pick their date. Elsewhere they open the Enrolment page with `?date=` in the address, and the date is already selected. On the Enrolment page, nothing is selected until the visitor picks a date (the first line reads "Choose a date"), so nobody is sent a date by mistake; link to it with `?programme=data-analysis-sql-python` to preselect the next date of a programme. Waitlist requests are marked `· waitlist` in the hidden field.

### Workflow recipes

- **Confirmation by date**: trigger on the enrolment form, branch on the date property (or on `chosen_date` contains the date key), send the email of that date with its place and schedule.
- **Waitlist**: branch on the request type property (`waitlist`), add the contact to a waitlist list for that date, and notify an advisor.
- **Seats**: seats are a number you update in the catalogue. A weekly task for the owner of each date ("update seats left for London, March") keeps "3 seats left" honest.
- **Reminders**: a date property filled by the form lets a workflow send a reminder a week before the start ("Date property is 7 days from now").

## 5. Templates

- **Home**: three starting points. *Training provider* (next intakes board, featured programmes, dates, events, instructors), *Events and workshops* (calendar first) and *Academy* (dark opening, process, ways to pay).
- **Programme catalogue**: every programme with search, filters (category, format, level, location, start month) and sorting. Filters are kept in the address, so menus can link to a filtered view such as `/programmes?category=Leadership`.
- **Programme** and **Programme landing page** (no menu, for campaigns).
- **All dates** (month by month, with filters), **Calendar** (month view of starts and events, a list on phones; the month is kept in the address, e.g. `/calendar?month=2027-03`), **Events**, **Event** and **Event landing page** (no menu, for webinar and open-day campaigns).
- **Campus or city**: the dates and events of one place. The Schedule, Dates, Events, Calendar, Catalogue and Next intakes modules have an **Only this place** field: type a location exactly as in the catalogue (e.g. London).
- **Student stories**: long quotes, figures and a call to action.
- **Instructors or team**, **Profile**, **For organisations**, **Pricing and funding**, **About**, **Contact**, **Help centre**.
- **Enrolment** and **Enrolment thank-you**.
- **Landing page (no menu)** for a guide or brochure, and **Text page** for legal content.
- **Blog listing** (with topic filter) and **Blog post** (with the next open date under each post).
- System pages: 404 (with the next intakes, always current), 500, password prompt, search results, and the three email subscription pages.

## 6. Modules and sections

**Driven by the catalogue**: Programme catalogue, Programme header (or facts only), Programme dates, Schedule, Calendar, Next intakes board, Next date and deadline (with countdown), Enrolment form, Enrolment confirmation, Events, Event details, Tuition, Sticky enrol bar, Deadline notice (a slim bar announcing the soonest closing deadline by itself), Syllabus download.

**Content**: Hero (split, editorial, dark), Section heading, Image and text, Features (ruled grid, list, numbered), Figures, Call to action, Curriculum, People, Profile, Testimonials, FAQ (with FAQ data), Steps, Pricing, Comparison table, Tabs, Video (YouTube, Vimeo, MP4), Places, Latest posts, Form, Button, Social links, Menu.

Each module has a **Styles** tab. In the page editor, **Add \> Sections** lists 50 ready-made sections built from these modules. Section headings number themselves (01, 02...) in page order when their number is set to `auto`, so moving a section never breaks the sequence.

### Module reference

| Module | What it does |
| --- | --- |
| Button | A button or text link in the theme's style. |
| Calendar | A month calendar of programme starts and events, with previous and next month. Becomes a list on phones. |
| Catalogue (data) | Your programmes, their dates and your events, in one place. Edit it once: catalogue, programme pages, schedule, menus and forms follow. |
| Comparison table | A table that compares formats, plans or options row by row, with check marks. |
| Enrolment confirmation | Thank-you page block: the date just chosen, with Google Calendar and .ics buttons. |
| Call to action | A closing band with a heading, a short text, a button and a link, in dark, yellow or ruled style. |
| Curriculum | A programme syllabus as a list of units that open, with topics, outcomes and totals. |
| Programme dates | Every upcoming date of a programme (or of all of them) with place, seats, status, price and an Enrol button. |
| Syllabus download | A file (syllabus, brochure) offered after a short form, or directly. Returning visitors keep access. |
| Enrolment form | Your HubSpot form with a date picker. The chosen programme, date and place go into a hidden field of the form. |
| Event details | Top of an event page: date and time in the visitor's time zone, place, countdown, registration and calendar buttons, from the catalogue. |
| Events | Upcoming info sessions, open days, webinars and workshops from the catalogue. Past events leave by themselves. |
| FAQ | Questions and answers that open one by one, with optional groups and FAQ data for search engines. |
| Features | A set of short points with icons or numbers, as a ruled grid, a two-column list or numbered steps. |
| Form | A HubSpot form in a framed box, with a heading, an intro and a note on what happens next. |
| Section heading | A numbered section intro with kicker, heading, short text and an optional link, placed above a block. |
| Hero | The opening of a page: kicker, a large heading, a lead, buttons and an image or a list of key facts. |
| Next intakes board | The next dates open for enrolment across your programmes, like a departure board. Updates itself. |
| Locations | Campuses or offices in ruled columns: address, hours, contact details and a map link. |
| Logos | Partner, accreditation or client logos in a ruled grid, in their own colors. |
| Media and text | An image beside a heading, text and button. Without an image it shows a large figure on a ruled panel. |
| Menu | A HubSpot menu with dropdowns, wide panels and a programme panel that fills itself from your catalogue. |
| Next date and deadline | The next open date of a programme (or of any programme) with a countdown to its enrolment deadline. |
| Deadline notice | A slim bar that announces the next closing enrolment deadline by itself, or your own message. |
| People | Instructors or team members in a grid or a list, with a drawn portrait when there is no photo. |
| Person | The header of a profile page: portrait, name, role, bio, key facts and links. |
| Recent posts | The latest posts of a blog, optionally filtered by tag, as ruled rows or a grid. |
| Pricing | Plans or ways to pay side by side, with one plan highlighted. |
| Programme header | Top of a programme page: title, next date, price, format and every fact, from the catalogue. Can also show only the facts. |
| Programme catalogue | Every programme with its next date, price and status, with filters and sorting. Fills itself from the catalogue. |
| Schedule | Every upcoming date of every programme, month by month, with filters. Fills itself from the catalogue. |
| Social links | Icons linking to your social profiles. |
| Stats | Large figures with a label and a source line, side by side or one per row. |
| Steps | A process or admission timeline with numbered steps, in columns or down a line. |
| Sticky enrol bar | A slim bar at the bottom of the screen on programme pages: name, next date, price and Enrol. Hides when the form is on screen. |
| Tabs | Content split into tabs that visitors switch with a click or the arrow keys. |
| Testimonials | Student quotes as large feature quotes or in columns, with author, role and programme. |
| Tuition | Price of the programme with its early-bird price (which ends by itself), what is included and how to pay. |
| Video | A YouTube, Vimeo or MP4 video with a caption, in the right proportions. |

## 7. Menus

- **Header menu**: items with sub-items open a panel; sub-items that have their own sub-items become columns. Name a top-level item *Programmes* (or set another label in the menu module's **Programmes item**) and its panel lists every programme by category, with its next start date, by itself.
- **Footer menu**: top-level items become column titles. **Legal links**: one line.
- Menus are edited in **Settings \> Content \> Navigation**.

## 8. Search engines

- Programme pages get schema.org `Course` data with one `CourseInstance` per upcoming date (mode, dates, place, price, availability). The catalogue gets an `ItemList` of courses. Event lists and event pages get `Event` data. Turn it off in the catalogue settings if another tool already adds it.
- The FAQ module adds `FAQPage` data (a switch in the module).
- Structured data is added in the browser, like the dates: Google reads it (it runs scripts); some other tools do not. Check your pages with Google's Rich Results Test.

## 9. Good to know

- **Time zones**: by default, HubSpot's date and time fields use the time zone of your HubSpot account. Switch *Dates are typed in* to local time (section 2) to type every date in its own city's time.
- **A programme page shows another programme**: the page is not set as the *Programme page* of any programme in the catalogue yet, so it shows your first featured programme (a yellow note says so in the editor).
- **The hidden field stays empty**: check that the form has a hidden field whose internal name matches the catalogue setting, and that a date is selected in the picker.
- **A deadline passed but the date still shows "Open"**: the page shows the status at the moment it was opened; it updates every minute and at each visit. Check the *Enrolment deadline* and the time zone settings.
- **A date does not show**: it has started, ended, or its status is Cancelled. Programme pages show upcoming dates only; the Schedule module can be limited to a number of months ahead.
- **Content Hub Starter** limits the number of pages of a site: use programme cards linking to a booking page (*Booking link*) for programmes without their own page.
- **Without JavaScript**, pages still show their text, the programme index and the forms; the live parts (dates, statuses, prices) need JavaScript, like every date on a cached page.
- Almanac adds no cookie and loads no library: one script and one stylesheet, plus a small stylesheet per module used on the page.

## Multilingual sites

Dates, times and prices follow the language of each page. The words Almanac writes are fields of the catalogue (*Words on the site*) and of each module, so each language version of a page can have its own. Programme names and summaries are typed once in the catalogue: if your site is in several languages, give each language its own programme pages and link them in the catalogue of that language.

## Versions

- **1.0**: first release.

## Support

Write to [support@airdatethemes.com](mailto:support@airdatethemes.com) (English or French). We answer within two working days, and ship fixes as theme updates that install without touching your content.

[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.