FocusPlan is a collection of AppleScripts that aims to integrate OmniFocus and OmniPlan (pro versions). After searching for days in different forums, I realized that both applications could not be integrated easily and that the only way to attain this objective would be to program it myself. I managed to program a not-so-bad set of scripts that answers my needs, and I decided to share it with others since it’s not an easy work and I’m confident some other people may benefit of these scripts.


FocusPlan requires the pro versions of both OmniFocus and OmniPlan (only the pro versions are scriptable).


FocusPlan now works with OmniPlan 4 that just came out.

Download links

For OmniPlan 3, OmniFocus 3: Version 1.0.

For OmniPlan 4, OmniFocus 3: Version 1.1

What FocusPlan does

FocusPlan provides additional buttons in the OmniPlan applications. These buttons synchronize OmniPlan tasks with OmniFocus tasks so that changes in OmniPlan are reflected in OmniFocus and vice-versa.

Important: since the scopes of OmniFocus and OmniPlan are different, FocusPlan syncs only the tasks’ name and due date. Any other field is not synced, and this is by design (see the questions below for an explanation).

The five buttons provided by FocusPlan (on the right)

What FocusPlan does not

I remind that FocusPlan is only a set of AppleScripts that work around a limitation in two applications that I don’t control. The integration is not perfect:

  • FocusPlan does not sync anything besides the tasks’ name and due date. See the questions below for an explanation.
  • FocusPlan does not sync in background or mirror changes from one application to another. The syncs must be performed manually using the toolbar buttons.
  • FocusPlan does not keep the arborescence of a project in sync. On a first sync, the AddToOmniFocus script does recreate the OmniPlan’s task arborescence in OmniFocus, but this arborescence is not synced afterward. See the questions below for an explanation.

Installing FocusPlan

  1. Download FocusPlan using the links above, then open the DMG package.
  2. Open OmniPlan and select Open Scripts Folder in the help menu.
  3. Copy all the files from the DMG package to the OmniPlan script folder.
  4. Once the files are copied, right-click on the OmniPlan’s toolbar and select “Customize Toolbar…”. Then drag the five scripts with icons to the toolbar in this recommended order:
Recommended icon order

Using FocusPlan



This script adds the selected tasks to OmniFocus with their arborescence. For example, adding foo, which is a subtask of bar, which is a subtask of blah, will create all three tasks (blah, bar and foo) with the correct arborescence in OmniFocus.

As an example, let start with a blank OmniPlan project, then create some tasks. Here I made some typical tasks for a researcher. Note that the Protocol and ethics tasks has a “End No Later Than” constraint of January 30th.

Some tasks in OmniPlan

We will sync tasks 1 to 2.2 with OmniFocus. We select these tasks and click on AddToOmniFocus.

We select some tasks to add to OmniFocus

These tasks are added to OmniFocus with their arborescence in a new project called “From OmniPlan”. Notice that the “Protocol and ethics” task has the same due date as in OmniPlan.

The selected tasks are added to OmniFocus with their arborescence

Let go back to OmniPlan. A new column (OmniFocusID) has been added automatically. This is that column that links OmniPlan tasks to OmniFocus tasks.

The OmniFocusID column holds the link between OmniPlan and OmniFocus tasks

Note that we can move tasks around in OmniFocus, convert them to projects, add subtasks to them, and they will always stay linked to OmniPlan. For example, in our context the Grant proposals and Some research project tasks may be better viewed as different projects in OmniFocus. Let convert them to projects by dragging them to the project sidebar. And let add some subtasks to the Protocol and ethics task.

By moving tasks around in OmniFocus, our initial gantt chart in OmniPlan is now becoming increasingly workable on a day-to-day basis in OmniFocus.

The parent tasks are now projects in OmniFocus, and we added subtasks to the protocol and ethics task.

Let say that after a few weeks, we want every OmniPlan task to be synced to OmniFocus. We simply select all tasks in OmniPlan and click again on AddToOmniFocus. The already-linked tasks will be updated in OmniFocus, while the new tasks (in our example, Data processing and Redaction) will be created under their parents.

Now all OmniPlan tasks are synced to OmniFocus
The new tasks were created under their parent in OmniFocus



This script links an OmniFocus task to an OmniPlan task. This is similar to AddTaskToOmniFocus but it does not create a new task in OmniFocus, it only links two existing tasks.

To link two tasks, select a task in OmniFocus, select a corresponding task in OmniPlan, and then click on LinkToOmniFocus. The information from both tasks needs to be merged, and thus a dialog box asks which task information (OmniFocus’ or OmniPlan’s) should override the other.



This script copies the tasks’ names and due dates from OmniFocus to their corresponding tasks in OmniPlan. If no or all OmniPlan tasks are selected, then all tasks are updated. If some OmniPlan tasks are selected, then only these selected tasks are updated.

For example, let say we changed the due date for the Protocol and ethics task in OmniFocus, to the 2nd of March; and we changed the name of the Acquisitions task to Acquisitions at the co-researcher’s lab.

We changed the due date of Protocol and ethics, and we changed the name of Acquisitions.

To reflect these changes in OmniPlan, select all tasks (or no task) in OmniPlan, and click on PullFromOmniFocus.

These changes are applied to OmniPlan by using PullFromOmniFocus



This script does the inverse of PullFromOmniFocus. If we modify a task’s name or “End no later than” constraint, the changes are reflected to OmniFocus by selecting all tasks (or no task) in OmniPlan, then clicking on PushToOmniFocus. If some OmniPlan tasks are selected, only those tasks are updated in OmniFocus.



When navigating in the OmniPlan project, we can quickly jump to the linked OmniFocus tasks by selecting a task in OmniPlan and clicking on ShowInOmniFocus. The corresponding task appears in OmniFocus.

Note: if the OmniFocus task is invisible in the current perspective (it may happen for example if the task has been marked completed), it won’t appear in OmniFocus, although it is selected. To view the task, you must change your view options to see all tasks.

All tasks must be visible to see completed tasks

Suggested workflow

If like me, you’re using OmniFocus everyday and OmniPlan maybe once a week or less, here is my suggested workflow when using PullFromOmniFocus and PushToOmniFocus:

  1. On the “project management day”, just after opening your OmniPlan project, select all tasks (or no task) in OmniPlan and run PullFromOmniFocus. The tasks that are linked to OmniFocus will be updated from OmniFocus, and the others will be ignored. At this moment, both applications are in sync.
  2. Make your planification/modifications/updates to your project in OmniPlan.
  3. Just before closing your OmniPlan file, select all tasks (or no task) in OmniPlan and run PushToOmniFocus. The tasks that are linked to OmniFocus will be updated to OmniFocus, and the others will be ignored. At this moment, both applications are again in sync.
  4. Play around in OmniFocus and don’t forget to do actual work (!), until the next project management day.

Questions, bugs and feature requests

I share these scripts because I think it can help some people. This is not a product that I can afford to support or develop continuously. However I’m always glad to help if you have problems. I’d appreciate if you could post your questions on this page and not by email. To submit bugs, please use the issue tracker. Don’t hesitate to tell me about your success, it’s always nice to learn that somebody is using our homemade tools.

Selected questions and answers

Why OF estimated time is not synced to OP task duration?

In a first time I did sync OF estimated time to OP task duration, but then I realized that it was not relevant in most cases: OmniPlan’s tasks are mainly in orders of days, weeks and months, while OmniFocus’s tasks are expressed in hours. Hence both fields are not on a similar scale and order and syncing them is possible but useless.

Why OF defer date is not synced to OP start date?

Intuitively, these variables have similar meaning, but when we go a little bit deeper, we realize that they are in fact very different. OmniPlan is for project management, while OmniFocus is for day-to-day task management. It is important to keep this distinction if we want to keep sane. OmniPlan’s start date indicates at which date a task is planned to start. In the opposite (at least in my workflow), OmniFocus’s defer date does not indicate the start date but instead the next date when it will be possible for me to work on the task. Deferring a task hides it from view until that date.

Therefore, syncing both variables would results in messy situations: why did the task moved to the right in OmniPlan (because I deferred it in OmniFocus)? Why couldn’t I see the task anymore in OmniFocus (because the start date was postponed in OmniPlan)? This is why FocusPlan does not sync these dates.

Why the tasks arborescence is not kept in sync between OP and OF?

It is, but only on task creation using AddTasksToOmniFocus. The task arborescence is not synced after, which means that if you move subtask 1 from task 1 to task 2 in OmniPlan, it won’t move from task 1 to task 2 in OmniFocus. This design choice is based on the different aims of OmniPlan and OmniFocus. In OmniPlan, the tasks must be very structured to keep an accurate overview of the projects. In OmniFocus, the tasks can (and should) be moved, dragged, deferred, flagged, moved again, etc. to adapt to a day-to-day workflow. Syncing the tasks’ arborescence would create too much rigidity in OmniFocus and too much mess in OmniPlan.