Configuration
Before you can sync Jira issues to OmniFocus, you need to configure the plugin with your Jira credentials and preferences.Initial configuration
Open configuration
In OmniFocus, navigate to Automation → Plug-Ins → Jira Sync and run Configure JIRA Sync (the gear icon).
Generate API token
Create a Jira API token:
- Visit https://id.atlassian.com/manage-profile/security/api-tokens
- Click Create API token
- Give it a label like “OmniFocus Sync”
- Copy the generated token
API tokens are more secure than passwords and can be revoked independently if needed.
Enter credentials
Fill in your Jira credentials:
- JIRA Account ID: Your Jira account email or ID
- JIRA API Token: Paste the token you generated
Credentials are stored securely in macOS Keychain via OmniFocus’s Credentials API.
Configure JQL query
Enter a JQL query to filter which issues to sync. For example:This syncs all your open, unresolved issues. See JQL queries for more examples.
Set OmniFocus tag
Enter a tag name to apply to all synced tasks:
Use colons to create nested tags (e.g.,
Work:JIRA creates a “JIRA” tag under “Work”).Configuration fields
The configuration form includes these fields:Required fields
Your Jira instance URL. Must start with
https://.Example: https://yourcompany.atlassian.netYour Jira account ID or email address.Example:
[email protected]Your Jira API token generated from Atlassian’s security settings.
JQL query to filter which issues to sync.Example:
assignee = currentUser() AND resolution = UnresolvedTag name to apply to synced tasks. Use colons for nested tags.Example:
Work:JIRAOptional fields
When enabled, tasks with Jira parent issues (epics) are grouped into OmniFocus projects named
[PARENT-KEY] Parent Summary.Default folder path for created projects when project organization is enabled. Use colon-separated paths for nested folders.Example:
Work:Jira:EpicsLeave empty to create projects at the root level.Comma-separated list of Jira status names that mark tasks as completed.Default:
Done, Closed, ResolvedExample: Done, Closed, Resolved, FinishedComma-separated list of Jira status names that mark tasks as dropped.Default:
WithdrawnExample: Withdrawn, CancelledAdvanced configuration
Project organization
Enable Project Organization to automatically group tasks by their Jira parent issue:- Check the Enable Project Organization checkbox
- Optionally set a Default Folder for Projects using colon-separated paths
- Click Save
- Tasks with a parent issue are placed in an OmniFocus project named
[PARENT-KEY] Parent Summary - Projects are created in the specified folder path (or at root level if empty)
- Tasks without parent issues remain in your inbox
This feature is useful for organizing tasks by epic or parent story in Jira.
Custom status mappings
You can customize how Jira statuses map to OmniFocus task states: Completed statuses (default:Done, Closed, Resolved):
Withdrawn):
Status names are case-sensitive and must match exactly as they appear in Jira.
Data storage
The plugin stores configuration data in two secure locations:Credentials (macOS Keychain)
Stored undercom.omnifocus.plugin.jira-sync:
- Jira account ID
- Jira API token
Settings (OmniFocus Preferences)
Stored in OmniFocus preferences underjiraSync.settings:
- Jira URL
- JQL query
- Tag name
- Project organization settings
- Status mappings
- Last sync timestamp
Updating configuration
You can update your configuration at any time:- Run Configure JIRA Sync again from Automation → Plug-Ins → Jira Sync
- Modify any fields you want to change
- Click Save
Changing the JQL query will affect which issues are synced in future syncs. Existing tasks in OmniFocus are not automatically deleted.
Troubleshooting
Authentication error
If you see an authentication error:- Verify your Jira URL is correct and includes
https:// - Regenerate your API token at https://id.atlassian.com/manage-profile/security/api-tokens
- Run Configure JIRA Sync again with the new token
Invalid JQL query
If your JQL query fails:- Test the query in Jira’s issue search (Filters → Advanced issue search)
- Verify it returns the expected issues
- Update the query in the configuration
No issues found
If the connection test reports 0 issues:- Your JQL query might be too restrictive
- Test the query directly in Jira to see what it returns
- Try a simpler query like
assignee = currentUser()
Next steps
Learn JQL queries
Discover JQL patterns to filter issues effectively
Start syncing
Run your first sync and understand incremental vs. full refresh