Your Azure boards, on a real timeline.
Pull Azure DevOps work items into a GanttFather project as tasks — titles, states, dates, estimates, assignees and parent/child hierarchy — then push a reviewed set of planning changes back. Setup starts the initial import; later sync actions are user-triggered, and nothing reaches Azure until you confirm the reviewed Push.
Looking for the why rather than the how? Read how teams use Azure DevOps on a Gantt chart.
At a glance
- Provider
- Azure DevOps Services — REST API 7.1
- Accepted hosts
- HTTPS on
dev.azure.comor*.visualstudio.com - Authentication
- Personal Access Token, encrypted at rest and never returned by the API
- Pull direction
- A reviewed Azure DevOps → GanttFather comparison. Conflicting local dates/statuses are kept by default
- Push direction
- A reviewed GanttFather → Azure publish. Eligible date/status conflicts are selected with a clear overwrite notice
- Per project
- One Azure connection, any number of sync sources
- A source is
- One saved query, or one team + backlog board
- Schedule
- None. Setup starts the initial import; after that, there are no webhooks or background scheduler
- Who can manage it
- Project Owner or Admin. Other members see the section read-only
Token permissions
GanttFather authenticates with a Personal Access Token you create in Azure DevOps. Give it the narrowest scopes that cover what you intend to do — you can widen them later by saving a new token.
To pull work items in
- Project and TeamRead
- Lists your Azure projects, teams and boards.
- Work ItemsRead
- Runs the query or board WIQL and reads the work items it returns.
To also push changes back
- Project and TeamRead
- Same as above.
- Work ItemsRead & write
- Patches the mapped fields you approve in the review.
A read-only connection stays read-only. GanttFather never quietly upgrades a pull token into a write token. If the push review says the connection is read-only, save a token that carries Work Items (Read & write) before publishing.
Where the token lives. It is encrypted on the server the moment you save it, decrypted in memory only to call Azure, and never sent back to the browser or included in any API response. Only the project Owner or an Admin can reach any of this; other members see the section but cannot change it.
Connect in seven steps
In the app open Settings → Integrations → Connect Azure DevOps. The wizard separates connection, project, source, types, dates & effort, statuses, and destination so every choice is reviewed before the initial pull.
- 1
Organization URL and PAT
Paste your organization URL (for example https://dev.azure.com/myorg) and a Personal Access Token, then run Test Connection. The wizard will not advance until the test passes.
The token is held in the browser only until you save; the server stores it encrypted.
Open GanttFather → - 2
- 3
Choose the source and its scope
Choose a Saved Query — browse the query tree or paste a query URL and test it — or a Team plus a Backlog Level (Stories, Features or Epics). A board can bring in only that level or its full tree.
- 4
Choose work-item types
Review the planning types returned by the source and include only the types you want on the timeline. Non-planning types remain available behind Show anyway, and existing explicit selections are preserved.
- 5
Map dates and effort
Per included work-item type, choose which Azure fields become Gantt Start and Gantt End. Custom fields are supported. An optional section maps Original Estimate, Remaining Work and Completed Work to derive % complete.
- 6
Map Azure states to project statuses
For every discovered Azure state, choose the exact GanttFather project status used on Pull and review the Azure state that Push uses for that status. Types with no returned states stay visible with retry guidance.
- 7
Choose the destination and save
Choose the task the imported work lands under — or leave it at Gantt Root Level. Review the source, type, date and status summary, then save. Saving creates the integration and starts the initial pull.
Adding more later. Use Add Source to attach another query or board to the same connection. It reuses the stored token and Azure project, then runs the same five source steps: Source, Types, Dates & effort, Statuses, and Destination. Configure fields uses that five-step model but intentionally opens at Dates & effort (step 3 of 5); Back reaches Types and Source when those choices need review.
What lands on the Gantt
Each work item becomes one task. Start, end, optional effort progress and status come from the mappings reviewed in steps 5 and 6; everything else follows the fixed rules below.
- System.TitleTask name
- Falls back to
Work Item {id}when the title is empty. - System.DescriptionDescription
- HTML tags are stripped, so the text lands as plain text.
- System.StateStatus
- Through the state map below.
- Microsoft.VSTS.Common.PriorityPriority
- 1 → High, 2 → Medium, 3 and 4 → Low. Missing or unrecognised → Medium.
- Your mapped start fieldStart date
- Defaults to
Scheduling.StartDate. With nothing usable: the work item’s created date, then today. - Your mapped end fieldEnd date
- Defaults to
Scheduling.TargetDate. With nothing usable: start + 1 day. - Your mapped estimation fieldEstimation
- Defaults to
Scheduling.StoryPoints. Also eligible: Original Estimate, Effort, Size, and custom numeric fields. - System.AssignedToAssignment
- Resolved in three tiers — see below.
- System.ParentParent task
- Applied after all items are processed, when both items came from the same source.
- The work item itselfAzure DevOps icon + deep link
- Imported tasks link straight back to
_workitems/edit/{id}.
States become statuses
The default map is case-insensitive, and you can override any state per source.
| Azure DevOps state | GanttFather status | Category |
|---|---|---|
| New · To Do · Proposed | Open | Not started |
| Active · In Progress · Committed · Doing | In Progress | In progress |
| Resolved · Done | Done | Done |
| Closed | Closed | Done |
| Removed | Closed | Done |
| Anything else | Open | Not started |
Custom statuses are respected. If your project defines its own statuses, an imported item lands on your status in the matching category — an Azure Active item becomes your "In Development", not a generic built-in. Anything that resolves into the Done category is set to 100% complete.
Optional: derive % complete from Azure effort
The Dates & effort step can also map Original Estimate, Remaining Work and Completed Work per work-item type. Map at least two and GanttFather calculates each task's progress on every pull, in this order:
Completed ÷ (Completed + Remaining)(Original − Remaining) ÷ OriginalCompleted ÷ Original
Nothing is pre-selected — this is opt-in, and a source with no mapping keeps the progress behaviour it has today. When fewer than two usable values exist, or the divisor is zero, the task's existing progress is left alone rather than reset. A status in the Done category still wins: an item Azure reports as Closed reads 100% even if its effort fields disagree. These fields are read on pull only and are never written back.
Scope and destination
Board scope is chosen with the source in step 3. The destination parent is reviewed separately in step 7, immediately before Save and pull.
Only <board>
Imports the selected backlog level as a flat list — Stories brings User Stories and Bugs, Features brings Features, Epics brings Epics. No hierarchy is reconstructed.
Full Tree
Imports every work-item type you ticked in the mapping step within the same team area, and rebuilds the parent/child structure from System.Parent.
Target parent task. Choose an existing task and the imported work is nested under it, which keeps two sources from colliding at the top of the chart. Leave it at (Gantt Root Level) to import at the top level. If the chosen task is later deleted, the next pull falls back to root instead of failing.
Board sources skip finished work. The generated query excludes items in Removed, Closed and Done, so connecting a long-lived board does not drag years of history onto your timeline. A saved query, by contrast, returns exactly what you wrote it to return.
Reviewed Pull and full source reconciliation
Pull from Azure compares mapped fields on existing items before changing the timeline. Azure-only values are selected; conflicting local dates/statuses stay local under the default Keep my changes choice. Opening Pull normally keeps the summary compact with Advanced collapsed; Keep my changes and Restore from Azure appear under Advanced. Review Pull from a Push conflict notice opens Advanced immediately. Sync source remains the separately named full membership reconciliation used for new, changed, and removed source items.
Zero is still inspectable. Pull opens even when the count is zero. If an expected change is missing, Check mapped fields opens Settings → Integrations and temporarily highlights that source's Configure fields action.
Unchanged work items are skipped
GanttFather stores the Azure revision it last saw. If the revision has not moved, the task is not touched at all.
Changed work items are overwritten
Sync source is the full reconciliation operation: a newer Azure revision overwrites mapped task fields. Reviewed Pull is more selective and keeps conflicting local dates/statuses by default unless you choose Restore from Azure.
Nothing is ever duplicated
Each work item is bound to its task permanently. A second source that meets the same work item re-binds to the existing task instead of creating a copy, and reconnecting after a disconnect re-binds too.
Items that leave the source are closed, not deleted
When a work item stops coming back from the query or board, its task is set to Closed — unless another source in the same connection still tracks it. Imported tasks are never deleted by a sync.
Parent rows are recalculated
After every successful pull, parent tasks recompute their dates, progress and status from their children, exactly like any other write in GanttFather.
How assignees are resolved
- 1
A project member with that email
Matched case-insensitively against the members of the GanttFather project. The task is assigned to that person.
- 2
An existing resource with that name
When no member matches, GanttFather looks for a virtual resource with the same display name. A trailing "(Company)" style suffix is ignored during the match.
- 3
A new virtual resource
When neither matches, a virtual resource is created — hourly cost model at 0, initials and colour derived from the name — and reused for every later item with the same assignee.
Assignee names and email addresses are treated as personal data: they are used to match, never written to logs.
Reviewed Push to Azure
Push is a read-only comparison followed by a publish you confirm. Eligible local date and status changes are selected by default. If a selected item also changed in Azure, a blue information badge explains that Send keeps the selected GanttFather values and overwrites those newer mapped Azure values.
Pull first is optional. The badge's Review Pull action changes direction in the same dialog and opens Advanced so Keep my changes and Restore from Azure are visible. Opening Pull normally keeps Advanced collapsed. Confirmed Push respects the user's decision to overwrite Azure; the conflict can still be excluded in Advanced or Details.
These dates cannot be sent together. If a selected start or finish would form an invalid range with the current companion date in Azure, Send is disabled before publishing and no Azure write is sent. Review Pull opens Pull with Advanced expanded so you can restore a coherent date range, or you can close the dialog and adjust the local dates.
What can be published
- Gantt Startyour mapped start field
- The task's start date.
- Gantt Endyour mapped end field
- The task's end date, converted to the inclusive date Azure expects.
- StatusSystem.State
- Resolved through the same state map as pull. If the current Azure state already maps to the task's status, it is kept as-is rather than rewritten.
Estimates stay Azure-owned. Original Estimate, Remaining Work, Completed Work and the configured estimation value can be read on Pull but are never selected or patched by Push.
Derived parent values are protected. A parent whose planning values are computed from children remains visible as unavailable rather than silently publishing a derived date.
How the review sorts your changes
- Ready
- GanttFather changed, Azure did not. Selected by default and safe to publish.
- Conflicts
- Both sides changed since the last trusted baseline. Eligible date/status conflicts are selected by default for Push, with a calm Azure-change notice and an Advanced/Details opt-out.
- Changed in Azure
- Only Azure moved. Pull can accept it locally. Push never sends an unrelated Azure-only item, but a writable date/status on the same selected conflict item is included in the warned GanttFather-wins overwrite.
- Blocked
- Cannot be published as-is — an unmapped field, a work item linked to more than one task, a value outside the range Azure accepts, or a read-only connection.
- No changes
- Both sides agree. Listed so you can confirm the comparison actually covered the item.
Publishing patches only the selected fields and reports exact completed items, dates and statuses. A partial, failed, stale or uncertain result stays explainable and reopenable; completed work is not resent.
Fresh comparison required. If the comparison changes before confirmation, the same dialog refreshes with “The comparison changed. Review the new counts before continuing.” Old selections are discarded and the current defaults are rebuilt.
One clean exit. Keep my changes · Close starts no operation and closes the complete sync flow instead of returning to a source chooser. Successful Pull and Push actions close their owning dialog after the result is confirmed.
Where to run a sync
Settings → Integrations
The full maintenance surface. Each source row shows its type, target, last sync time and reviewed counts, with direct Pull from Azure and Push to Azure actions plus Configure fields, Sync source and Remove in its menus. Initial import belongs to setup (and later sources start with Add Source); full Sync source stays in Settings. Pull and Push open review directly without an intermediate direction picker.
Data & sync
The Azure shortcut in the project header and Data & sync offer two everyday actions: Pull from Azure and Push to Azure. Use them without leaving the chart. The shortcut is hidden for read-only projects and for projects with no source.
Fresh counts on every return. From Settings, the project shortcut, or Data & sync, opening Pull or Push after the previous comparison finishes requests a new server-authored comparison so the review includes the latest Azure changes. Only another opening for the same source while that check is still in progress shares the in-flight request.
Full Sync source maintenance runs in the background. Choosing Sync source in Settings accepts that maintenance trigger right away; the app polls the source until it flips out of In progress, then reloads the project and tells you how many work items changed. Reviewed Pull and Push still wait for explicit confirmation in their dialog. Sources run one at a time, and one failing source does not stop the others.
Limits and good to know
- No automatic syncby design
- No scheduler, no webhooks, no background polling of Azure. Every pull is triggered by a person.
- One connection per projectmany sources
- To point a project at a different organization or Azure project, remove the integration and connect again. Sources, mappings and destinations stay editable.
- Syncs are silentno history, no live push
- A sync writes no activity-history entries and does not broadcast to other open clients. Teammates see the result on their next refresh.
- Pull is reviewedconflicts stay local by default
- Use Restore from Azure to replace conflicting local dates/statuses. The separate Sync source operation performs the full mapped-field reconciliation.
- Deletes never propagateeither way
- A work item that leaves the source closes its task. Deleting a task in GanttFather does not delete anything in Azure.
- No agent accessMCP
- AI assistants connected over MCP cannot configure, trigger or read integrations.
Troubleshooting
When a pull fails, the source shows one of these codes. GanttFather deliberately never surfaces the raw provider response — it can contain organization details and token material.
| Code | What happened | What to do |
|---|---|---|
credential_unavailable | The stored token could not be decrypted. | Re-enter the PAT on the integration. This is also the expected code after a server key-ring rotation. |
provider_unauthorized | Azure rejected the token. | The PAT expired, was revoked, or belongs to a different organization. Create a new one and save it. |
provider_forbidden | The token authenticated but is missing a scope. | Add Work Items (Read) for pulls, or Work Items (Read & write) for pushes, and re-save the token. |
provider_rate_limited | Azure DevOps throttled the request. | Wait and run the sync again. Large boards recover on the next attempt. |
provider_unavailable | Azure DevOps could not be reached. | Check the Azure DevOps status page, then retry. |
source_invalid | The source no longer resolves. | The saved query was deleted or moved, or the team/board no longer exists. Edit the source or add a new one. |
sync_failed | Anything else. | Retry the sync. If it repeats, send us the project and source name — the detailed reason stays on the server, never in the browser. |
Connection test fails but the PAT looks right. Check the organization URL first: it must be the organization root on dev.azure.com or *.visualstudio.com, not a project or board URL. A token from a different organization authenticates as nobody and reads as a failed test.
Azure changed but Pull says 0. Open Pull anyway and choose Check mapped fields. Verify the source includes that work-item type and that its Start, End and status fields match the Azure fields your team edits.
FAQ
Does the sync run on its own?
No. There is no scheduler and no webhook. A pull runs when you trigger it, and once automatically right after you finish the setup wizard.
Will connecting Azure DevOps change anything in Azure?
No. Setup and every pull are read-only. Azure is only written by the separate push review, after you select fields and confirm.
Can I edit an imported task in GanttFather?
Yes. Reviewed Pull keeps conflicting local dates and statuses by default and lets you choose Restore from Azure instead. The separate Sync source operation performs full source reconciliation and can replace mapped fields from a newer Azure revision. Dependencies and ordering remain local.
What happens when both sides changed?
Pull defaults to Keep my changes. Push selects eligible local date/status conflicts and warns that Send will overwrite the newer Azure value. Review Pull is optional, and activating it opens the Keep/Restore choices immediately.
What happens to my tasks if I disconnect?
They stay. Disconnecting removes the connection and its sources, not the imported work. If you reconnect later, the same work items bind back to the same tasks instead of importing duplicates.
Can I sync two boards, or a board and a query, into one project?
Yes. A project holds one Azure connection but as many sources as you need, each with its own field mapping, destination parent and sync history. A work item that appears in two sources is still a single task.
Why is a parent value unavailable in the push review?
Parent dates and progress can be derived from children. Publishing a computed value would be misleading, so the review keeps that item visible with an explanation and no writable fields.
Can my AI assistant configure or trigger the integration?
No. The MCP server has no integration tools. Configuring, pulling and pushing are Owner/Admin actions in the app.
Does a sync show up in project history or for teammates in real time?
No. A sync does not write activity-history entries and does not broadcast to other open clients — teammates pick the changes up on their next refresh. This is a deliberate difference from ordinary edits.