Install via Composer:
composer require transformstudios/eventsGet up and running in three steps:
- Create or use a Statamic collection (default:
events) - Import the provided fieldset:
events::event - Add a template:
{{ events:upcoming limit="5" }}
{{ title }} – {{ start }}
{{ /events:upcoming }}You now have a working event listing.
By default, events use your application timezone (typically UTC).
You can override this in the Control Panel. This value is used when an event does not have a timezone set.
The default collection is events.
If you are using a different Statamic collection, update it in the addon settings.
ICS downloads read the following entry fields when present:
| ICS property | Source |
|---|---|
LOCATION |
location.name, falling back to online_url when the name is empty |
URL |
online_url |
GEO |
location.coordinates (latitude / longitude) |
DESCRIPTION |
description |
location and online_url are independent and combinable (hybrid events).
| Event | LOCATION: |
URL: |
GEO: |
|---|---|---|---|
| Physical only | location.name |
— | location.coordinates |
| Online only | online_url |
online_url |
— |
| Hybrid | location.name |
online_url |
location.coordinates |
location must be a group. A string or other non-group value is skipped (no LOCATION: from it). Nested coordinates shape:
'location' => [
'name' => '123 Main St',
'coordinates' => [
'latitude' => 40,
'longitude' => 50,
],
],Partial or non-numeric coordinates are skipped (no GEO:) rather than failing the download.
If your field names differ from the defaults above, use a Computed Value to map them.
Your collection blueprint must include the required event fields for Events to work correctly.
You can:
- Define fields manually
- Import the provided fieldset:
events::event
Using the sample fieldset is the fastest way to get started.
| Field | Description |
|---|---|
location |
Group: name (localizable text — venue, description, or address) and optional nested coordinates (latitude / longitude). |
online_url |
Join link for online or hybrid events (Zoom, livestream, etc.). Optional; independent of location. |
Breaking changes for location fields:
locationis now a group (name+ nestedcoordinates), not a stringaddress,link, and top-levelcoordinatesare no longer read- URL sniffing on a string
locationis gone — useonline_urlfor join links - Protected
eventUrl()/icsAddress()were replaced byicsUrl()/icsLocation()
An update script (#196) migrates common legacy handles. Back up content before upgrading. Computed-value mappings and foreign (e.g. Prime) location shapes need a separate cutover.
| Field | Required | Description |
|---|---|---|
start_date |
Yes | Start date of the event |
start_time |
No | Start time (not required if all_day is true) |
end_time |
No | End time |
all_day |
No | If true, times are not required |
Extends single-day events with recurrence rules:
| Field | Description |
|---|---|
recurrence |
daily, weekly, monthly, annually, every |
specific_days |
For rules like “3rd Tuesday” |
interval |
Required when using every |
period |
days, weeks, months, years |
end_date |
Optional end to recurrence |
exclude_dates |
Dates to exclude from occurrences |
If no end_date is set, the event continues indefinitely.
Use this when events span specific dates.
| Field | Required | Description |
|---|---|---|
multi_day |
Yes | Enables multi-day mode |
days |
Yes | Array of event days |
Example:
multi_day: true
days:
-
date: '2019-11-23'
start_time: '19:00'
end_time: '21:00'
-
date: '2019-11-24'
start_time: '11:00'
end_time: '15:00'When multi_day is enabled, standard single-day and recurrence fields are ignored.
events:betweenevents:calendarevents:inevents:todayevents:upcomingevents:download_link
These tags return event occurrences (individual dates generated from your events).
| Parameter | Description |
|---|---|
site |
Site handle (defaults to current site) |
timezone |
Adjusts all occurrences to this timezone |
Each occurrence includes:
| Field | Description |
|---|---|
start |
Start datetime |
end |
End datetime |
has_end_time |
Boolean |
Multi-day events also include a days array with per-day data.
Supported on:
betweenintoday
Example:
paginate="10"Supports both standard conditions and taxonomy filtering using standard Statamic syntax:
taxonomy:categories:not="example" title:contains="awesome"Default: ascending To reverse:
sort="desc"Note:
collectionandeventare mutually exclusive. Passcollectionto list occurrences from a whole collection, oreventto get occurrences for a single entry — not both. Using them together throws an exception. (This does not apply toevents:download_link, which accepts both.)
Returns events within a date range.
Parameters:
collection(optional, defaults to 'events'; cannot be combined withevent)event(optional) Passidof the event you want occurrences for; cannot be combined withcollectionfrom(optional, defaults to now)to(required)
Returns a full calendar grid for a given month.
Each day contains either:
no_resultsoccurrences
Additional flags:
spanningspanning_startspanning_end
Returns events within a future time window.
Parameters:
collection(optional, defaults to 'events'; cannot be combined withevent)event(optional) Passidof the event you want occurrences for; cannot be combined withcollection
Example:
next="90 days"Returns events occurring today.
Parameters:
collection(optional, defaults to 'events'; cannot be combined withevent)event(optional) Passidof the event you want occurrences for; cannot be combined withcollectionignore_past(optional, defaults to 'false')
Returns the next set of event occurrences.
Parameters:
limit(required)collection(optional, defaults to 'events'; cannot be combined withevent)event(optional) Passidof the event you want occurrences for; cannot be combined withcollectioncollapse_multi_days(optional)offset(optional)
Generates an ICS download link.
Parameters:
datedate get occurrences to download
Includes the fields documented under ICS Downloads.