Todoist’s native integration with Google Calendar is great: it’s fast, bi‑directional, and lets you manage tasks right from your calendar.
There’s one annoying limitation though: events created by Todoist show up as private on Google Calendar.
If you share your calendar with others, or you sync multiple calendars (work + personal), this can be a real problem. Instead of seeing "Working on Project X" or "Todoist: Deep Work", people only see generic "busy" blocks.
Check out the full working script here: gist.github
Why Make Todoist Events Public?
Some people are perfectly fine with private events. Others aren't. Here are a few real-world scenarios where public visibility makes sense:
Shared calendars
You share your calendar with colleagues or family. They need to see what you're doing, not only that you're "busy".Multi-account setups
You sync your work Google account with your personal one. Private events don't always merge nicely; public events give more context in combined views.Calendar delegation
An assistant, colleague, or partner helps manage your schedule. They need to see actual tasks and time blocks to plan around them properly.
Todoist's Google Calendar integration currently creates events as private by default.
The script in the [Gist] simply automates flipping that visibility to public for those who need it. gist.github
Why Not Just Use the iCal Feed?
Todoist also provides an iCal feed. That can be:
- Simpler to set up
- Already behaving the way you want in some setups (e.g. public-like visibility)
But the iCal feed has some big trade-offs:
- It's one-way (read-only): changes in Google Calendar don't go back to Todoist
- Sync can be slow (sometimes delayed by hours)
- You can't complete or edit tasks in a truly integrated way from Google Calendar
The native integration instead gives you:
- Bi-directional sync (edit in Google Calendar → reflected in Todoist)
- Near real-time updates
- Ability to complete/adjust tasks from Google Calendar
So the idea here is: keep the native integration for all the benefits, and patch only the "private by default" behavior with the script from the [Gist]. gist.github
How the Script Works
The script in the [Gist] uses Google's Calendar Advanced Service + sync tokens: gist.github
- Automatically finds your "Todoist" calendar
- First run: Fetches events from the last 30 days, sets private → public
- Subsequent runs: Uses sync token to get only new or modified events
- Efficient: No full calendar scans after the first run
Key feature: Even if you create a Todoist task scheduled for 2028, it gets picked up immediately because it's a new event, regardless of its date.
Quick Setup (5 minutes)
- Go to script.google.com → New project
- Add service: Services → Google Calendar API gist.github
-
Copy script from [Gist] → paste in
Code.gsgist.github -
Run once:
updateTodoistEvents()→ authorize - Add trigger: Time-driven, every 10-15 minutes
Done! New Todoist events now become public automatically.
Troubleshooting
| Problem | Solution |
|---|---|
| "Todoist calendar not found" | Update calendar name in script: cal.summary === 'YourCalendarName'
|
| "API call failed" | Enable Google Calendar API in Services gist.github |
| Sync token errors | Script auto-resets invalid tokens |
When This Makes Sense
Use this if:
✓ You use native Todoist ↔ Google Calendar integration
✓ You share your calendar and want context (not just "Busy")
✓ You want bidirectional, real-time sync
✓ You prefer a set-and-forget Apps Script solution
Full script and updates: gist.github
Stars and forks welcome! If you have tweaks (e.g. filtering by project, custom calendar names), share them in the comments.
Published Jan 15, 2026
Code for PHP devs, DevOps folks, and productivity hackers todoist
Top comments (0)