Dynamic Ticket Phases - User Guide

Overview

The 2026 conference page now supports dynamic ticket phases that you can add, edit, or remove directly in the data file. No code changes needed!

How It Works

Sequential Phase Display

Only one ticket phase is active at a time. The system automatically:

Example Timeline

If you have these phases:

  1. Super Early Bird (£220) - ends Feb 25
  2. Early Bird (£280) - ends Jul 1
  3. Regular (£340) - ends Oct 21
  4. On the Door (£470) - no end date

On March 1:


How to Add/Edit/Remove Ticket Phases

Location

Edit the file: /_data/year_2026/homepage.yml

Scroll to the bottom where you’ll find the tickets: section.

Add a New Phase

tickets:
  visibility: true
  phases:
    - name: Super Early Bird
      price: 220
      end_date: 2026-02-25T17:00:00Z
      ticket_url: https://www.tickettailor.com/...
      end_date_display: Ends 25 Feb at 5pm
    
    # Add your new phase here:
    - name: Black Friday Sale
      price: 250
      end_date: 2026-11-29T23:59:00Z
      ticket_url: https://www.tickettailor.com/...
      end_date_display: Ends 29 Nov at midnight

Edit an Existing Phase

Just change the values:

    - name: Early Bird
      price: 280  # Change price
      end_date: 2026-07-15T17:00:00Z  # Change end date
      ticket_url: https://...  # Change URL
      end_date_display: Ends 15 Jul at 5pm  # Change display text

Remove a Phase

Delete the entire phase block (including the - and all indented lines):

# Delete this entire block:
    - name: Flash Sale
      price: 300
      end_date: 2026-09-30T17:00:00Z
      ticket_url: https://...
      end_date_display: Ends 30 Sep at midnight

Reorder Phases

Cut and paste phases to change their order. Important: Phases must be in chronological order (earliest to latest).


Field Reference

Required Fields

Field Description Example
name Phase name Super Early Bird
price Price in pounds (no £ symbol) 220

Optional Fields

Field Description Example
end_date When this phase ends (ISO 8601 format). Leave as null for final phase. 2026-02-25T17:00:00Z
ticket_url Full URL to ticket purchase page. Use null for “On the Door” https://www.tickettailor.com/...
end_date_display Human-readable end date text. Use null to hide. Ends 25 Feb at 5pm

Date Format

Use ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ

Examples:

Tip: Use UTC timezone (the Z at the end) to avoid timezone confusion.


Common Use Cases

Add a Flash Sale

Insert between existing phases:

    - name: Early Bird
      price: 280
      end_date: 2026-07-01T17:00:00Z
      ticket_url: https://...
      end_date_display: Ends 1 Jul at 5pm
    
    # NEW: Flash sale for 48 hours
    - name: Flash Sale
      price: 250
      end_date: 2026-09-30T23:59:00Z
      ticket_url: https://...
      end_date_display: Ends 30 Sep at midnight
    
    - name: Regular
      price: 340
      end_date: 2026-10-21T17:00:00Z
      ticket_url: https://...
      end_date_display: Ends 21 Oct at 5pm

Remove “On the Door” if Sold Out

Delete the last phase:

    - name: Late Bird
      price: 395
      end_date: 2026-11-06T17:00:00Z
      ticket_url: https://...
      end_date_display: Ends 6 Nov at 5pm
    
    # Delete "On the Door" phase entirely

Create a Student Discount Phase

    - name: Student Discount
      price: 180
      end_date: 2026-10-01T17:00:00Z
      ticket_url: https://www.tickettailor.com/student-tickets
      end_date_display: Ends 1 Oct at 5pm (Students only)

Testing

Using Mock Time (Development)

To test how the pricing table looks at different dates, edit /_data/dev-settings.yml:

mock_time: "2026-03-01 12:00:00 +0000"

This will show you what visitors see on March 1, 2026.

Remember to remove or comment out mock_time before deploying to production!


Visibility Control

To hide the entire tickets section:

tickets:
  visibility: false  # Change to false
  phases:
    # ...

Important Notes

⚠️ Order matters - Phases must be in chronological order (earliest first)
⚠️ Last phase - The final phase should have end_date: null and ticket_url: null
⚠️ YAML syntax - Be careful with indentation (use spaces, not tabs)
⚠️ Test before deploying - Use mock_time to verify the logic works correctly


Benefits

No code changes - Edit data file only
Flexible - Add/remove phases as needed
Automatic - Phases switch based on dates
Reusable - Same system for future years
Simple - Just edit YAML, no programming required


Troubleshooting

Problem: Phases not showing in correct order
Solution: Make sure phases are listed chronologically (earliest to latest)

Problem: Wrong phase is active
Solution: Check end_date values are correct and in ISO 8601 format

Problem: “Buy” button not appearing
Solution: Verify ticket_url is set and not null

Problem: Entire section not showing
Solution: Check visibility: true is set


For Future Years

To use this system for 2027, 2028, etc.:

  1. Copy /_data/year_2026/homepage.yml to /_data/year_2027/homepage.yml
  2. Update the tickets: section with new dates and prices
  3. Copy /2026/conf-page-partials/pricing-table-dynamic.html to /2027/conf-page-partials/
  4. Update the year in /2027/index.html to include the dynamic pricing table

The template code doesn’t need changes - just update the data!