Chapter 6: TODO Items and Workflow - Getting Things Done (Your Way)
Here’s where Org-Mode transforms from “nice note-taking tool” to “life management system.” TODO items turn ordinary headings into actionable tasks, and Org-Mode’s workflow features let you track them with precision that would make a project manager weep with joy.
1. The Simplest TODO
Add TODO before any heading text:
#+begin_example
2. TODO Write chapter on TODO items
3. TODO Buy groceries
4. TODO Achieve inbox zero (optimistic)
#+end_example
That’s it. The heading is now a task.
Press C-c C-t (Control-c Control-t) on a TODO item to cycle its state:
TODO → DONE → (no keyword)
Press it again:
(no keyword) → TODO → DONE → (no keyword)
Marking something DONE feels unreasonably satisfying. Try it.
5. TODO Keywords: Beyond Binary
Binary TODO/DONE is limiting. Real workflows have intermediate states. Configure custom keywords:
(setq org-todo-keywords '((sequence "TODO(t)" "IN-PROGRESS(i)" "WAITING(w)" "|" "DONE(d)" "CANCELLED(c)")))
The | separates “not done” from “done” states. Now your workflow becomes:
#+begin_example
6. TODO Write draft
7. IN-PROGRESS Review code
8. WAITING Approval from client
9. DONE Deploy to production
10. CANCELLED Deprecated feature
#+end_example
C-c C-t cycles through all states. The letter in parentheses (like (t)) is a quick-access key: C-c C-t t jumps directly to TODO.
10.1. Multiple Workflows
Different projects need different workflows:
(setq org-todo-keywords '((sequence "TODO(t)" "IN-PROGRESS(i)" "|" "DONE(d)") (sequence "BUG(b)" "INVESTIGATING(v)" "|" "FIXED(f)") (sequence "IDEA(e)" "PLANNING(p)" "|" "IMPLEMENTED(m)" "REJECTED(r)")))
Choose workflow per heading with C-c C-t then selecting the sequence.
Or set workflow per-file:
#+TODO: TODO IN-PROGRESS WAITING | DONE CANCELLED #+TODO: DRAFT REVIEW | PUBLISHED
10.2. Visual Distinction
Keywords can have colors and faces:
(setq org-todo-keyword-faces '(("TODO" . org-warning) ("IN-PROGRESS" . "yellow") ("WAITING" . "orange") ("CANCELLED" . "blue") ("DONE" . "green")))
Now your tasks are color-coded. At a glance, see what’s urgent, in progress, or blocked.
11. Checkboxes vs. TODO Items
Remember checkboxes from Chapter 3?
#+begin_example
12. TODO Plan birthday party
[ ]Book venue[ ]Send invitations[ ]Order cake[ ]Buy decorations
#+end_example
When to use checkboxes:
- Sub-tasks that aren’t important enough for individual TODO items
- Steps that won’t appear in agenda views
- Quick lists within a larger task
When to use TODO items:
- Tasks you want in your agenda
- Items you’ll track separately
- Tasks with their own deadlines or schedules
Checkboxes are lightweight. TODO items are full-featured. Choose appropriately.
13. Priorities: The ABC’s of Urgency
Not all TODOs are equal. Add priorities:
#+begin_example
14. TODO Critical bug in production
15. TODO Update documentation
16. TODO Refactor old code
17. TODO Regular task (no priority)
#+end_example
Set priority with C-c , (Control-c comma):
- Type
afor priority A (highest) - Type
bfor priority B - Type
cfor priority C (lowest) SPCto remove priority
Priorities affect agenda view sorting (Chapter 8). Your critical items rise to the top.
18. Tracking State Changes
Want to know when something changed state? Add this to your config:
(setq org-log-done 'time) ; Log timestamp when marking DONE
Now when you mark something DONE:
#+begin_example
19. DONE Write documentation
#+end_example
For more detail:
(setq org-log-done 'note) ; Prompt for a note when marking DONE
You’ll get:
#+begin_example
20. DONE Fix authentication bug
- Note taken on
Fixed by updating token validation logic
#+end_example
Track your progress. Future you will wonder “when did I complete this?” Now you’ll know.
20.1. Tracking All State Changes
(setq org-log-into-drawer t) ; Keep logs in a LOGBOOK drawer
Per-keyword logging:
(setq org-todo-keywords '((sequence "TODO(t)" "IN-PROGRESS(i!)" "WAITING(w@/!)" "|" "DONE(d!)" "CANCELLED(c@)")))
!- Log timestamp@- Prompt for note@/!- Note when entering, timestamp when leaving
Now your tasks track their entire lifecycle:
#+begin_example
21. DONE Implement feature
#+end_example
This is project management gold.
22. Deadlines and Scheduling
Tasks need timeframes:
#+begin_example
23. TODO Submit quarterly report
24. TODO Weekly team meeting
#+end_example
Add deadlines with C-c C-d, schedules with C-c C-s. Both pop up a calendar interface.
DEADLINE - When something must be done. Org starts warning you in advance (default: 14 days).
SCHEDULED - When you plan to work on something. It appears in your agenda on that date.
24.1. The Difference Matters
#+begin_example
25. TODO Prepare presentation
DEADLINE: #+end_example
Translation: “I plan to start working on this Wednesday, but it must be done by Monday.”
In your agenda, this appears on the 10th (to remind you to start) and gets increasingly insistent as the 15th approaches.
25.1. Repeating Tasks
Some tasks recur:
#+begin_example
26. TODO Weekly review
27. TODO Pay rent
28. TODO Water plants
#+end_example
Repeating intervals:
+1w- Every week (if you mark it done late, next date calculates from original date).+1w- Every week from completion date (if done late, next date is 1 week from whenever you complete it)++1w- Every week, but never shows past dates (won’t accumulate missed instances)
Mark a repeating task DONE, and Org automatically creates the next instance. Your recurring tasks manage themselves.
29. Effort Estimates
How long will a task take?
#+begin_example
30. TODO Write documentation
#+end_example
That’s 2 hours, 30 minutes. Use C-c C-x e to set effort.
Configure standard effort values:
(setq org-global-properties '(("Effort_ALL" . "0:15 0:30 1:00 2:00 4:00 8:00")))
Now C-c C-x e offers completion from predefined values.
Why track effort? Because agenda views can show your task load, help plan your day, and warn when you’re overcommitted (Chapter 8).
31. Blocking and Dependencies
Some tasks can’t start until others finish. The built-in approach uses the :ORDERED: property on a parent heading:
#+begin_example
32. TODO Project
32.1. TODO Write code
32.2. TODO Write tests
#+end_example
Enable blocking:
(setq org-enforce-todo-dependencies t)
Now you can’t mark “Write tests” as DONE until “Write code” is complete. Org enforces task order within any heading that has :ORDERED: t.
For arbitrary dependencies between unrelated tasks (not parent/child), use the contributed org-depend.el or the org-edna package. Both support:
- Task chains
- Conditional triggers
- Scheduled dependencies
- Property-based logic
Project management in plain text.
33. Task Hierarchies
Tasks can contain subtasks:
#+begin_example
34. TODO Launch product [0/3]
34.1. TODO Design phase [0/2]
34.1.1. TODO Create mockups
34.1.2. TODO User testing
34.2. TODO Development phase
34.3. TODO Marketing phase
#+end_example
The [0/3] shows completion statistics (auto-calculated from child TODOs).
Configure:
(setq org-hierarchical-todo-statistics t) ; Count only direct children
Without this, statistics include all descendants (TODOs at any depth).
Mark subtasks done, and the parent updates automatically:
#+begin_example
35. TODO Launch product [1/3]
35.1. DONE Design phase [2/2]
35.1.1. DONE Create mockups
35.1.2. DONE User testing
35.2. TODO Development phase
35.3. TODO Marketing phase
#+end_example
Visual progress tracking without manual updates.
36. Breaking Down Large Tasks
Massive tasks paralyze. Break them down:
#+begin_example
37. TODO Write book
37.1. TODO Outline chapters
37.2. TODO Write chapter 1
37.3. TODO Write chapter 2
37.4. TODO Write chapter 3
…
37.5. TODO Edit complete manuscript
37.6. TODO Find publisher
#+end_example
Each subtask is manageable. The parent shows overall progress. Suddenly the impossible becomes achievable.
38. Task Refiling
As tasks evolve, they need to move. Press C-c C-w to refile a heading:
C-c C-wprompts for target location- Type to search for headings (with completion)
- Select destination
- Task moves, preserving metadata and subtasks
Configure refile targets:
(setq org-refile-targets '((org-agenda-files :maxlevel . 3) (nil :maxlevel . 3)))
This allows refiling to any heading (up to level 3) in your agenda files or current file.
Refiling keeps your system organized without manual cut-paste operations.
39. Task Templates and Inheritance
Properties can inherit from parent headings:
#+begin_example
40. Project: New Website
40.1. TODO Design homepage
40.2. TODO Implement backend
40.3. TODO Deploy
#+end_example
All subtasks inherit CATEGORY and CLIENT properties (if inheritance is enabled for those properties). Configure which properties inherit:
(setq org-use-property-inheritance '("CLIENT" "PROJECT"))
Define once, use everywhere.
41. Archiving Completed Tasks
Finished tasks clutter your files. Archive them:
#+begin_example
42. DONE Old project
#+end_example
Press C-c C-x C-a to archive. The task moves to an archive file (default: filename_archive.org), leaving your main file clean.
Configure archive location:
(setq org-archive-location "~/org/archive.org::* From %s")
The %s expands to the source filename. Your archive maintains context.
For one-off archive locations:
#+begin_example
43. DONE Special project
#+end_example
Archiving isn’t deletion—it’s organized storage of historical data.
44. Custom TODO Workflows: Real Examples
44.1. Software Development
(setq org-todo-keywords '((sequence "BACKLOG(b)" "TODO(t)" "IN-PROGRESS(i)" "CODE-REVIEW(r)" "|" "DONE(d)") (sequence "BUG(g)" "INVESTIGATING(v)" "|" "FIXED(f)") (sequence "|" "WONTFIX(w)" "DUPLICATE(u)")))
44.2. Writing Projects
(setq org-todo-keywords '((sequence "IDEA(i)" "DRAFT(d)" "REVISING(r)" "EDITING(e)" "|" "PUBLISHED(p)") (sequence "|" "REJECTED(x)")))
44.3. GTD (Getting Things Done)
(setq org-todo-keywords '((sequence "NEXT(n)" "TODO(t)" "WAITING(w)" "SOMEDAY(s)" "|" "DONE(d)" "CANCELLED(c)")))
Org-Mode adapts to your methodology, not the other way around.
45. Your Exercise
- Create a TODO list with at least 10 tasks
- Set different priorities on tasks
- Add deadlines to at least 3 tasks
- Add scheduled dates to at least 2 tasks
- Create a task hierarchy with parent/child TODOs
- Try different TODO states (configure custom keywords if you’re feeling brave)
- Create at least one repeating task
- Practice refiling tasks between headings
46. The Philosophy of TODO Management
Most task management apps force you into their workflow. Org-Mode provides primitives—TODO states, timestamps, properties—and lets you compose your own system.
Want GTD? Build it. Prefer Kanban? Configure it. Invented your own methodology? Implement it.
The best TODO system is the one you’ll actually use. Org-Mode gets out of your way and lets you work.
47. Next: Tags and Properties
TODO items tell you what to do. Tags and properties tell you how to categorize, search, and filter. They’re the metadata layer that transforms task lists into a queryable knowledge base. Let’s dive in.