Things 3 Audit

My use of various tools to work around UI and CLI limitations with Things 3.

Things 3 Audit
Photo by Chris Ried / Unsplash

Problem Statement

All tasks in GTD should have associated contexts, things like Errand, Computer, Call, Email, etc. In Things 3, these are typically defined using tags. Tags can be applied directly to tasks. Tags can also be applied at the Project and Area levels, which will be inherited by all child tasks.

While super-useful, I don’t appreciate that the Things 3 UI does not actually show these inherited tags on the individual tasks themselves. There is also no means to search for tasks that are not tagged (when inheritance is being applied) or missing specific tags (assigned directly or via inheritance).

As a result, I find it hard to confirm if my tasks are missing contexts without navigating to & filtering each built-in list (ex: Anytime, Upcoming, etc.) one-at-a-time.

These instructions provide a way to overcome the above, to audit tasks & identify which ones are missing contexts (either directly-applied or inherited). I run this once per week, so my tasks are in tip-top-shape ahead of starting my GTD weekly review.


Running these steps requires Python 3 to be installed on your local machine. In addition, you will need access to Google Sheets. This should be usable by either Windows or macOS.


  1. Install the things-cli Python package, using instructions available on its GitHub repository.
  2. Secure your own copy of the following Google Sheets workbook:
    1. Open the workbook URL
    2. If prompted, log into your Google account
    3. Follow the on-screen prompts to finish copying the file

When complete, you will have the toolset necessary to:

  • Extract your Things 3 data to a text file
  • Parse that file’s contents to surface the tasks requiring your attention


  1. Open your computer’s command line utility, such as Terminal for macOS
  2. Navigate to the folder where you wish to store the exported Things 3 tasks
  3. Run the following command to export all tasks to a CSV file:

things-cli --csv all > tasks.csv

  1. In Google Sheets, open the “Things 3 Audit” workbook you copied above
  2. Select the $Input sheet
  3. In the menu, select File > Import
  4. On the Import File modal, select the Upload tab
  5. Click the Browse button
  6. Select the tasks.csv file from your workstation
  7. When prompted, enter the following selections:
    1. Import Location: Replace current sheet
    2. Separator type: Detect automatically
  8. Click the Import Data button
  9. Wait for the file to complete importing (it may take several seconds, depending on your volume)
  10. Select the $Output sheet
  11. Filter by the following:
    1. title: everything except Blanks
    2. Has Context Overall?: False
Screenshot of Google Sheets filter for column A of the $Output sheet.
Filter for the "title" column — note how "(Blanks)" is deselected.
Screenshot of Google Sheets filter for column O of the $Output sheet.
Filtering for "Has Context Overall?" column, where only "FALSE" is selected.

Anything that remains displayed is a task that is missing context, either:

  • As a tag on the task itself, or;
  • As a tag inherited from an ancestor (Area or Project)

Nota Bene

  • The Google Sheets workbook initially supports processing 5000 tasks and has been tested for such volume. If you have more than 5000 tasks, you can try the following:
    • Add extra rows as needed to the $Input and $Ouput sheets
    • On the $Output sheet, be sure to copy down the formulas in Columns G thru O
  • Because of a things-cli bug where the exported column order is unpredictable, to keep formulas from breaking in the Google Sheet workbook, I've taken advantage of the Apps Script documented here
  • Regarding the "Heading Has Context?” column: yes, I’m aware that tags cannot be applied to headers. Because of the way things-cli exports data, I have to perform a secondary lookup in Column M between header UUID → parent project UUID to keep things solid.