← 5. Links and Images 7. Tags and Properties →

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 a for priority A (highest)
  • Type b for priority B
  • Type c for priority C (lowest)
  • SPC to 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 [2025-01-15 Wed 14:32]
    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: <2025-01-15 Wed> #+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:

  1. C-c C-w prompts for target location
  2. Type to search for headings (with completion)
  3. Select destination
  4. 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

  1. Create a TODO list with at least 10 tasks
  2. Set different priorities on tasks
  3. Add deadlines to at least 3 tasks
  4. Add scheduled dates to at least 2 tasks
  5. Create a task hierarchy with parent/child TODOs
  6. Try different TODO states (configure custom keywords if you’re feeling brave)
  7. Create at least one repeating task
  8. 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.

Org-Mode with Emacs — CC0 1.0 Universal  ·  Built with Org-Mode & Emacs