A readable ICS file with no upcoming events means the calendar source has nothing to publish in that window. The usual causes are unpublished events, an export limited to a category, date range or number of events, or a feed that stopped updating. That is not a website display problem, so fix the source first. The one trap is recurring events, which a quick look at start dates can miss.
If a public events page is blank, the first question is whether there was anything to show. Answering that from the calendar source takes a few minutes and tells you which half of the problem to work on: the source, or the website that displays it.
Get the file the site actually uses
Check the live source, not an export someone saved last month. Which file that is depends on how the site gets its events:
- The site imports events from another calendar (Google Calendar, Outlook, another website): the source is that calendar’s feed address, usually found under Settings, Share or Export in the other system.
- The site publishes its own calendar, for example with The Events Calendar: the source is the site’s export. Adding
?ical=1to an events view address returns an .ics file of that view.
Download it fresh. In a terminal:
curl -sSL -D headers.txt -o feed.ics "https://example.org/events/list/?ical=1"
head -n 1 feed.ics
grep -i '^content-type' headers.txt A real calendar file starts with BEGIN:VCALENDAR, and the server should describe it as text/calendar. If the first line is <!DOCTYPE html> you have a web page instead: a login screen, an error page or a redirect to the home page. The Events Calendar’s own troubleshooting notes list membership or login gates, firewalls, bot or user-agent blocking and its Redirect Bots setting as reasons a feed request can end up somewhere else.
If the download is empty (0 bytes), that can be an answer in itself. In our test of The Events Calendar 6.18.3.1, its ?ical=1 export returned an empty response, not an empty calendar file, whenever there were no upcoming events to list. Check the public events page: if it also shows nothing upcoming, carry on with the steps below.
If you prefer the browser, open the feed address in a private window and use “Save link as” on an export link rather than saving the page you are looking at.
Confirm the window you’re checking
Every event in an ICS file has a start in a DTSTART line. It comes in three forms:
DTSTART:20261114T193000Z ← UTC (the Z)
DTSTART;TZID=Europe/London:20261114T193000 ← local time in a named zone
DTSTART:20261114T193000 ← “floating”: no zone at all
DTSTART;VALUE=DATE:20261128 ← all-day, 28 November If every start is in the past, the file is readable but has nothing upcoming. For a rough check, count the events and look at the latest starts:
grep -c '^BEGIN:VEVENT' feed.ics
grep '^DTSTART' feed.ics | sort -t: -k2 | tail -n 5BEGIN:VEVENT
SUMMARY:Harvest Supper
DTSTART;TZID=Europe/London:20261018T183000 ← 18 Oct 2026, already past
END:VEVENTThe ICS event checker does this properly: it counts events that are upcoming or in progress in the next 30 days, shows the next one, and reports the latest date in the file when nothing is upcoming.
Check upcoming events are published
A public export only contains events visitors are allowed to see. Drafts, events pending review, scheduled posts and private events are left out. In WordPress, open the events list in the admin, filter by status, and look for anything dated in the next month that is not marked Published.
While you are there, open one upcoming event and check:
- its start and end dates are what you expect (an end date before the start, or a typo in the year, is easy to miss);
- in The Events Calendar, whether Hide From Event Listings is ticked in the event’s options. It is designed to keep an event out of listings.
Look for a filtered or limited export
Export links usually come from the view you were on. If yours came from a category, venue or date-filtered page, it may legitimately contain nothing upcoming. Export again from the unfiltered list.
Exports are also often limited by design. The Events Calendar’s subscribe feed only includes current and future events, and its documented test address returns the next 30 events, not every event. A busy calendar can push a specific event out of a capped export.
Check the feed is still updating
If the site imports events from another calendar, the import may have stopped. Compare the newest event in the file with the newest event in the original calendar. A clean gap after a particular date usually points to an import that failed or was paused.
For imports into The Events Calendar, its documentation describes one silent failure worth checking: an incoming event whose name matches an event in Events → Ignored or Events → Trash is skipped without an error in the logs. Search both for the missing event names, then re-run the import.
Recurring events and time zones
Recurring events are the main way a calendar can look empty when it isn’t. A recurring event is defined once, with a rule:
BEGIN:VEVENT
SUMMARY:Weekly Book Club
DTSTART;TZID=Europe/London:20260105T180000
RRULE:FREQ=WEEKLY;BYDAY=MO
END:VEVENT The DTSTART is in the past, but the series has an occurrence next Monday and every Monday after it. Looking only at start dates would wrongly report nothing upcoming. RFC 5545 defines four properties that change the set of dates: RRULE (the repeating rule), RDATE (extra dates), EXDATE (removed dates) and RECURRENCE-ID (a single occurrence that has been moved or changed).
The free checker does not expand these rules. When a recurring series could produce dates in the next 30 days, it marks the result Incomplete count and shows only the one-off events it is sure about, as a minimum. To see the real dates, import the file into a new, empty calendar in a calendar app (not your main calendar) and look at the coming month.
Time zones matter less often, but they matter near the edges. RFC 5545 requires a VTIMEZONE definition in the file for every TZID it uses. Many feeds skip it and use a standard name such as Europe/London, which the checker can still resolve. If a zone name can’t be identified, the event’s real time is uncertain by up to a day, and the checker says so when that could move it in or out of the window.
What your result tells you
| What you found | Where the problem is | What to do next |
|---|---|---|
| Not a calendar file (a web page) | The feed address or access to it | Fix the address, login gate, firewall rule or redirect |
| Readable, no upcoming events, latest date in the past | The calendar source | Publish events, fix the export filter or restart the import |
| Readable, upcoming events found | Between the source and the page | Work through WordPress events not showing |
| Incomplete count | Not yet known | Check the recurring events in a calendar app first |
Limitations of this guide
- It covers the calendar source. It can’t tell you whether a website is displaying events; that is the other guide’s job.
- Setting names for The Events Calendar come from its documentation at the verification date above. Menu labels can change between plugin versions.
Sources
- RFC 5545: Internet Calendaring and Scheduling Core Object Specification (iCalendar) · IETF , accessed 7 Nov 2026
- Troubleshooting Subscribe and Export on The Events Calendar · The Events Calendar documentation (Nexcess) , accessed 7 Nov 2026
- Troubleshooting Event Imports · The Events Calendar documentation (Nexcess) , accessed 7 Nov 2026
Maintaining calendars for several clients? We’re recruiting five agencies to pilot automated checks Pilot