AppleScript for Creating Follow-up Tasks in Things

A macOS script editor window displays an AppleScript titled "Mark an Action Item as 'Waiting For'." The script automates task management in the Things 3 app by retrieving the current date, selecting to-dos, checking for selected tasks, and handling follow-ups. The code is color-coded, with keywords in blue, variables in green, and strings in purple. The interface includes standard toolbar icons and a description field at the bottom.

A major component of my job is asynchronously collaborating with other people, usually subject matter experts from whom I need to get additional information or content approval on something I have created.

All of my project templates have this approval process built in at the appropriate points. This creates a common challenge: the people I’m working with are often overworked or get appropriately distracted by dealing with some type of emergency at work, and reviewing a script for the trainer gets put on the back burner. So, tactful follow-up is a critical skill and often something I’m managing across multiple people and projects at the same time.

After I created this solution, I realized that I essentially created the Things version of the Complete and Await Reply script from Curt Clifton, which I definitely used back in the day with OmniFocus. I guess I just incepted myself into making this for Things. You’ll definitely see some similarities in the core concepts, but those were subconscious.

Solution

I’m a heavy user of the dates and notes fields for action items and projects in Things, so I wanted to make sure that those notes were preserved, but I also wanted to have a history of when I completed the task available to me in the notes field.

I also wanted the action item to be readily visible as a follow-up item and to be searchable via a standard URL scheme for use in my weekly reviews. As is appropriate for my workplace, I wanted to be reminded of this follow-up task seven days after initially marking it complete.

I also wanted to be able to run this script on a task a second time without cluttering the task up too much while still maintaining the documentation of multiple follow-ups. I can’t say I have to use this double application very often, but it is nice to have.

Here’s how it looks in action:

Script

The script handles these key functions:

  • Marks your original task complete
  • Creates a new follow-up task with “📬 Follow Up:” prefix
  • Preserves all original task metadata (project, area, due dates, deadlines)
  • Maintains a timestamped history in the notes
  • Adds a “waiting” tag for GTD compatibility
  • Sets a follow-up reminder for 7 days later

After going through five different iterations and a lot of help from Claude, here is the script I’m using to achieve all of these requirements.

(*
Things 3 "Create Follow-up Task" Script
Version: 1.5
Created by: Mike Burke (https://www.themikeburke.com) and Claude (Anthropic)
Last Updated: 2025-02-01

License: MIT
Copyright (c) 2025 Mike Burke
Permission is hereby granted to use, copy, modify, and share this script freely,
provided the above copyright and attribution notices are preserved.
Full license text: https://opensource.org/licenses/MIT

Description:
This AppleScript enhances Things 3's task management by creating an automated workflow for tasks that require active follow-up with external parties.
It provides a proactive approach to tracking follow-ups while maintaining compatibility with GTD methodology.

Functionality:
1. Processes selected task(s) in Things 3 and converts them to follow-up tasks
2. For each selected task, it:
   a. Marks the original task as complete
   b. Creates a new task with modified title based on status:
      - New tasks: Adds "📬 Follow Up: " prefix
      - Existing follow-up tasks: Maintains current prefix
   c. Preserves and transfers the following properties:
      - Project assignment
      - Area
      - Due date
      - Deadline
      - Tags
   d. Adds a "waiting" tag for GTD system compatibility
   e. Updates task notes with timestamped history:
      - First time: "Original task completed on [date]"
      - Follow-ups: "Followed up on [date]"
   f. Places the new task in same project/area as original
   g. Sets follow-up date 7 days from creation

Usage:
1. Select one or more tasks in Things 3
2. Run this script
3. Selected tasks will be completed and new follow-up tasks created with 7-day reminders

Note: Requires Things 3 for macOS. Maintains GTD workflow compatibility while promoting active follow-up approach.
*)
tell application "Things3"
	-- Get today's date in the desired format
	set currentDate to current date
	set formattedDate to short date string of currentDate
	
	-- Get selected to-dos
	set selectedToDos to selected to dos
	
	-- Check if any to-dos are selected
	if (count of selectedToDos) is 0 then
		display dialog "No tasks selected. Please select at least one task in Things 3." buttons {"OK"} default button "OK" with icon stop
		return
	end if
	
	repeat with selectedToDo in selectedToDos
		-- Get the original task's properties
		set originalName to name of selectedToDo
		set originalNotes to notes of selectedToDo
		set originalTagNames to tag names of selectedToDo
		
		-- Check if this is already a follow-up task
		set isFollowUp to originalName starts with "📬 Follow Up: "
		
		-- Prepare the new task name and notes based on whether it's a follow-up
		if isFollowUp then
			set newTaskName to originalName
			set newNotes to "Followed up on " & formattedDate & linefeed & "---" & linefeed & originalNotes
		else
			set newTaskName to "📬 Follow Up: " & originalName
			set newNotes to "Original task completed on " & formattedDate & linefeed & "---" & linefeed & originalNotes
		end if
		
		-- Create the new task in the inbox (we'll move it later if needed)
		set newTask to make new to do with properties {name:newTaskName, notes:newNotes} at beginning of list "Inbox"
		
		-- Set project or area
		try
			set originalProject to project of selectedToDo
			if originalProject is not missing value then
				set project of newTask to originalProject
			end if
		end try
		
		if project of newTask is missing value then
			try
				set originalArea to area of selectedToDo
				if originalArea is not missing value then
					set area of newTask to originalArea
				end if
			end try
		end if
		
		-- Set due date
		try
			set originalDueDate to due date of selectedToDo
			if originalDueDate is not missing value then
				set due date of newTask to originalDueDate
			end if
		end try
		
		-- Set deadline
		try
			set originalDeadline to deadline of selectedToDo
			if originalDeadline is not missing value then
				set deadline of newTask to originalDeadline
			end if
		end try
		
		-- Prepare tag names
		if originalTagNames is not "" then
			if originalTagNames does not contain "waiting" then
				set newTagNames to originalTagNames & ", waiting"
			else
				set newTagNames to originalTagNames
			end if
		else
			set newTagNames to "waiting"
		end if
		
		-- Apply tags
		set tag names of newTask to newTagNames
		
		-- Set when date to 7 days from now
		schedule newTask for (current date) + (7 * days)
		
		-- Mark the original task as complete
		set status of selectedToDo to completed
		
		-- Show the new task in Things 3
		show newTask
	end repeat
end tell

Application

While creating a script that does this is the bulk of the achievement, I also wanted to make sure the script was easy to use while I’m in Things.

As I’ve shared before, I love using my Stream Deck to interact with Things. So, I added a Waiting button to my Things profile for Stream Deck. That button uses KMLink to trigger a Keyboard Maestro macro that houses the above script.

Conclusion

As a result of using this script, I have far fewer stalled projects and abandoned action items hidden in the depths of Things. As a side benefit, I’ve also improved my documentation for projects.

I hope this script helps you do the same! Feel free to modify the script to match your needs – for instance, you might want to adjust the 7-day follow-up period or customize the emoji prefix to match your system.

0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.