Publishes a Notion database with a date property to a calendar feed.
Try the live demo calendar feed:
https://ncal.val.run/2d92c190bff080658109ec63757a2e53?tz=America/Los_Angeles
Your database needs these properties:
- Name (title) - The event title
- Date (date) - The event date/time
- Done (checkbox) - Whether the task is complete
You can duplicate this example database to get started: 👉 Example Todo Database
- Go to Notion Integrations
- Click "New integration" and give it a name
- Copy the "Internal Integration Secret" (this is your API token)
- Open your Notion database
- Click ••• from the top right → Connections → Connect to
- Select the integration you created
- Fork this val
- Set
NOTION_API_TOKENin "Environment variables" from the sidebar - Update
datePropertyName,donePropertyName, andmaxEventAgeInMonthsin the code if your property names differ
Access your calendar feed by appending your Notion database ID and timezone to the URL:
https://<your-val-url>/<notion-database-id>?tz=<timezone>
For example:
https://example.web.val.run/abc123def456?tz=America/Los_Angeles
You can find your database ID in the Notion URL when viewing the database:
https://notion.so/<database-id>?v=...
The tz parameter uses IANA timezone names (also known as "tz database" names).
Common examples:
America/New_York(Eastern Time)America/Chicago(Central Time)America/Denver(Mountain Time)America/Los_Angeles(Pacific Time)Europe/LondonEurope/ParisAsia/TokyoAsia/ShanghaiAustralia/Sydney
Find your timezone name in the full list: List of tz database time zones (Wikipedia)
Look for the "TZ identifier" column in the table.
If you don't specify a timezone, it defaults to UTC.
Subscribe to this URL in any calendar app (Google Calendar, Apple Calendar, Outlook, etc.) to sync your Notion events.
Events in Notion that have only a date (no time) are displayed as all-day events in your calendar.
The calendar automatically creates a daily reminder for overdue tasks. An event is considered overdue if:
- The
Donecheckbox is unchecked, AND - Either the date is missing OR the end date is in the past
All overdue events are aggregated into a single all-day event that appears on today's date (based on your specified timezone) with:
- Title: All overdue event titles joined with " • " (e.g., "Task 1 • Task 2 • Task 3")
- Description: Each event's title and Notion URL, formatted as:
Task 1 https://notion.so/... Task 2 https://notion.so/...
This gives you a daily overview of incomplete tasks that need attention.
Your Notion database should have:
- A Date property (configurable via
datePropertyName) - A Done checkbox property (configurable via
donePropertyName) - A Name title property for event titles