Front-end & Twig

Owl exposes a fluent Twig query API through craft.owl. Its parameters deliberately mirror Solspace Calendar’s, so migrating templates is mostly find-and-replace.

Querying occurrences

craft.owl.events() returns occurrences within a date range — so a weekly event correctly appears on every week it falls. Filter by calendar, range, and the usual element criteria:

{% set occurrences = craft.owl.events()
  .calendar('concerts')
  .rangeStart('today')
  .rangeEnd('today +1 month')
  .orderBy('startDate ASC')
  .all() %}

{% for occurrence in occurrences %}
  

{{ occurrence.title }}

{% if occurrence.isException %}Rescheduled{% endif %}
{% endfor %}

Common parameters

ParameterWhat it does
calendarLimit to one or more calendar handles.
rangeStart / rangeEndThe window of occurrences to return (any date string).
loadOccurrencesReturn occurrences (default) vs. distinct events.
orderBySort, usually startDate ASC.
limit / offsetStandard pagination.

Reading occurrence data

Each occurrence exposes its own startDate and endDate (the concrete instant), the parent event’s title, custom fields and URL, plus its calendar (with color and handle). Override occurrences report isException / isOverride so you can flag changed instances.

Where to go next

  • Calendar views — feed FullCalendar from the JSON endpoint.
  • ICS feeds — subscribable feeds and single-event downloads.
  • GraphQL — the same data over GraphQL.

More in Site Features

Pairs well with Owl

The bigger pieces a client asks for by name. Events, bookings, memberships, courses, reviews, a support desk, job listings and the rest.