This project keeps two Monday.com boards in sync automatically.
It is built for a workflow where:
- The Main Board is where you and your team actually work (create/update items).
- A Duplicate Board is kept up to date as a "clean" copy for reporting, dashboards, or integrations.
The sync logic:
- Pulls all items from the Main Board (set via
SOURCE_BOARD_IDenvironment variable). - Reads a specific column that stores your own internal/client ID.
- Checks the Duplicate Board (set via
DEST_BOARD_IDenvironment variable) for matching items viasource_item_id. - Creates new items in the Duplicate Board when they don't exist yet.
- Updates existing items when they already exist.
- Copies over all supported column types (status, people, dates, numbers, etc.).
The automation is designed so that:
- You can run it locally while developing/debugging.
- You can run it automatically on a schedule using GitHub Actions (100% free on a public repo).
If you just want to try it out, scroll to Setup Instructions. If you're curious about the internals and design decisions, see PROJECT.md.
- Go to your Monday.com workspace
- Click your profile picture → Admin → API
- Generate a new API token (or use existing one)
- Copy the token - you'll need it in Step 3
-
Initialize git in this directory:
cd /Users/squarecowmoovers/Documents/tbs git init git add . git commit -m "Initial commit: Monday.com sync script"
-
Create a new repository on GitHub:
- Go to https://github.com/new
- Name it (e.g.,
monday-board-sync) - Choose Private (recommended for security)
- Don't initialize with README (we already have one)
- Click Create repository
-
Push your code:
git remote add origin https://github.com/YOUR_USERNAME/monday-board-sync.git git branch -M main git push -u origin main
-
Go to your GitHub repository
-
Click Settings → Secrets and variables → Actions
-
Click New repository secret and add these secrets:
Name Value MONDAY_API_TOKENYour Monday.com API token from Step 1 SOURCE_BOARD_IDYour source board ID (from the board's URL) DEST_BOARD_IDYour destination board ID (from the board's URL) CLIENT_ID_COLUMNThe column ID used as a unique client identifier
- Go to your repository's Actions tab
- If prompted, click I understand my workflows, go ahead and enable them
- You should see the workflow "Daily Monday.com Board Sync"
Before waiting for the scheduled run, test it manually:
- Go to Actions tab
- Click Daily Monday.com Board Sync
- Click Run workflow → Run workflow
- Wait for it to complete (usually 30-60 seconds)
- Check the logs to verify success
- Verify your duplicate board has been updated
The sync runs automatically at 2:00 AM UTC every day. To change the schedule:
- Edit
.github/workflows/daily_sync.yml - Modify the cron expression:
schedule: - cron: '0 2 * * *' # Minute Hour Day Month DayOfWeek
Examples:
'0 2 * * *'- 2:00 AM UTC daily'0 14 * * *'- 2:00 PM UTC daily (9 AM EST)'0 6 * * 1-5'- 6:00 AM UTC, Monday-Friday only
If you want to test locally before pushing to GitHub:
-
Install Python dependencies:
pip install -r requirements.txt
-
Create
.envfile (copy from.env.example):cp .env.example .env
-
Edit
.envand add your API token:MONDAY_API_TOKEN=your_actual_token_here -
Run the script:
python monday_sync.py
-
Check
monday_sync.logfor results
- Go to Actions tab in GitHub
- Click on any workflow run
- Click sync job to see detailed logs
- Download logs artifact for detailed analysis
- Number of items retrieved from each board
- Items created, updated, or skipped
- Any errors encountered
- Total sync statistics
- Make sure you added the secret in GitHub Settings → Secrets
- Secret names are case-sensitive
- Check your API token is valid
- Ensure the token has access to both boards
- Regenerate token if needed
- Verify the
column_idexists in your Main Board - Check that items have a value in the
column_idcolumn - Review logs for specific error messages
- Check that GitHub Actions is enabled for your repository
- Verify the workflow file is in
.github/workflows/directory - Check the Actions tab for any error messages
100% FREE ✅
- GitHub Actions provides 2,000 free minutes/month for private repos
- This script uses ~1 minute per run
- Running daily = 30 minutes/month (well within free tier)
- Public repos get unlimited free minutes
The script handles all Monday.com column types:
- ✅ Text
- ✅ Status
- ✅ Date
- ✅ People
- ✅ Numbers
- ✅ Phone
- ✅ Link
- ✅ Dropdown
- ✅ Checkbox
- ✅ Timeline
- ✅ Long Text
- Never commit your
.envfile (it's in.gitignore) - Never commit your API token to git
- Use GitHub Secrets for all sensitive data
- Consider using a private repository
If you encounter issues:
- Check the logs in GitHub Actions
- Review the
monday_sync.logfile - Verify your API token and board IDs
- Ensure both boards have the same column structure
MIT License - feel free to modify and use as needed.