Run a promotion end to end
A promotion on altapac.com is several separate records that the theme ties together. Stock Maropost gives you the product promo price and the content pages. The theme adds the links between them: it matches products to a promotion page by a code, works out the promotion’s end date from a number of days, and shows extra promo images and banners on product pages.
None of these links raise an error when they are wrong. A typo in the code, an empty field or an unassigned product just makes something quietly not appear. Use this page whenever you start, change or end a promotion.
| Part | Where you set it | What it controls |
|---|---|---|
| Product promo pricing | Each product (standard Maropost promo fields) | Whether the product is “on promotion”, the sale price, the countdown, and the “Valid until” date on the product banner |
| Promotion page | Content page of type Promotions | The landing page, its card on /promotions, and the banner on product pages |
| Product assignment | Each product, assigned to the promotion page | Which products get the banner, and which products the page lists |
| Promo image | Product custom fields Product Header Promo Image Zone and Product Header Promo Link | A small image on the product page while it is on promotion |
| Home page news slide | Advert in the home_news group | The rotating news strip at the top of the home page |
How promotion dates work
The promotion page has no end-date field. The theme works out the end from two fields:
- Date Posted is the start date.
- Label 3 is the length in whole days.
The /promotions list compares dates only, not times. A promotion is shown as valid from the Date Posted day through Date Posted + Label 3 − 1 days. On day Date Posted + Label 3 it turns “Expired”.
Worked example: Date Posted is 1 November and Label 3 is 30.
| Today | Card on /promotions shows |
|---|---|
| Up to 31 October | Starts 1 November |
| 1 to 30 November | Valid 1 November - 1 December |
| From 1 December | Expired (in red) |
The end date printed on the card, and in the “Promotion Period” line on the promotions page layout, is Date Posted + Label 3. That is the day the promotion stops, not its last day. In the example the last valid day is 30 November but the card says 1 December.
The product side is separate. A product’s sale price, countdown and “Valid until” date come from that product’s own promo start and end dates, not from the promotion page. Nothing keeps the two in step, so set them deliberately (step 1).
Set up a promotion
1. Set the promo pricing on each product
Set the promo price, start date, end date and promotion code on each product using Maropost’s standard product promo fields, or a product import.
- Promo price must be above $0. If a product is on promotion with a promo price of $0 or blank, its page shows “Contact us for price” and an “Enquire about this product” button instead of Add to Cart.
- Promotion code: use one code for the whole promotion and write it down. You will type the same code into the promotion page’s Label 1 in step 2.
- Dates (recommended): start at 12:00 am on the Date Posted day, and end at 12:00 am on the day the card will turn Expired (Date Posted + Label 3). The product page countdown subtracts one minute from the end time, so it reads 11:59 pm on the last valid day (not live yet, AUD-50; today it reads 23:59 pm), matching the
/promotionscard.
2. Create the promotion page
- In Content, add a new page of type Promotions.
- Name: the offer, for example “20% Off Rhino-Rack Through November”. It is the page heading, the card heading on
/promotionsand the heading of the product-page banner. - Date Posted: the first day of the promotion. Always set it.
- Label 1: the promotion code from step 1, typed exactly as it is on the products.
- Label 3: the number of days, as a whole number (for example
30). Never leave it empty. - Short Description 1: one or two plain sentences. This is the text on the
/promotionscard. - Main image: upload a 3:1 image, for example 1599 × 533 px. It is the
/promotionscard image, cropped to 3:1 (2:1 on phones), and the background of the product-page banner. On thepromotionslayout it is also the page banner, cropped to 3:1. - Alt 1 image: upload at 450 × 450 (square), the site-wide image for a content page. It shows beside Description 1, cropped to 3:2.
- Description 1, Description 2, Description 3: see What the page shows for where each appears. It depends on the body template.
- Body template: see What the page shows.
- Sort Order: the
/promotionslist is sorted by this field. - Save, and set the page active.
3. Assign the products to the promotion page
Assign every promotion product to the promotion page, the same way products are assigned to category or brand pages. A product only gets the product-page banner when all three of these are true:
- It is on promotion (between its own promo start and end).
- It is assigned to this promotion page.
- Its promotion code exactly matches the page’s Label 1.
If you use the promotions body template, also add the categories you want listed under Related Categories > Related Content on the promotion page. That layout only lists products through those entries (see below).
4. Add the promo image to products (optional)
Each product can show a small promo image while it is on promotion.
- Upload the image to the site’s file system and copy its URL. The field description gives 346 × 86 px.
- Paste the URL into Product Header Promo Image Zone.
- Paste the promotion page’s URL into Product Header Promo Link.
Where it appears:
- Standard product template: centred under the product name, above the price.
- Bike-rack product template: at the bottom of the buy card, below the Add to Cart button.
The image only shows while the product is on promotion. You can leave it filled in; it disappears when the product’s promo ends and comes back if the product goes on promotion again. That may not be what you want for the next promotion (see the cleanup checklist).
See also Promotion image and card badge.
5. Add a home page news slide (optional)
The home page news strip shows adverts from the home_news group as a carousel, one at a time, changing every 5 seconds.
- Add an advert in Advertising Campaigns and set its group to
home_news. - Headline / Alt Text: the first, smaller line of the heading.
- Call to Action Link Text: the second, larger line of the heading. It is not button text here.
- Ad Text: the paragraph under the heading.
- Links To…: the promotion page. The “Find Out More” button appears only when a link is set.
- Image: the full-width background. Use the size in Editing the Home Page.
- Select location for ad to appear: Home Page.
- Set the advert’s date range to match the promotion.
6. Check it
Do these checks on the first day of the promotion. Product pages are cached, so changes to a product’s promo price, banner and countdown can take up to about an hour to appear after the promo starts or ends.
- Open
/promotions: the card shows “Valid” with the dates you expect. - Open the promotion page: content and product lists look right for its body template.
- Open two or three promotion products, including a bike rack if any are in the promotion: the promo banner shows with the right name and date, the price shows the sale price, and the promo image (if used) is there.
- Open the home page: the news slide appears and links to the promotion page.
What the page shows
The body template decides what the promotion page itself shows. Both Promotions pages in the 20 October 2026 content pull (the active Rhino-Rack page and an inactive test page) use the category body template. The promotions body template exists but no live page uses it.
| Field or feature | category template (used live) | promotions template |
|---|---|---|
| Main image as page banner | Not shown | Shown at top, cropped 3:1 |
| ”Promotion Period: start - end” line | Not shown | Shown when Date Posted is set |
| Short Description 1 | Not shown on the page (only on the /promotions card) | Shown under the heading |
| Description 1 with Alt 1 image | Shown only if Description 1 is filled | Shown. Without an Alt 1 image a stock sketch image is used |
| Related Content | Up to 4 link cards, only when both Label 1 and Description 1 are filled | One product section per related category (up to 6), see below |
| Product list | Every product assigned to the page, with filters, sorting and paging | Only through Related Content: up to 6 products per section that are assigned to this page, in that category and currently on promotion |
| Category adverts | category_ad carousel, plus adverts assigned to the page | None |
| Description 2 | At the bottom | Under Description 1 |
| Description 3 | Not shown | At the bottom |
What this means in practice:
category: products stay listed after the promotion ends, at their normal price. The page doesn’t know the promotion is over. The live November 2025 Rhino-Rack page still listed 49 products on 21 October 2026. Setting Label 1 (which you need for the product banner) also switches on the Related Content cards if Description 1 is filled.promotions: no Related Content means no products at all. Products drop off the page by themselves when their promo ends.
What customers see on a product on promotion
| Where | What shows |
|---|---|
| Top of the product page | Promotion banner: page name, “Valid until” with the product’s promo end date, and a “View Details” button to the promotion page. Background is the promotion page’s image, or a stock photo if the page has none. Needs all three conditions in step 3 |
| Price, standard template | RRP struck through, “WAS” normal price, “Now” promo price, and “SAVE x%!“. The RRP line and the SAVE percentage only show when the product has an RRP above its selling price, and the percentage is measured against RRP |
| Price, bike-rack template | ”Save $x” badge (normal price minus promo price), the promo price, and “was” normal price. No RRP line |
| Countdown | ”Sale ends in” with a running timer and the end time (promo end minus one minute). Standard template: only when the product has an RRP above its selling price. Bike-rack template: only when the promo price is below the normal price |
| Product cards in lists | ”Now” promo price and a “Sale” label |
Trade customers and price-on-request products don’t get the countdown or the “Sale” label.
What breaks without warning
Other things that fail quietly:
- End date printed one day late. The
/promotionscard and the Promotion Period line print the day the promotion stops, not its last day (see the worked example). - ”Valid until” vs the countdown. The product banner prints the date of the product’s promo end. With a midnight end time, the banner shows the next day’s date while the countdown shows 11:59 pm on the last day.
- No countdown on standard product pages without an RRP. If the product’s RRP is empty or not above the selling price, the standard template shows no “Sale Ends in” timer and no SAVE percentage.
- Promo image link on its own does nothing. Product Header Promo Link without Product Header Promo Image Zone shows nothing. An image without a link shows, but clicking it just reloads the page.
- No page image. Without a Main image the product banner uses a stock photo, and the
/promotionscard has a broken or empty image. - Expired cards stay listed.
/promotionsshows past, current and upcoming promotions. An ended promotion stays there as “Expired” until you deactivate its page. - Short Description 1 on the
categorytemplate. It only appears on the/promotionscard, not on the page. - Caching. Product-page promo changes can take up to about an hour to show.
- Fifth home page advert. The
home_newsstrip shows 4 at most.
End-of-promotion cleanup
Do this on the day the promotion ends.
- Check each product’s promo pricing has ended, or clear it. The sale price, countdown and banner follow the product’s own promo end, not the page.
- Clear Product Header Promo Image Zone and Product Header Promo Link on the promotion products. Otherwise the old image comes back the next time the product goes on promotion.
- If the page uses the
categorytemplate, unassign the products from the promotion page. The page keeps listing them at full price otherwise. - Decide whether to keep the promotion page. Leave it active to keep its “Expired” card on
/promotions, or deactivate it to remove the card and the page. - End or deactivate the
home_newsadvert if its date range didn’t already end it. This frees one of the 4 slots. - End the matching discount in the Promotions/Discounts module, if you used one.
- About an hour later, check a few former promotion products show their normal price and no banner.
Quick reference
| Field | Used for | Notes |
|---|---|---|
| Date Posted | Start date | Date only matters on /promotions; time is ignored |
| Label 1 | Promotion code | Must match the products’ code exactly. On category, also switches on Related Content cards |
| Label 3 | Length in days | Whole number. Empty means “Expired” from day one |
| Short Description 1 | /promotions card text | Not shown on the category page |
| Main image | Card image, product banner background, promotions page banner | Upload 3:1, for example 1599 × 533. Cropped 3:1 on the card and page banner |
| Alt 1 image | Beside Description 1 | Upload 450 × 450. Cropped 3:2 |
| Sort Order | Order of cards on /promotions | |
| Product Header Promo Image Zone | Product promo image | 346 × 86 px. Shows only while on promotion |
| Product Header Promo Link | Link on the promo image | Usually the promotion page URL |
home_news advert | Home page news strip | 4 adverts at most |
For developers
This page is based on these files in Altapac-ReDev (development branch), checked against altapac.com and Altapac-Content pages/promotions/**/meta.json on 21 October 2026:
src/templates/cms/promotions-list.template.html:/promotionslist.content_type=promotionslist (line 112), date maths (119-122), status branches (127-133), empty fallback (150-154, not yet onmain)src/templates/cms/promotions.template.html: banner (36-41), Promotion Period (47-51), related-content product lists withfilter_inpromo(109-161), Description 3 (165)src/templates/cms/category.template.html: Label 1 related cards nested in the Description 1 check (109-217),category_ad(223), unfilteredthumb_list(314)src/templates/products/template.htmlandproducts/bikeRacks.template.html: promo banner,content_path type:'promotions',promo_id eq content_label1,glenworth.jpgfallback, “Valid until” frompromo_end(lines 3-38)src/templates/products/includes/buying_options.template.html: misc11/misc29 (57-61), promo price branch (109-127), countdown gated onsave(198-209)src/templates/products/includes/bikerack/buycard.template.html:ar_save(29), sale block, countdown (84-91), misc11/misc29 (147-151)src/templates/products/includes/price_state.template.html:porset when the promo price is $0 or lesssrc/templates/products/includes/product_scripts.template.html: countdown target frompromo_endsrc/templates/thumbs/product/template.html: “Now” price and “Sale” labelsrc/templates/cms/home.template.html:home_news,limit:'4'(line 5).claude/skills/base-templating/references/caching.md: productdisplaycache, default ttl 3600 s.claude/skills/base-templating/references/value-formats.md: misc11 and misc29 cPanel labels- Banner background:
asset_url type:'content'with nothumbrenders the page’s base image<id>.jpg, the Main image file thatthumb:'full'also gives (live check 2026-10-21 on/locationsand Learn article 15977, whose15977.jpgis 1599 × 533). Upload sizes: Altapac-ContentCLAUDE.md
Open owner decision: whether Promotions pages should use the category or promotions body template.