It's week 6 of the semester. You have a Calculus III midterm Tuesday, an Organic Chemistry problem set due Wednesday, a Physics lab report Friday, and you just realized your Linear Algebra professor moved a quiz up by a week. Your "system" is three notebooks, a Google Calendar you stopped updating in week 2, and a Discord channel where classmates post deadline reminders at 2 AM.
I went through this exact spiral my sophomore year as a mechanical engineering major taking 17 credits. I ended the semester with a 3.1 GPA despite knowing the material — I was bleeding points on missed homework submissions and miscalculated exam weights. One course I thought I was getting a B+ in ended as a C because I didn't realize the final was 40% of the grade, not 25%.
If you assume each letter grade drop on a single course costs you roughly 0.1 GPA across a 5-course semester, and your target scholarship or grad school cutoff is 3.5, missing the tracking layer can cost you a \$5,000–\$20,000 scholarship renewal, or a grad school admission entirely. That's not hypothetical — NSF GRFP, Goldwater, and most REU programs filter on GPA first.
This article is the system I rebuilt over three semesters. By senior year I was taking 18 credits of graduate-level courses, TAing, and running research, and I still knew my exact grade in every class within ±0.5% on any given Tuesday. Here's how.
Why spreadsheets and paper planners fail STEM undergrads
Before the system, here's what I tried:
- Paper bullet journal. Beautiful for one week. Dead by week 4 because rewriting weighted grade formulas by hand is miserable.
- Google Sheets per course. Worked for grades. Useless for deadlines, readings, and lab prep. Five tabs, no cross-view.
- Google Calendar + Canvas. Canvas only shows what instructors bother to post. Half my chem professors posted problem sets as PDFs with due dates buried on page 3.
- Todoist. Great for tasks. Doesn't do weighted GPA math. Doesn't tell you which assignment to prioritize when you have 6 hours and 11 open tasks.
The core problem: STEM semesters have four overlapping layers that most tools only handle one of.
| Layer | What it tracks | Tool most people use | Why it fails |
|---|---|---|---|
| Deadlines | Due dates, exam dates | Calendar | No weight/priority |
| Grades | Assignment scores, weights | Spreadsheet | Not linked to deadlines |
| Content | Lecture notes, readings | Notability/paper | Siloed per course |
| Strategy | What to study, when | Vibes | No data behind choice |
You need one surface where all four touch. Notion is the only free-ish tool flexible enough to model this without writing an app. (I tried writing the app. Don't write the app. Finish your degree.)
The 4-database architecture that actually works
After two rebuilds, I landed on four linked Notion databases. That's it. Not ten. Not a dashboard with 40 views. Four.
- Courses — one row per course you're taking this semester
- Assignments — one row per gradable item (PSets, quizzes, labs, exams, projects)
- Sessions — one row per study/work block you actually do
- Resources — textbooks, problem sets, solutions, lecture recordings
Here's the minimal schema. Create this in Notion right now if you want — it takes about 25 minutes.
Courses database
- Name (title)
- Code (e.g., MATH 241)
- Credits (number)
- Professor (text)
- Current Grade % (rollup from Assignments)
- Projected Letter (formula)
- Target Grade (select: A, A-, B+, ...)
- Syllabus URL (url)
Assignments database
- Name (title)
- Course (relation → Courses)
- Type (select: PSet, Quiz, Lab, Midterm, Final, Project, Participation)
- Weight % (number — what % of the course this single item is)
- Score (number, 0–100)
- Max Score (number)
- Due Date (date)
- Status (select: Not Started, In Progress, Submitted, Graded)
- Estimated Hours (number)
The GPA formula that removes guesswork
This is the one piece of math most students get wrong. The formula for your current course grade (assuming percentage-based weighting) is:
current_grade = sum(score_i / max_i * weight_i) / sum(weight_i_graded)
Not sum(score_i * weight_i) / 100. That only works if every assignment is graded. Mid-semester, you've only completed maybe 40% of the weight, so you need to normalize by graded weight to see your actual standing.
In Notion, the Current Grade % rollup on Courses uses this formula across Assignments where Status = Graded. Then Projected Letter is a simple if-chain:
if(prop("Current Grade %") >= 93, "A",
if(prop("Current Grade %") >= 90, "A-",
if(prop("Current Grade %") >= 87, "B+",
if(prop("Current Grade %") >= 83, "B",
if(prop("Current Grade %") >= 80, "B-", "C or below")))))
Check your school's exact cutoffs — some use 94/90/87, some use 93/90/87. Getting this one constant wrong cost me a grade point once.
The "what do I do right now" problem
Having four databases means nothing if you open Notion on a Sunday night and still can't decide what to work on. This is where most Notion-for-students templates fall apart — they're pretty dashboards with no decision logic.
I borrowed from the RICE framework (Reach, Impact, Confidence, Effort) used in product management and simplified it for coursework:
priority_score = (weight_percent * urgency_multiplier) / estimated_hours
where urgency_multiplier =
4 if due within 24h
3 if due within 72h
2 if due within 7 days
1 otherwise
Add a formula property on Assignments called Priority. Sort your "This Week" view by Priority descending. The top item is what you work on. No more staring at the ceiling.
Example from my junior year, Tuesday 7 PM:
| Assignment | Weight | Hours | Due | Priority |
|---|---|---|---|---|
| Thermo PSet 6 | 5% | 4 | Wed 5 PM | (5×4)/4 = 5.0 |
| Diff Eq Quiz prep | 10% | 3 | Thu 10 AM | (10×3)/3 = 10.0 |
| Materials Lab report | 8% | 6 | Fri 11 PM | (8×3)/6 = 4.0 |
| Senior design meeting prep | 2% | 1 | Wed 3 PM | (2×4)/1 = 8.0 |
Diff Eq quiz wins, even though the thermo PSet is due sooner. 10% weight in 3 hours beats 5% weight in 4 hours. The math is unintuitive until you see it laid out.
A realistic week: how Maya uses the system
Maya is a bioengineering sophomore (not real, but every detail is from students I've actually talked to). Here's a compressed week.
Sunday, 8 PM — Weekly planning, 20 minutes.
Maya opens the "This Week" view filtered to
Due Date ≤ today + 7 days. She sees 9 assignments. She checks each one's Estimated Hours — sum is 34 hours. She has about 28 hours of study time blocked. Something has to give.
She uses the Priority sort. The bottom two items are a low-weight discussion post (1%) and an optional extra-credit problem. She marks them Status: Deferred and moves on. This is the part that feels wrong the first time and correct forever after.
Monday, 2 PM — Between classes.
Organic chem professor announces Exam 2 is moved up one week. Maya adds it to Assignments right there on her phone. Due Date: next Tuesday. Weight: 20%. Estimated Hours: 12. The Priority score jumps to the top of her list immediately.
Wednesday, 11 PM — Post-lab debrief, 5 minutes.
She updates the Materials Lab assignment: Status → Submitted, Actual Hours → 7 (estimated 6). That one-minute log is what makes her future estimates accurate. By week 8 her estimates are within 15% of actuals.
Friday, 4 PM — Grade posted.
Diff Eq Quiz 3: 88/100. She enters Score = 88. The Courses database rollup updates automatically. Current Grade % in Diff Eq dropped from 91.2 to 89.6. She's now at A- projected, not A. She opens the course page and adds a note: "Need 92+ on Quiz 4 to recover A. Review ch.7 series solutions this weekend."
That's the entire loop. Plan weekly, log in the moment, review when grades post. Total overhead: about 45 minutes a week.
The lecture note pattern that compounds
Separate issue, same database system. STEM lecture notes are unique because:
- They're ~60% equations and diagrams that you can't usefully type in Markdown
- You'll reference them 4 weeks later when a PSet question is "similar to Example 3 from Oct 14"
- You need to link them to specific assignments
My rule: notes live outside Notion, metadata lives inside.
Take notes in whatever works for your handwriting (Notability, GoodNotes, paper + scanner). In Notion's Resources database, create one row per lecture with:
- Course (relation)
- Date
- Topic
- Key Concepts (multi-select — e.g., "Laplace transforms", "convolution")
- File URL (link to the PDF/scan)
- Related Assignments (relation → Assignments)
When PSet 5 asks about Laplace transforms, you filter Resources by that concept tag and get back every lecture, recitation, and office-hours note that touched it. This took me from spending 40 minutes finding the right page to 30 seconds.
This is the same pattern as the Zettelkasten method, stripped down. You don't need the full atomic-notes cult. You need tags and backlinks.
Exam prep: the reverse-engineering method
Two weeks before an exam, create one Assignment row called "Exam 2 Prep — CHEM 241" with Status = In Progress. Then open a toggle block under it and run this checklist:
- [ ] List every topic from the syllabus in the exam's scope
- [ ] For each topic, rate confidence 1–5
- [ ] Pull every related PSet problem from Resources (filter by topic tag)
- [ ] Identify 3 problems per low-confidence topic to redo cold (no notes)
- [ ] Schedule 3 Sessions in the next 10 days, each 90 minutes
- [ ] Book one office-hours slot for the lowest-confidence topic
- [ ] Day-before: one pass through your own summary sheet only, no new problems
- [ ] Night-before: 7+ hours sleep, no caffeine after 2 PM
The confidence rating is the part most students skip and the part that matters most. Cramming uniformly across all topics is the #1 inefficiency in undergrad studying. If you're a 5/5 on stoichiometry and a 2/5 on kinetics, every hour on stoichiometry is wasted.
This is essentially a 5 Whys-style self-audit applied to knowledge gaps. Ask yourself "why am I not a 5 on this?" until you hit a concrete missing concept, then target that.
The "grade goal" backward pass
Here's a trick I wish someone had told me freshman year. At the start of each semester, for each course, run this calculation:
# What score do I need on remaining work to hit my target?
target_grade = 90 # A-
current_weighted_score = 42 # points earned so far (out of 45 weight graded)
graded_weight = 45 # percent of course already graded
remaining_weight = 100 - graded_weight
needed_points = target_grade - current_weighted_score
needed_avg_on_remaining = (needed_points / remaining_weight) * 100
print(f"You need {needed_avg_on_remaining:.1f}% average on remaining {remaining_weight}% of work")
# You need 87.3% average on remaining 55% of work
Put this as a formula on your Courses database. Call it "Required Average to Hit Target". When it says 94.2%, you know the A is basically gone and you should reallocate time to a course where the number is 82%.
This is the single piece of information that would have saved my sophomore-year GPA. I was grinding equally on all five classes. Three of them were locked in either direction — only two were actually movable. I spent 40% of my effort on courses where the outcome wouldn't change.
What most Notion student templates get wrong
I've bought or tried probably 15 Notion templates for students over the years. The failure patterns:
- Too many databases. If your template has "Habits", "Mood Tracker", "Workout Log", "Gratitude Journal", and "Book Library", it's not a semester system. It's a lifestyle cosplay.
- No formulas. Pretty tables that don't calculate anything. You end up doing the math in a calculator and typing the result in. That's worse than a spreadsheet.
- Aesthetic > function. Four colors of callout boxes, emoji headers for every section, cover images that reload every time. Notion is slow enough already.
- Generic assignment types. "Homework / Test / Project". STEM needs PSet, Lab, Quiz, Midterm, Final, Project, Participation, and sometimes Recitation. Weight distributions differ wildly.
- No GPA math. This is the biggest one. They'll give you a course tracker but no current-grade rollup, no projected letter, no required-average-to-target formula.
If you build your own from the schema above, you'll beat 90% of paid templates. I mean that. The schema is the system.
Setup checklist: do this in one sitting
Block 90 minutes. Coffee. No phone.
- [ ] Create the four databases (Courses, Assignments, Sessions, Resources)
- [ ] Add all 5 courses with syllabus URLs
- [ ] Open each syllabus PDF. Enter every assignment you can see with weight and due date. This takes 45 min and it's the most important 45 min of your semester.
- [ ] Add the Current Grade % rollup on Courses
- [ ] Add the Projected Letter formula
- [ ] Add the Priority formula on Assignments
- [ ] Create three views: "This Week", "All Upcoming", "Needs Grade Entry"
- [ ] Set a recurring Sunday 8 PM reminder: "Weekly plan, 20 min"
- [ ] Set a recurring Friday 5 PM reminder: "Enter all grades posted this week"
That's the minimum viable system. Everything after this is refinement.
When to upgrade your system
Stick with the minimum for at least 4 weeks. Then, if you're feeling friction, add:
- A Sessions view that shows actual vs. estimated hours, so you calibrate
- A per-course sub-page with concept tags and confidence ratings
- A "Scholarship / Grad School" tracker linked to cumulative GPA
- A TA/office hours schedule embedded in each course page
- Integration with Google Calendar via Notion's built-in sync
Don't add any of this in week 1. You'll spend your setup energy on the wrong layer and abandon the whole thing by week 3.
The honest limitation
This system assumes you're willing to spend ~45 minutes a week maintaining it. If you won't, no system works and you're better off with paper. The ROI kicks in around week 3 when the grade rollups start showing you things you didn't know — usually that one course is doing worse than you thought and another is doing better.
Also: the system tracks. It doesn't study for you. Plenty of students with perfect Notion setups fail exams because the dashboard became the procrastination.
If you'd rather skip the 90-minute build
I rebuilt this system three times across my undergrad and once more when my younger sister started engineering school. After the fourth rebuild I stopped rebuilding and packaged it.
STEM Semester OS for Undergrads is the exact Notion workspace I described above, pre-built with:
- 4 linked databases with every property, rollup, and formula from this article
- GPA calculator across up to 5 courses with cumulative multi-semester rollover
- Pre-built views: This Week, Priority Queue, Grade Entry Needed, Exam Prep
- The Priority formula, Projected Letter formula, and Required Average to Target formula already wired in
- Exam prep toggle template with the reverse-engineering checklist
- A 10-minute setup walkthrough so you're running before your next lecture
It's \$19, which is roughly the cost of one textbook chapter rental, and it saves the 90 minutes of schema building plus the inevitable 2–3 hours of formula debugging when your rollups don't calculate the way you expect. (Notion rollup syntax has edge cases. I've hit all of them.)
If you'd rather build it yourself from this article, genuinely — do that. Everything you need is above. The paid version exists for people who want to skip the plumbing and start tracking grades tonight.
Want the complete STEM Semester OS I used? View on Gumroad →
Top comments (0)