Omni Automation Script & Keyboard Maestro Macro: Schedule and Defer Tags in OmniFocus


In OmniFocus, tags can be marked as Available or On Hold manually. However, there is no built-in way to defer a tag until a certain date or to set a schedule for a specific tag’s status.

There are several scenarios where this might be useful. For example:

  • I use tags to represent people. If, for example, my boss or colleague is away for the week and I have a number of items to speak to them about, I cannot do so until next week so these tasks should not show as ‘available’ but I don’t want to have to defer them all manually. Similarly, as I write this I’m on a bizarre sleep schedule (awaiting labour!) and my partner is in bed, so I don’t want to worry about any of the tasks that require his input.
  • I use tags to represent locations where I might carry out errands e.g. the pharmacy, the supermarket, or the hardware store. These places are not open 24/7, so if I’m looking at my OmniFocus database late at night these tasks are not available and I don’t want to see them.
  • I use tags to represent broad times of day. For example, I have a ☀️ Morning tag for tasks that it makes more sense to do in the morning – something like putting the bed linen in the washing machine so that I don’t have to worry about finding another set to sleep in!


OmniFocus set-up

I have set up a project in OmniFocus called Tag Scheduling. This contains meta “scheduler” tasks which contain the information needed to schedule the tags.

These tasks have the following attributes:

  • Name starts with AVAILABLE or DEFERRED (and is usually followed by a description of when the defer date will be reached e.g. AVAILABLE from 8/1/20 or DEFERRED from 5pm Mon-Fri.
  • Project is Tag Scheduling
  • Tag is the tag to be scheduled.
  • Defer date is the time that the tag should become available or be placed on hold.

These tasks can be relatively simple, one-off occurrences (like the aforementioned example where my partner has gone to bed for the night):

However, I can also use repeating “scheduler” tasks to represent things like the opening hours of our local library or recurring time periods:

(Note that in these cases it is important to watch the repeat settings carefully: you probably want to make sure you are using the Assigned Dates option.)

OmniFocus plugin

The plugin has two actions: one checks to see whether any tags need to be updated, and does so. It can be run manually, but is more effectively when paired with something like the Keyboard Maestro macro below.

The second prompts me for a tag and a date and then effectively “defers” the tag to that date by creating the necessary scheduler task as outlined above. It doesn’t handle the more complex repeating schedules but is a quick and easy way to defer a single tag. It’s what I used to create the simple example above (best of all, OmniFocus’ date smarts work in these forms):

Keyboard Maestro macro

It’s all well and good to be able to update the state of tags manually, but ideally these are triggered on a schedule, and that’s where Keyboard Maestro comes in. Essentially, I’ve created a simple macro (downloadable below) which runs this Omni Automation action automatically every 30 minutes so my tags stay up to date:

This can be automatically “allowed” as a trusted script in OmniFocus which means it doesn’t need my input to run. The only caveat is that it does briefly jump to an OmniFocus window every half an hour – but, at least for me, this hasn’t been an issue; it’s usually open anyway!

The Script & Macro

The OmniFocus plugin can be download from GitHub here. (At that link you will find installation instructions.)

The Keyboard Maestro macro can be downloaded below:

Leave a Reply