Aug 5, 2025

Aug 5, 2025

Notion
Notion

How to Gamify Your Life in Notion (Step-by-Step Guide)

How to Gamify Your Life in Notion (Step-by-Step Guide)

How to Gamify Your Life in Notion (Step-by-Step Guide)

How to Gamify Your Life in Notion (Step-by-Step Guide)

How to Gamify Your Life in Notion (Step-by-Step Guide)
How to Gamify Your Life in Notion (Step-by-Step Guide)
How to Gamify Your Life in Notion (Step-by-Step Guide)
How to Gamify Your Life in Notion (Step-by-Step Guide)

How to Gamify Your Life in Notion

Most productivity systems die within a week.

Not because they do not work.

Because they are boring.

What if your life felt like a game you actually wanted to play?

Let me show you how to build this inside Notion.

The Concept

Before we build, understand this.

Any database where you take action can earn you points or lose points (e.g Bad Habits):

  • Tasks

  • Good Habits

  • Bad Habits

  • Journal entries

  • Goals

  • Projects

  • Milestones

  • Reading logs

  • Notes reviewed

Complete something? Earn XP and Coins.

Slip into a bad habit? Lose XP and Coins.

Buy a reward? Spend Coins.

The entire system runs on this simple economy. Actions have consequences. Good and bad.

Now let us build.

Step 1: Create Your Character

Create a database called Character. This is you inside the game.

Add these properties:

  • Name (Text)

  • Avatar (Files & Media)

Now create relations to connect your character to everything:

  • Tasks (Relation)

  • Good Habits (Relation)

  • Bad Habits (Relation)

  • Journal (Relation)

  • Challenges (Relation)

  • Titles (Relation)

  • Rewards (Relation)

Your character does not store points manually.

It pulls them automatically from these connections.

Step 2: Build Your Tasks Database

Create a Tasks database with:

  • Name (Text)

  • Status (Select: Todo, In Progress, Done)

  • Date (Date)

  • XP (Number)

  • Coins (Number)

  • Character (Relation)

Assign XP and Coins based on Energy:

  • Quick task → 10 XP, 20 Coins

  • High energy Task → 100 XP, 200 Coins

Create a formula to show what the task is worth:

let(
  name, prop("Character").map(current.prop("Name")).join(", "),
  xp, prop("XP"),
  coins, prop("Coins"),
  date, prop("Date"),
  
  ifs(
    prop("Status") == "Done", style(name + ", earned: " + format(xp) + " XP + " + format(coins) + " Coins", "pink", "b"),
    date < today() and prop("Status") != "Done", style(name + ", missed: " + format(xp) + " XP + " + format(coins) + " Coins", "red", "b"),
    true, style(name + ", finish to earn: " + format(xp) + " XP + " + format(coins) + " Coins", "gray", "b")
  )
)
let(
  name, prop("Character").map(current.prop("Name")).join(", "),
  xp, prop("XP"),
  coins, prop("Coins"),
  date, prop("Date"),
  
  ifs(
    prop("Status") == "Done", style(name + ", earned: " + format(xp) + " XP + " + format(coins) + " Coins", "pink", "b"),
    date < today() and prop("Status") != "Done", style(name + ", missed: " + format(xp) + " XP + " + format(coins) + " Coins", "red", "b"),
    true, style(name + ", finish to earn: " + format(xp) + " XP + " + format(coins) + " Coins", "gray", "b")
  )
)
let(
  name, prop("Character").map(current.prop("Name")).join(", "),
  xp, prop("XP"),
  coins, prop("Coins"),
  date, prop("Date"),
  
  ifs(
    prop("Status") == "Done", style(name + ", earned: " + format(xp) + " XP + " + format(coins) + " Coins", "pink", "b"),
    date < today() and prop("Status") != "Done", style(name + ", missed: " + format(xp) + " XP + " + format(coins) + " Coins", "red", "b"),
    true, style(name + ", finish to earn: " + format(xp) + " XP + " + format(coins) + " Coins", "gray", "b")
  )
)
let(
  name, prop("Character").map(current.prop("Name")).join(", "),
  xp, prop("XP"),
  coins, prop("Coins"),
  date, prop("Date"),
  
  ifs(
    prop("Status") == "Done", style(name + ", earned: " + format(xp) + " XP + " + format(coins) + " Coins", "pink", "b"),
    date < today() and prop("Status") != "Done", style(name + ", missed: " + format(xp) + " XP + " + format(coins) + " Coins", "red", "b"),
    true, style(name + ", finish to earn: " + format(xp) + " XP + " + format(coins) + " Coins", "gray", "b")
  )
)
  • Done? You earned it.

  • Missed? It haunts you.

  • Pending? Motivation to move.

Step 3: Build Your Habits

Create two databases.

Good Habits

  • Name (Text)

  • Date (Date)

  • Done (Checkbox)

  • XP (Number)

  • Coins (Number)

  • Character (Relation)

Complete a good habit, earn points.

Bad Habits

  • Name (Text)

  • Date (Date)

  • Checked (Checkbox)

  • XP (Number)

  • Coins (Number)

  • Character (Relation)

Slip into a bad habit? You lose points. The system punishes you.

Step 4: Build Your Journal

Create a Journal database:

  • Name (Text)

  • Date (Date)

  • Logged (Checkbox)

  • XP (Number)

  • Coins (Number)

  • Character (Relation)

Log your day, earn points.
Consistent journaling becomes rewarding.

Step 5: Expand to Everything

The same logic works for any database:

  • Goals → Complete a goal? 500 XP, 1000 Coins

  • Projects → Finish a project? 200 XP, 400 Coins

  • Milestones → Hit a milestone? 150 XP, 300 Coins

  • Books → Finish reading? 100 XP, 200 Coins

  • Notes Reviewed → Review a note? 10 XP, 20 Coins

Connect each database to your Character.

Add XP and Coins properties. Create the same filter formulas.

Your entire life becomes the game.

Step 6: Points Settings (Optional)

As the system grows, manually balancing XP and Coins across every task, habit, and goal becomes messy and slow.

This step lets you control your entire point economy from one place.

Create a database called Points Settings with:

  • XP (Number)

  • Coins (Number)

Create one page per action type, for example:

  • Tasks Settings

  • Habits Settings

  • Journal Settings

  • Goals Settings

  • Projects Settings

Now, in each action database:

  • Add a relation to Points Settings

  • Link it by default to the correct settings page

  • Change the XP Number Property to a Rollup that pulls XP from that page

  • Do the same for the Coins Number Property

Change the numbers once in Points Settings, and every related item updates automatically.

Step 7: Calculate Total Points

Back to your Character database.

All Time XP

prop("Tasks").filter(current.prop("Status") == "Done").map(current.prop("XP")).sum() +
prop("Good Habits").filter(current.prop("Done") == true).map(current.prop("XP")).sum() +
prop("Journal").filter(current.prop("Logged") == true).map(current.prop("XP")).sum() -
prop("Bad Habits").filter(current.prop("Checked") == true).map(current.prop("XP")).sum()
prop("Tasks").filter(current.prop("Status") == "Done").map(current.prop("XP")).sum() +
prop("Good Habits").filter(current.prop("Done") == true).map(current.prop("XP")).sum() +
prop("Journal").filter(current.prop("Logged") == true).map(current.prop("XP")).sum() -
prop("Bad Habits").filter(current.prop("Checked") == true).map(current.prop("XP")).sum()
prop("Tasks").filter(current.prop("Status") == "Done").map(current.prop("XP")).sum() +
prop("Good Habits").filter(current.prop("Done") == true).map(current.prop("XP")).sum() +
prop("Journal").filter(current.prop("Logged") == true).map(current.prop("XP")).sum() -
prop("Bad Habits").filter(current.prop("Checked") == true).map(current.prop("XP")).sum()
prop("Tasks").filter(current.prop("Status") == "Done").map(current.prop("XP")).sum() +
prop("Good Habits").filter(current.prop("Done") == true).map(current.prop("XP")).sum() +
prop("Journal").filter(current.prop("Logged") == true).map(current.prop("XP")).sum() -
prop("Bad Habits").filter(current.prop("Checked") == true).map(current.prop("XP")).sum()

All Time Coins

prop("Tasks").filter(current.prop("Status") == "Done").map(current.prop("Coins")).sum() +
prop("Good Habits").filter(current.prop("Done") == true).map(current.prop("Coins")).sum() +
prop("Journal").filter(current.prop("Logged") == true).map(current.prop("Coins")).sum() -
prop("Bad Habits").filter(current.prop("Checked") == true).map(current.prop("Coins")).sum()
prop("Tasks").filter(current.prop("Status") == "Done").map(current.prop("Coins")).sum() +
prop("Good Habits").filter(current.prop("Done") == true).map(current.prop("Coins")).sum() +
prop("Journal").filter(current.prop("Logged") == true).map(current.prop("Coins")).sum() -
prop("Bad Habits").filter(current.prop("Checked") == true).map(current.prop("Coins")).sum()
prop("Tasks").filter(current.prop("Status") == "Done").map(current.prop("Coins")).sum() +
prop("Good Habits").filter(current.prop("Done") == true).map(current.prop("Coins")).sum() +
prop("Journal").filter(current.prop("Logged") == true).map(current.prop("Coins")).sum() -
prop("Bad Habits").filter(current.prop("Checked") == true).map(current.prop("Coins")).sum()
prop("Tasks").filter(current.prop("Status") == "Done").map(current.prop("Coins")).sum() +
prop("Good Habits").filter(current.prop("Done") == true).map(current.prop("Coins")).sum() +
prop("Journal").filter(current.prop("Logged") == true).map(current.prop("Coins")).sum() -
prop("Bad Habits").filter(current.prop("Checked") == true).map(current.prop("Coins")).sum()

Add more lines for Goals, Projects, Milestones, whatever you built.

Notice the minus for Bad Habits. They subtract from your total.

And you can mix both formulas into just one (like the image)

Step 8: Level System

Create a Level formula:

floor(prop("All Time XP") / 1000)
floor(prop("All Time XP") / 1000)
floor(prop("All Time XP") / 1000)
floor(prop("All Time XP") / 1000)

Every 1000 XP, you level up.

Then let's make it look Aesthetic with this Formula:

let(
  xp, prop("All Time XP"),
  level, floor(xp / 100),
  current, xp - (level * 100),
  bar, "▰".repeat(floor(current / 10)) + "▱".repeat(10 - floor(current / 10)),
  "Level " + format(level) + " " + bar + " " + format(current) + "/100 XP"
)
let(
  xp, prop("All Time XP"),
  level, floor(xp / 100),
  current, xp - (level * 100),
  bar, "▰".repeat(floor(current / 10)) + "▱".repeat(10 - floor(current / 10)),
  "Level " + format(level) + " " + bar + " " + format(current) + "/100 XP"
)
let(
  xp, prop("All Time XP"),
  level, floor(xp / 100),
  current, xp - (level * 100),
  bar, "▰".repeat(floor(current / 10)) + "▱".repeat(10 - floor(current / 10)),
  "Level " + format(level) + " " + bar + " " + format(current) + "/100 XP"
)
let(
  xp, prop("All Time XP"),
  level, floor(xp / 100),
  current, xp - (level * 100),
  bar, "▰".repeat(floor(current / 10)) + "▱".repeat(10 - floor(current / 10)),
  "Level " + format(level) + " " + bar + " " + format(current) + "/100 XP"
)

Now you see exactly where you stand.

Step 9: Track What You Missed

Most systems celebrate wins.This one tracks failures too.

Missed XP (Same for Coins)

prop("Tasks").filter(current.prop("Status") != "Done" and current.prop("Date") < today()).map(current.prop("XP")).sum() +
prop("Good Habits").filter(current.prop("Done") != true and current.prop("Date") < today()).map(current.prop("XP")).sum()
prop("Tasks").filter(current.prop("Status") != "Done" and current.prop("Date") < today()).map(current.prop("XP")).sum() +
prop("Good Habits").filter(current.prop("Done") != true and current.prop("Date") < today()).map(current.prop("XP")).sum()
prop("Tasks").filter(current.prop("Status") != "Done" and current.prop("Date") < today()).map(current.prop("XP")).sum() +
prop("Good Habits").filter(current.prop("Done") != true and current.prop("Date") < today()).map(current.prop("XP")).sum()
prop("Tasks").filter(current.prop("Status") != "Done" and current.prop("Date") < today()).map(current.prop("XP")).sum() +
prop("Good Habits").filter(current.prop("Done") != true and current.prop("Date") < today()).map(current.prop("XP")).sum()

Past tasks undone. Habits skipped. XP lost forever.

This number grows when you slack. It should hurt.

Step 10: Discipline Tracker

Create a formula that shows your true consistency:

let(
  totalTasks, prop("Tasks").length(),
  doneTasks, prop("Tasks").filter(current.prop("Status") == "Done").length(),
  totalHabits, prop("Good Habits").length(),
  doneHabits, prop("Good Habits").filter(current.prop("Done") == true).length(),
  total, totalTasks + totalHabits,
  done, doneTasks + doneHabits,
  percent, if(total == 0, 0, floor(done / total * 100)),
  
  ifs(
    percent >= 90, style("Discipline: " + format(percent) + "% 🔥", "pink", "b"),
    percent >= 70, style("Discipline: " + format(percent) + "% 💪", "blue", "b"),
    percent >= 50, style("Discipline: " + format(percent) + "% ⚡", "yellow", "b"),
    true, style("Discipline: " + format(percent) + "% 😤", "red", "b")
  )
)
let(
  totalTasks, prop("Tasks").length(),
  doneTasks, prop("Tasks").filter(current.prop("Status") == "Done").length(),
  totalHabits, prop("Good Habits").length(),
  doneHabits, prop("Good Habits").filter(current.prop("Done") == true).length(),
  total, totalTasks + totalHabits,
  done, doneTasks + doneHabits,
  percent, if(total == 0, 0, floor(done / total * 100)),
  
  ifs(
    percent >= 90, style("Discipline: " + format(percent) + "% 🔥", "pink", "b"),
    percent >= 70, style("Discipline: " + format(percent) + "% 💪", "blue", "b"),
    percent >= 50, style("Discipline: " + format(percent) + "% ⚡", "yellow", "b"),
    true, style("Discipline: " + format(percent) + "% 😤", "red", "b")
  )
)
let(
  totalTasks, prop("Tasks").length(),
  doneTasks, prop("Tasks").filter(current.prop("Status") == "Done").length(),
  totalHabits, prop("Good Habits").length(),
  doneHabits, prop("Good Habits").filter(current.prop("Done") == true).length(),
  total, totalTasks + totalHabits,
  done, doneTasks + doneHabits,
  percent, if(total == 0, 0, floor(done / total * 100)),
  
  ifs(
    percent >= 90, style("Discipline: " + format(percent) + "% 🔥", "pink", "b"),
    percent >= 70, style("Discipline: " + format(percent) + "% 💪", "blue", "b"),
    percent >= 50, style("Discipline: " + format(percent) + "% ⚡", "yellow", "b"),
    true, style("Discipline: " + format(percent) + "% 😤", "red", "b")
  )
)
let(
  totalTasks, prop("Tasks").length(),
  doneTasks, prop("Tasks").filter(current.prop("Status") == "Done").length(),
  totalHabits, prop("Good Habits").length(),
  doneHabits, prop("Good Habits").filter(current.prop("Done") == true).length(),
  total, totalTasks + totalHabits,
  done, doneTasks + doneHabits,
  percent, if(total == 0, 0, floor(done / total * 100)),
  
  ifs(
    percent >= 90, style("Discipline: " + format(percent) + "% 🔥", "pink", "b"),
    percent >= 70, style("Discipline: " + format(percent) + "% 💪", "blue", "b"),
    percent >= 50, style("Discipline: " + format(percent) + "% ⚡", "yellow", "b"),
    true, style("Discipline: " + format(percent) + "% 😤", "red", "b")
  )
)

Above 90%? You are on fire. Below 50%? The game is disappointed.

Step 11: Create Challenges

Create a Challenges database:

  • Name (Text)

  • Target (Number)

  • Challenge Type (Select: Tasks, Habits, Journal, Projects)

  • Character (Relation)

  • Challenge Started (Checkbox)

  • Puzzles (Number)

  • Level Reward (Number)

Progress formula:

let(
  char, prop("Character").first(),
  type, prop("Challenge Type"),
  target, prop("Target"),
  
  done, ifs(
    type == "Tasks", char.prop("Tasks").filter(current.prop("Status") == "Done").length(),
    type == "Habits", char.prop("Good Habits").filter(current.prop("Done") == true).length(),
    type == "Journal", char.prop("Journal").filter(current.prop("Logged") == true).length(),
    true, 0
  ),
  
  min(done / target, 1)
)
let(
  char, prop("Character").first(),
  type, prop("Challenge Type"),
  target, prop("Target"),
  
  done, ifs(
    type == "Tasks", char.prop("Tasks").filter(current.prop("Status") == "Done").length(),
    type == "Habits", char.prop("Good Habits").filter(current.prop("Done") == true).length(),
    type == "Journal", char.prop("Journal").filter(current.prop("Logged") == true).length(),
    true, 0
  ),
  
  min(done / target, 1)
)
let(
  char, prop("Character").first(),
  type, prop("Challenge Type"),
  target, prop("Target"),
  
  done, ifs(
    type == "Tasks", char.prop("Tasks").filter(current.prop("Status") == "Done").length(),
    type == "Habits", char.prop("Good Habits").filter(current.prop("Done") == true).length(),
    type == "Journal", char.prop("Journal").filter(current.prop("Logged") == true).length(),
    true, 0
  ),
  
  min(done / target, 1)
)
let(
  char, prop("Character").first(),
  type, prop("Challenge Type"),
  target, prop("Target"),
  
  done, ifs(
    type == "Tasks", char.prop("Tasks").filter(current.prop("Status") == "Done").length(),
    type == "Habits", char.prop("Good Habits").filter(current.prop("Done") == true).length(),
    type == "Journal", char.prop("Journal").filter(current.prop("Logged") == true).length(),
    true, 0
  ),
  
  min(done / target, 1)
)

Challenge Done formula:

prop("Progress") >= 1 and prop("Challenge Started") == true
prop("Progress") >= 1 and prop("Challenge Started") == true
prop("Progress") >= 1 and prop("Challenge Started") == true
prop("Progress") >= 1 and prop("Challenge Started") == true

Aesthetic Progress formula:

let(
  name, prop("Character").map(current.prop("Name")).join(", "),
  prog, min(prop("Progress"), 1),
  percent, floor(prog * 100),
  bar, "—".repeat(floor(prog * 10)) + "⌾" + "—".repeat(10 - floor(prog * 10) - 1),
  
  ifs(
    not prop("Challenge Started"), style(name + ", start the challenge 🏁", "white", "b"),
    prog >= 1, style(name + ", challenge completed 🔥", "pink", "b"),
    true, style("Progress: " + bar + " " + format(percent) + "%", "purple", "b")
  )
)
let(
  name, prop("Character").map(current.prop("Name")).join(", "),
  prog, min(prop("Progress"), 1),
  percent, floor(prog * 100),
  bar, "—".repeat(floor(prog * 10)) + "⌾" + "—".repeat(10 - floor(prog * 10) - 1),
  
  ifs(
    not prop("Challenge Started"), style(name + ", start the challenge 🏁", "white", "b"),
    prog >= 1, style(name + ", challenge completed 🔥", "pink", "b"),
    true, style("Progress: " + bar + " " + format(percent) + "%", "purple", "b")
  )
)
let(
  name, prop("Character").map(current.prop("Name")).join(", "),
  prog, min(prop("Progress"), 1),
  percent, floor(prog * 100),
  bar, "—".repeat(floor(prog * 10)) + "⌾" + "—".repeat(10 - floor(prog * 10) - 1),
  
  ifs(
    not prop("Challenge Started"), style(name + ", start the challenge 🏁", "white", "b"),
    prog >= 1, style(name + ", challenge completed 🔥", "pink", "b"),
    true, style("Progress: " + bar + " " + format(percent) + "%", "purple", "b")
  )
)
let(
  name, prop("Character").map(current.prop("Name")).join(", "),
  prog, min(prop("Progress"), 1),
  percent, floor(prog * 100),
  bar, "—".repeat(floor(prog * 10)) + "⌾" + "—".repeat(10 - floor(prog * 10) - 1),
  
  ifs(
    not prop("Challenge Started"), style(name + ", start the challenge 🏁", "white", "b"),
    prog >= 1, style(name + ", challenge completed 🔥", "pink", "b"),
    true, style("Progress: " + bar + " " + format(percent) + "%", "purple", "b")
  )
)

Complete challenges. Earn puzzles and extra Levels.

Step 12: Create Titles

Create a Titles database:

Title

Puzzles Required

Booster

Newcomer

0

1x

Rising Star

5

1.15x

Goal Crusher

15

1.3x

Elite Performer

30

1.5x

Grand Master

50

1.75x

Champion

75

2x

Unstoppable

100

2.5x

In Character, create Total Puzzles:

prop("Challenges").filter(current.prop("Challenge Done") == true).map(current.prop("Puzzles")).sum()
prop("Challenges").filter(current.prop("Challenge Done") == true).map(current.prop("Puzzles")).sum()
prop("Challenges").filter(current.prop("Challenge Done") == true).map(current.prop("Puzzles")).sum()
prop("Challenges").filter(current.prop("Challenge Done") == true).map(current.prop("Puzzles")).sum()

Create Current Title:

let(
  puzzles, prop("Total Puzzles"),
  earned, prop("Titles").filter(puzzles >= current.prop("Puzzles Required")),
  best, earned.sort(current.prop("Puzzles Required")).last(),
  if(empty(earned), "No title yet", "🎖️ " + best.prop("Name"))
)
let(
  puzzles, prop("Total Puzzles"),
  earned, prop("Titles").filter(puzzles >= current.prop("Puzzles Required")),
  best, earned.sort(current.prop("Puzzles Required")).last(),
  if(empty(earned), "No title yet", "🎖️ " + best.prop("Name"))
)
let(
  puzzles, prop("Total Puzzles"),
  earned, prop("Titles").filter(puzzles >= current.prop("Puzzles Required")),
  best, earned.sort(current.prop("Puzzles Required")).last(),
  if(empty(earned), "No title yet", "🎖️ " + best.prop("Name"))
)
let(
  puzzles, prop("Total Puzzles"),
  earned, prop("Titles").filter(puzzles >= current.prop("Puzzles Required")),
  best, earned.sort(current.prop("Puzzles Required")).last(),
  if(empty(earned), "No title yet", "🎖️ " + best.prop("Name"))
)

Create Points Booster:

let(
  puzzles, prop("Total Puzzles"),
  earned, prop("Titles").filter(puzzles >= current.prop("Puzzles Required")),
  if(empty(earned), 1, earned.map(current.prop("Booster")).max())
)
let(
  puzzles, prop("Total Puzzles"),
  earned, prop("Titles").filter(puzzles >= current.prop("Puzzles Required")),
  if(empty(earned), 1, earned.map(current.prop("Booster")).max())
)
let(
  puzzles, prop("Total Puzzles"),
  earned, prop("Titles").filter(puzzles >= current.prop("Puzzles Required")),
  if(empty(earned), 1, earned.map(current.prop("Booster")).max())
)
let(
  puzzles, prop("Total Puzzles"),
  earned, prop("Titles").filter(puzzles >= current.prop("Puzzles Required")),
  if(empty(earned), 1, earned.map(current.prop("Booster")).max())
)

Your title multiplies your XP. Higher title, faster growth.

Step 13: Create Rewards

Create a Rewards database:

  • Reward Name (Text)

  • Cost (Number)

  • Required Level (Number)

  • Character (Relation)

  • Purchased (Checkbox)

Can Claim formula:

let(
  char, prop("Character").first(),
  coins, char.prop("All Time Coins"),
  level, char.prop("Level"),
  
  ifs(
    prop("Purchased"), style("Purchased ✓", "green", "b"),
    coins >= prop("Cost") and level >= prop("Required Level"), style("Unlocked 🔓", "pink", "b"),
    level < prop("Required Level"), style("Reach Level " + format(prop("Required Level")), "gray", "b"),
    true, style("Need " + format(prop("Cost") - coins) + " more Coins", "gray", "b")
  )
)
let(
  char, prop("Character").first(),
  coins, char.prop("All Time Coins"),
  level, char.prop("Level"),
  
  ifs(
    prop("Purchased"), style("Purchased ✓", "green", "b"),
    coins >= prop("Cost") and level >= prop("Required Level"), style("Unlocked 🔓", "pink", "b"),
    level < prop("Required Level"), style("Reach Level " + format(prop("Required Level")), "gray", "b"),
    true, style("Need " + format(prop("Cost") - coins) + " more Coins", "gray", "b")
  )
)
let(
  char, prop("Character").first(),
  coins, char.prop("All Time Coins"),
  level, char.prop("Level"),
  
  ifs(
    prop("Purchased"), style("Purchased ✓", "green", "b"),
    coins >= prop("Cost") and level >= prop("Required Level"), style("Unlocked 🔓", "pink", "b"),
    level < prop("Required Level"), style("Reach Level " + format(prop("Required Level")), "gray", "b"),
    true, style("Need " + format(prop("Cost") - coins) + " more Coins", "gray", "b")
  )
)
let(
  char, prop("Character").first(),
  coins, char.prop("All Time Coins"),
  level, char.prop("Level"),
  
  ifs(
    prop("Purchased"), style("Purchased ✓", "green", "b"),
    coins >= prop("Cost") and level >= prop("Required Level"), style("Unlocked 🔓", "pink", "b"),
    level < prop("Required Level"), style("Reach Level " + format(prop("Required Level")), "gray", "b"),
    true, style("Need " + format(prop("Cost") - coins) + " more Coins", "gray", "b")
  )
)

You need coins and a level. Buy a reward? Those coins are spent.
Add that to your All Time Coins formula as a subtraction.

The Hard Truth

This system works. I use it every day.

But building it from scratch? Hours of work. Formulas that break. Relations that tangle.

Most people quit halfway.

Notion Game Mode V3 Is Coming

The next version of My Personal Gamified Second Brain takes it further.

Character with new skills to level up. Each has its own progression path. Each requires special tokens earned from challenges. You can exchange a new token and trade it for XP or Coins.

New ranks require reaching a skills level to unlock them, which therefore boosts character progress.

A new Rare token (Total 5 new tokens now). You earn it only by logging in daily. Miss a day, gone forever, just like real games.

You can skip an entire hard challenge if you've enough of the new token.

And more features, I can't say much right now, but we built it to help you become more motivated to get things done.

Get Second Brain 6.0 (Game Mode Version) and receive the next Game Mode v3 update for Free when it launches

-> Get Second Brain 6.0 🧠

Note: Game Mode Lunch will be in Feb 2026

Start Free

Cannot afford it right now?I built two free templates.

Life Game Mode: Full gamification. Character. Challenges. Rewards. Level system.

-> Download Life Game Mode

Student Game Mode: Built for students. Gamify your assignments and studying.

-> Download Student Game Mode

Your Move

You read this far for a reason.

The people who play this game do not wait for motivation.

They build systems that pull them forward.

Will you play?

You may also want to read

You may also want to read

OLSNOTION

When you join my email list, it’s not just about free products or premium offers. Every time my email pops up, you know it’s packed with value, something to elevate your day beyond anything else

© 2025 OLSNOTION. All rights reserved.

OLSNOTION

When you join my email list, it’s not just about free products or premium offers. Every time my email pops up, you know it’s packed with value, something to elevate your day beyond anything else

© 2025 OLSNOTION. All rights reserved.

OLSNOTION

When you join my email list, it’s not just about free products or premium offers. Every time my email pops up, you know it’s packed with value, something to elevate your day beyond anything else

© 2025 OLSNOTION. All rights reserved.

OLSNOTION

When you join my email list, it’s not just about free products or premium offers. Every time my email pops up, you know it’s packed with value, something to elevate your day beyond anything else

© 2025 OLSNOTION. All rights reserved.