Combine Notion Buttons and Reminders for Small Habit Loops

A person's hand about to click on colorful habit tracking buttons within the Notion app on a laptop screen, set on a modern desk next to an open planner and a smartphone showing a notification, conveying the concept of combining digital reminders and habit tracking.

Setting up your first Notion button

Okay, let’s start simple. You can make a button in Notion that marks a task as done, creates a new page, adds a date — whatever. It’s basically one-click automation (with caveats, lol). To make one:

1. Type /button in a Notion page
2. Select the Button block that pops up
3. Give it a name like “Log Water” or “Mark As Checked”
4. Inside the actions dropdown, choose Add or edit page property

Now, this is where things get messy if you try to be too clever too early. Notion’s actions are weirdly limited. You can’t directly “toggle” a checkbox from true to false — you hardcode it. So if you’re trying to use a button to flip a checkbox on and off, it… won’t. It’ll just keep turning it on over and over. Maybe that’s fine. Maybe that’s infuriating.

In my case, I was tracking a quick-focus habit — basically a column where I hit a button and it marks Off Focus → On Focus. But once it’s On, there’s no going back unless I manually uncheck it ¯\_(ツ)_/¯. So I eventually broke it out into two buttons:

– “Begin Focus” → sets checkbox to true, adds timestamp
– “End Focus” → sets checkbox to false, clears timer

Manual, but works every time. Also, these buttons can only run inside databases, not on regular pages — which is super frustrating if you’re trying to build a dashboard-style layout. You’ll need to embed a linked database or wrap your whole tracker inside one. It’s doable, just not… super intuitive.

Making a habit loop with reminders

Now to the juicy part — adding reminders. Notion has @reminder, which is both awesome and completely stuck in the 2019s. You can’t trigger a real mobile push or email unless the reminder is inside your inbox or mentioned directly. And you can’t trigger a reminder from a button. I learned this the dumb way: I tried to create a button that wrote @[reminder: now] into a property. Guess what? It just writes the text.

Yeah. It literally pastes the string “@reminder: now” into the property. No pop-up. No notification. Just vibes.

So how do you *actually* use reminders? You make a date property in your database. Then in a row, you set it to a time like 9pm, and @reminder will pop off at that time. No automation, no buttons. You just set it.

Where this works for small habit loops is repetition + visibility. Let’s say I want to journal every night:

– My database has a “Journal Today?” checkbox, a “Timestamp” date, and a “Reminder” date
– I set a daily reminder on “Reminder” for 9:00 PM
– I use a button labeled “Did it” that checks the box and sets the timestamp to now

The thing is, there’s no loop-back. The reminder doesn’t automatically move forward to the next day.

So… every day, when I hit “Did it,” I also have to manually update the reminder date to tomorrow. Or — and this is what I ended up doing — I set a recurring calendar event on my phone instead 😬. Notion didn’t cut it.

Why buttons can’t trigger reminders directly

This tripped me up more than anything. I really thought, okay, if I can make the button write something into a text field, and Notion treats @reminder like a tag… maybe it magically converts. But nope.

Buttons can fill text, date, multi-select, and formula fields. But there’s no internal command syntax like “@reminder in this property triggers X.” And formulas can’t generate reminders either.

What’s going on here is that Notion separates content reminders (like inline text comments that say @reminder) from database logic fully. Content-based reminders trigger push alerts. Database fields? Crickets.

So what if you built a text field, and used a button to paste in a block of text like: “Hey, update your habit ✨ @reminder tomorrow 9pm”? Still doesn’t work. It’ll paste *the text*, but Notion won’t parse it and create a real reminder.

Result: buttons are good at database value changes — not event triggers. That’s the core limitation. And it’s not documented anywhere, which drove me nuts.

Using linked databases to show today only

There’s an annoying thing with habit tracking. You don’t want to scroll back through 40 days of logs. You just want to see today.

Here’s what I’ve done:

1. Create a view called Today View
2. Filter the date field (let’s say it’s called “Tracking Date”) to show only today
3. Make your buttons in this view (each one works per row)

You can also build rollups that check if the checkbox got clicked today — super useful if you want to track streaks.

For example, I had a table like this:

| Date | Read Book? | Meditated? | Walked Dog? |
|————-|————|————|————–|
| Today | ✅ | ❌ | ✅ |

Each column had a button I could trigger, and yes — this breaks if you forget to create a row each day first. I automate that with a recurring Zap in Zapier (although even that has started skipping runs lately). I’m testing Make.com too. Will shout if it works better 👀.

Stacking multiple actions in a button

Weirdly, this works — sometimes. You can string together actions in a Notion button like:

– Set checkbox to true
– Set date to now
– Fill text with a quote

It runs top to bottom. But if the target field is a formula or read-only (like a rollup), the action bombs quietly. No error, just… nothing. So if your button mysteriously half-works, double-check the property type.

Also, buttons don’t support IF-THEN logic. You can’t say “if X is true, do Y.” That’s what I wanted for my sleepy habit: if I already marked it completed, don’t update the timestamp again. Too bad. You either build that logic into a formula property (which can’t be updated) or you leave it loose.

Oh, and button actions can’t affect other pages or rows. No cross-row logic. Each button only edits the same row it exists in. That’s actually a good thing in terms of safety, but limits the complexity you might want.

How to loop buttons into daily routines

I eventually landed on this:

1. Daily habit database with fields:
– Name
– Checkbox (Did I do it?)
– Timestamp (when I did it)
– Reminder (manually set)
2. View filtered to Today only
3. Button next to each habit

Every day, I create a new row (with a script, sometimes manually if lazy), and the buttons appear clean and fresh. I hit them as I go. If I skip a day, the blank row stays there — reminding me.

What I **wish** existed is recurrence. Like, “every day at midnight, re-add these habits.” Instead I made a Zap that runs daily and creates rows for each habit with today’s date. Janky but fine.

Also tried doing this with templates, which almost worked — until I hit the issue that Notion doesn’t handle nested templates very well if you update the source. It freezes older versions. Frustrating.

Workarounds using Zapier or Make

So yeah. You can try piping Notion into Zapier to make reminders more useful. But the Zap triggers are limited. You can watch for a new database item, or a changed field, but not button presses. And there’s a delay.

My current workaround:

– On new row in Notion (via Zapier), create corresponding Google Calendar event
– Set event to notify 15 minutes before

This way, when I log a habit row for tomorrow, I get a real-tone reminder from Calendar. It’s not elegant, but it works better than whatever Notion’s soft reminders are.

One caveat — you do end up with a clogged calendar unless you use a dedicated one. I made a calendar just for habit reminders and color-coded it. Works fine.

Checklist to confirm your Notion setup works

– [ ] Button changes the expected fields (checkbox, dates, etc.)
– [ ] Database has proper date logic (Today filter works)
– [ ] Manual reminders are set and visible
– [ ] View is filtered to avoid confusion
– [ ] Optional Zap or automation creates daily rows
– [ ] Separate calendar used if external reminders added

If your flow breaks, it’s usually one of these spots — especially button fields trying to modify formulas or not firing at all. Just tweak one thing at a time 🙂