An Org mode integration for the Wrike project management service.
org-wrike fetches tasks from user-specified Wrike projects and writes them as per-project .org files that are automatically added to org-agenda-files. Your Wrike deadlines appear alongside your regular Org tasks in org-agenda without any manual copy-pasting.
Read-only by design. org-wrike never writes back to the Wrike API; it only reads.
- Sync Wrike tasks into Org headings with TODO keywords, priorities,
DEADLINE, andSCHEDULEDtimestamps - Per-project
.orgfiles — one file per Wrike folder/project - Idempotent updates — re-running sync preserves notes you have added under task headings
- Optional auto-refresh timer
- Open the Wrike web app for a task directly from Emacs
- List all folders/projects to discover IDs
- OAuth 2.0 authentication with a local callback server (no browser extension needed)
- Emacs 27.1 or later
- Org mode 9.3 or later
- A Wrike account (any tier)
Add MELPA to your package-archives if you have not already:
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)Then:
M-x package-install RET org-wrike RET
(use-package org-wrike
:ensure t
:config
(setq org-wrike-client-id "YOUR_CLIENT_ID"
org-wrike-client-secret "YOUR_CLIENT_SECRET"
org-wrike-folder-ids '("FOLDER_ID_1" "FOLDER_ID_2")))Clone this repository and add it to your load-path:
(add-to-list 'load-path "/path/to/org-wrike")
(require 'org-wrike)- Go to https://www.wrike.com/frontend/apps/index.html#api and click Create new.
- Give the app a name (e.g.
org-wrike). - Set the Redirect URI to
http://localhost:10095(or the port you set inorg-wrike-redirect-port). - Copy the Client ID and Client Secret.
;; Required
(setq org-wrike-client-id "YOUR_CLIENT_ID"
org-wrike-client-secret "YOUR_CLIENT_SECRET")
;; The Wrike folder/project IDs you want to track.
;; Use M-x org-wrike-list-folders to discover IDs.
(setq org-wrike-folder-ids '("IEAAAXXX" "IEAAAYYY"))
;; Where to store the generated .org files (default: ~/.org-wrike/)
(setq org-wrike-directory "~/org/wrike/")
;; Automatically sync every 30 minutes
(setq org-wrike-auto-sync-interval 1800)
;; Sync only active tasks (default: '("Active" "Deferred"))
(setq org-wrike-sync-task-statuses '("Active" "Deferred" "Completed"))
;; Include the Wrike task description in the heading body
(setq org-wrike-include-description t)| Variable | Default | Description |
|---|---|---|
org-wrike-client-id |
nil |
OAuth2 client ID |
org-wrike-client-secret |
nil |
OAuth2 client secret |
org-wrike-redirect-port |
10095 |
Local callback port |
org-wrike-directory |
~/.org-wrike/ |
Output directory for .org files |
org-wrike-folder-ids |
nil |
List of project IDs to sync |
org-wrike-todo-keyword-map |
see below | Wrike status → Org keyword |
org-wrike-priority-map |
see below | Wrike importance → Org priority |
org-wrike-include-description |
nil |
Include task description |
org-wrike-sync-task-statuses |
'("Active" "Deferred") |
Statuses to fetch |
org-wrike-archive-removed-tasks |
t |
Mark missing tasks CANCELLED |
org-wrike-auto-sync-interval |
nil |
Seconds between auto-syncs |
Default TODO keyword map:
| Wrike status | Org keyword |
|---|---|
| Active | TODO |
| Completed | DONE |
| Deferred | WAIT |
| Cancelled | CANCELLED |
Default priority map:
| Wrike importance | Org priority |
|---|---|
| High | A |
| Normal | B |
| Low | C |
M-x org-wrike-authorize
A browser tab opens with the Wrike login/consent page. After you grant access, Wrike redirects to the local callback server. Tokens are saved to ~/.org-wrike/.tokens and refreshed automatically — you only need to authorise once.
M-x org-wrike-sync
Per-project .org files are written to org-wrike-directory and appended to org-agenda-files.
M-x org-wrike-list-folders
Displays a buffer listing all your Wrike folders with their IDs. Copy IDs into org-wrike-folder-ids.
From within a project's .org file:
M-x org-wrike-sync-project
Position point on a task heading and run:
M-x org-wrike-open-task
Or copy the URL:
M-x org-wrike-copy-task-url
;; Enable after setting org-wrike-auto-sync-interval
(org-wrike-enable-auto-sync)
;; Disable
(org-wrike-disable-auto-sync)M-x org-wrike-revoke-authorization
Each synced project produces a file like ~/.org-wrike/My_Project.org:
* My Project
:PROPERTIES:
:WRIKE_FOLDER_ID: IEAAAXXX
:WRIKE_PROJECT_START: <2026-01-01 Thu>
:WRIKE_PROJECT_END: <2026-12-31 Thu>
:END:
** TODO [#A] Fix login bug
DEADLINE: <2026-05-01 Fri>
SCHEDULED: <2026-04-15 Wed>
:PROPERTIES:
:WRIKE_ID: ABC123
:WRIKE_URL: https://www.wrike.com/open.htm?id=12345
:WRIKE_STATUS: Active
:WRIKE_ASSIGNEES: Alice Smith
:WRIKE_UPDATED: 2026-04-10
:END:
** DONE [#B] Write documentation
DEADLINE: <2026-03-31 Tue>
:PROPERTIES:
:WRIKE_ID: DEF456
:WRIKE_URL: https://www.wrike.com/open.htm?id=67890
:WRIKE_STATUS: Completed
:WRIKE_ASSIGNEES: Bob Jones
:WRIKE_UPDATED: 2026-03-30
:END:
Re-running sync updates existing headings in-place. Any text you write below the :END: line of a task's property drawer is preserved.
emacs --batch \
-l org-wrike.el \
-l test/test-org-wrike.el \
-f ert-run-tests-batch-and-exitContributions are welcome. Please:
- Fork the repository and create a feature branch.
- Ensure all ERT tests pass (
emacs --batch ... -f ert-run-tests-batch-and-exit). - Run
M-x package-lint-current-bufferinorg-wrike.eland fix any warnings. - Open a pull request with a clear description of your changes.
GPL-3.0-or-later. See LICENSE.