Skip to content

Azure DevOps to Monday.com Sync Tool

A comprehensive Python application to synchronize work items from Azure DevOps (ADO) to Monday.com boards with a full-featured GUI.

Features

Core Functionality

  • Work Item Sync: Automatically sync ADO work items to Monday.com boards
  • Smart Duplicate Prevention: Checks existing items by ADO ID to prevent duplicates
  • Skip Unchanged Items: Fast skip when ADO Changed Date matches Monday Changed Date
  • Attachment Handling: Download attachments from ADO and upload to Monday.com
  • Repro Steps Sync: Post repro steps as Monday.com updates
  • Custom Field Mapping: Map any ADO field to any Monday.com column dynamically
  • Configurable Filters: Filter work items by team project and states
  • Assigned To Filter: Sync only items assigned to specific people (comma-separated)
  • File Size Limits: Configure maximum attachment size (default 50MB)
  • Multi-Config Jobs: Run multiple sync jobs in one click (batch processing)
  • Bugs Report Generator: Create cross-board bug status reports with deltas

GUI Features

  • 📊 Tabbed Interface:
  • Connection Settings: Configure ADO and Monday.com credentials
  • Field Mapping: Dynamically map ADO fields to Monday columns with visual interface
  • Sync: Execute sync with real-time progress and logging
  • 🔐 Configuration Management: Save, Save As, load, and select multiple JSON configs
  • 📁 Config Selector + Job List: Pick a default config or run multiple configs as jobs
  • 🧪 Connection Testing: Verify ADO and Monday.com connections before sync
  • 📈 Real-time Logging: See detailed progress with color-coded status messages
  • Background Processing: UI remains responsive during sync operations
  • 📊 Bugs Report: Generate Markdown reports for all configured boards

Prerequisites

  • Python 3.12+
  • Azure DevOps account with Personal Access Token (PAT)
  • Monday.com account with API key
  • Virtual environment (recommended)

Installation

  1. Clone or download this repository
  2. Create a virtual environment:

    python -m venv .venv
    

  3. Activate the virtual environment:

    .\.venv\Scripts\Activate.ps1
    

  4. Install dependencies:

    pip install -r requirements.txt
    

Configuration

  1. Launch the GUI:

    .\.venv\Scripts\python.exe ado_to_monday_gui.py
    

  2. Connection Settings Tab:

  3. Enter your Azure DevOps organization URL (e.g., https://dev.azure.com/yourorg)
  4. Enter your ADO Project ID or Name
  5. Enter your ADO Team Project name (e.g., "Gaya - Bespoke Airports")
  6. Enter your ADO Personal Access Token
  7. Enter your Monday.com API key
  8. Enter your Monday.com Board ID
  9. Use Select Config to load a saved configuration
  10. Use Save Config or Save As... to store a new config file
  11. (Optional) Select one or more configs in Jobs to Run for batch sync
  12. Click Test Connections to verify
  13. Click Save Config to persist settings

  14. Field Mapping Tab:

  15. Click Load Fields & Columns to fetch available ADO fields and Monday columns
  16. Click ➕ Add Field Mapping to create a new mapping
  17. Select an ADO field from the dropdown (e.g., System.Title, Custom.StackPriorityValue)
  18. Select a Monday column from the dropdown (e.g., Name, Stack Priority)
  19. Repeat to add more mappings
  20. Click to remove a mapping
  21. Save Config to persist mappings

  22. Sync Tab:

  23. Configure sync options:
    • ✅ Sync Attachments
    • ✅ Sync Repro Steps as Updates
    • ✅ Update Existing Items (prevents duplicates)
    • ✅ Skip items with unchanged Changed Date
    • Max Attachment Size (MB)
    • State Filter (comma-separated, e.g., "Active, New")
    • Assigned To Filter (comma-separated names, leave blank for all)
  24. Click ▶ Start Sync to begin
    • Click 📊 Generate Bugs Report to create a report for all configs
  25. Monitor progress in the log window

Using the Script Directly

You can also use the backend script without the GUI:

from ado_to_monday import ADOToMonday

syncer = ADOToMonday(
    ado_org_url="https://dev.azure.com/yourorg",
    ado_project="your-project-guid",
    ado_pat="your-pat-token",
    monday_api_key="your-monday-api-key",
    monday_board_id=123456789
)

# Sync with default settings
syncer.sync()

# Sync with custom team project and states
syncer.sync(
    team_project="Gaya - Bespoke Airports",
    states=["Active", "New"],
    sync_attachments=True,
    sync_repro_steps=True
)

Field Mapping

Default Fields (when no custom mappings configured)

ADO Field Monday Column
System.Id ADO ID
System.Title Name
System.Description Description
System.AssignedTo Assigned To
System.State State
Microsoft.VSTS.Common.Priority Priority
Custom.StackPriorityValue Stack Priority Value
System.ChangedDate Changed Date
Microsoft.VSTS.TCM.ReproSteps (Posted as Update)
System.WorkItemType Work Item Type
System.CreatedDate Created Date

Custom Mapping

With the Field Mapping tab, you can: - Map any ADO field to any Monday column - Add multiple field mappings dynamically - Remove unwanted mappings - Save mappings to configuration file - Fields are automatically typed (dates, text, numbers)

Example Custom Mappings: - System.AreaPathTeam Area - System.IterationPathSprint - Custom.ReleaseVersionRelease - Microsoft.VSTS.Common.SeveritySeverity

How It Works

Sync Process

  1. Fetch Work Items: Query ADO using WIQL with team project and state filters
  2. Optional Assigned To filter is added when provided
  3. Extract Fields: Pull field values based on configured mappings
  4. Check Duplicates: Query Monday board for items with matching ADO ID
  5. Skip Unchanged (optional): If Changed Date matches, skip sync for that item
  6. Create/Update:
  7. If item exists and "Update Existing" enabled → Update column values
  8. If item doesn't exist → Create new item
  9. Sync Attachments (if enabled):
  10. Download attachments from ADO
  11. Check if file already exists on Monday item
  12. Upload only new files (prevents duplicates)
  13. Skip files exceeding size limit
  14. Sync Repro Steps (if enabled):
  15. Check if repro steps update already posted
  16. Post as Monday update if not present

Duplicate Prevention

  • Items: Queries Monday board by ADO ID column value before creating
  • Attachments: Compares filenames in Monday file column before uploading
  • Updates: Checks existing updates for repro steps marker before posting

Troubleshooting

Connection Errors

  • Verify ADO PAT token has Work Items: Read permission
  • Verify Monday.com API key has boards:read and boards:write scopes
  • Check organization URL format: https://dev.azure.com/yourorg (no trailing slash)
  • Ensure Board ID is a number (not board name)

Field Mapping Issues

  • Click Load Fields & Columns before adding mappings
  • Ensure ADO fields exist in your work items
  • Ensure Monday columns exist on your board
  • Check Monday column types match ADO field types (date → date, text → text)

Sync Errors

  • Review log window for specific error messages
  • Common issues:
  • Invalid field names → Update mappings
  • Column type mismatch → Change Monday column type
  • Large attachments → Increase max file size or skip large files
  • Network timeouts → Reduce batch size or retry

File Upload Failures

  • Default max size is 50MB (configurable)
  • Ensure file isn't corrupted in ADO
  • Check Monday.com storage limits
  • Verify file column exists on board

Advanced Usage

Custom WIQL Queries

Edit the query in create_syncer() method to customize work item selection:

custom_query = """
SELECT [System.Id], [System.Title] 
FROM WorkItems 
WHERE [System.TeamProject] = 'Your Project'
AND [System.State] = 'Active'
AND [System.Tags] CONTAINS 'Monday-Sync'
AND [System.CreatedDate] >= '2024-01-01'
"""

Programmatic Field Mapping

syncer._field_mappings = [
    {'ado_field': 'System.Title', 'monday_column': 'Name'},
    {'ado_field': 'Custom.StackPriorityValue', 'monday_column': 'Stack Priority'},
    {'ado_field': 'System.State', 'monday_column': 'Status'},
]

Configuration File Format

Saved as JSON in the project/exe directory (e.g., sync_config.json or sync_config_*.json):

{
  "ado_org_url": "https://dev.azure.com/yourorg",
  "ado_project": "project-guid",
  "ado_team_project": "Team Project Name",
  "ado_pat": "your-pat-token",
  "monday_api_key": "your-api-key",
  "monday_board_id": "123456789",
  "sync_attachments": true,
  "sync_repro_steps": true,
  "update_existing": true,
   "skip_unchanged": true,
  "max_file_size": 50,
  "state_filter": "Active, New",
   "assigned_filter": "",
  "field_mappings": [
    {
      "ado_field": "System.Title",
      "monday_column": "Name"
    },
    {
      "ado_field": "Custom.StackPriorityValue",
      "monday_column": "Stack Priority Value"
    }
  ]
}

Bugs Report Generator

Generate a consolidated Markdown report across all configured boards.

  • GUI: Click 📊 Generate Bugs Report in the Sync tab
  • CLI: Run python bugs_report.py

Reports are saved in the reports folder with timestamps and include delta tracking from the previous run.

License

This project is provided as-is for internal use.