- Explain all 4 sync options (Full, Incremental, Chunked, Selected) - Detail when to use each sync type with real-world examples - Document date range selector and its impact on performance - List all entities with their dependencies - Provide best practices for daily, weekly, and monthly syncs - Include troubleshooting guide for common sync issues - Add quick reference table for common scenarios - Explain sync results (added/updated/deleted counts) - Document API limits and performance considerations - Reference analysis script for investigating failures This guide clarifies the sync interface to help users understand what each option does and how to use it effectively.
15 KiB
Sync Interface User Guide
Overview
The Sync Interface allows you to synchronize data from Autotask to your PostgreSQL database. This guide explains each sync option, when to use it, and what to expect.
Sync Interface Location
Access the sync interface at: Admin Dashboard → Sync Controls
Sync Options
1. Full Sync 🔄
What it does:
- Syncs all entities from Autotask to PostgreSQL
- Fetches all active records for each entity type
- Soft-deletes records that exist in your database but are no longer in Autotask
- Respects the date range filter for time-based entities (Tickets, Tasks, Projects)
When to use:
- Initial setup - First time syncing your Autotask data
- Data recovery - After database issues or data corruption
- Periodic refresh - Monthly or quarterly to ensure data consistency
- After major Autotask changes - When records have been bulk-deleted or modified in Autotask
Important notes:
- ⚠️ Requires confirmation - Shows a warning dialog before starting
- ⏱️ Takes longest - Can take 10-30 minutes depending on data volume
- 🗑️ Soft-deletes missing records - Sets
is_deleted = truefor records not found in Autotask - 📅 Respects date range - For Tickets/Tasks/Projects, only syncs within selected date range
Example use case:
"It's the first Monday of the month. I want to ensure all our data is fresh and any deleted records in Autotask are marked as deleted in our database."
What gets synced (in order):
- Companies
- Resources (Users)
- Statuses
- Issue Types
- Sub-Issue Types
- Work Types
- Contacts
- Projects
- Tickets (within date range)
- Tasks (within date range)
- Configuration Items
- Contracts
- Billing Items
- Time Entries (within date range)
2. Incremental Sync ⚡
What it does:
- Syncs only records modified since the last sync
- Uses Autotask's
lastModifiedDatefield to filter records - Much faster than Full Sync
- Does NOT soft-delete missing records
When to use:
- Daily updates - Regular scheduled syncs to keep data current
- Quick refresh - After making changes in Autotask
- Automated syncs - Set up on a cron schedule (e.g., every 4 hours)
- Low-impact updates - When you need fresh data without heavy processing
Important notes:
- ✅ No confirmation needed - Starts immediately
- ⚡ Fast - Typically completes in 1-5 minutes
- 🔄 Additive only - Adds/updates records but doesn't delete
- 📊 Best for routine updates - Ideal for keeping data fresh
Example use case:
"A technician just closed several tickets in Autotask. I want to pull those updates into our dashboard without running a full sync."
How it works:
- Checks
sync_historytable for last successful sync of each entity - Queries Autotask for records where
lastModifiedDate > last_sync_time - Updates existing records or inserts new ones
- Skips entities that have no modifications
3. Chunked Tickets 📦
What it does:
- Syncs only Tickets in monthly date chunks
- Breaks large date ranges into manageable pieces
- Prevents API timeouts and memory issues
- Shows real-time progress for each chunk
When to use:
- Large date ranges - Syncing 3+ years of ticket history
- Initial ticket sync - First time pulling historical tickets
- Timeout prevention - When regular ticket sync fails with timeouts
- Off-hours processing - Running overnight syncs for historical data
Important notes:
- 📊 Progress tracking - Shows which month is currently syncing
- 🔄 Resilient - Continues even if individual chunks fail
- 🎯 Tickets only - Does not sync other entities
- ⏱️ Slower but reliable - Takes longer but handles large datasets
Example use case:
"I need to sync 5 years of ticket history. A regular sync times out, so I'll use Chunked Tickets to process it month by month."
How it works:
- Calculates monthly chunks based on selected date range
- Processes each month sequentially (e.g., "Jan 2024", "Feb 2024", etc.)
- Shows progress: "Processing chunk 15/60: Mar 2023"
- Continues even if some months fail (logs failures)
- Displays final summary with total records processed
Date range examples:
- Last 7 Days → ~1 chunk
- Last 2 Years → ~24 chunks
- Last 5 Years → ~60 chunks
- All Time → Could be 100+ chunks
4. Sync Selected 🎯
What it does:
- Syncs only the entities you select from the entity list
- Full sync for selected entities (not incremental)
- Respects date range for time-based entities
- Does NOT soft-delete missing records
When to use:
- Targeted updates - Only need to refresh specific entities
- Dependency sync - Sync Companies before syncing Tickets
- Troubleshooting - Re-sync a specific entity that had errors
- Testing - Verify sync works for a single entity
Important notes:
- ✅ Requires entity selection - Must select at least one entity
- 🎯 Selective - Only syncs what you choose
- ⚠️ Respect dependencies - Ensure parent entities are synced first
- 📅 Uses date range - For Tickets/Tasks/Projects
Example use case:
"We just imported 50 new companies into Autotask. I only need to sync Companies and Contacts, not everything else."
Entity dependencies to consider:
- Contacts → Requires Companies
- Tickets → Requires Companies, Resources, Contacts
- Tasks → Requires Resources, Projects, Tickets
- Configuration Items → Requires Companies, Contacts
- Time Entries → Requires Companies, Resources, Projects, Tasks, Tickets
How to use:
- Click entity checkboxes to select (e.g., Companies, Contacts)
- Set date range if syncing time-based entities
- Click "Sync Selected (2)" button
- Monitor progress in sync history
Date Range Selector 📅
Applies to: Tickets, Tasks, Projects, Time Entries
Available ranges:
- Last 7 Days (0.019 years) - Quick updates, minimal data
- Last 30 Days (0.082 years) - Monthly refresh
- Last 90 Days (0.25 years) - Quarterly data
- Last 1 Year - Recent history
- Last 2 Years ⭐ Recommended - Good balance of history and performance
- Last 3 Years - Extended history
- Last 5 Years - Long-term analysis
- Last 10 Years - Comprehensive history
- All Time ⚠️ - Complete history (very slow, use off-hours)
Why limit date ranges?
- Performance - Fewer records = faster sync
- API limits - Autotask has rate limits and timeout thresholds
- Relevance - Most reporting focuses on recent data
- Resource usage - Large syncs consume more memory and CPU
Recommendation:
- Daily syncs: Last 7-30 Days
- Weekly syncs: Last 90 Days
- Monthly syncs: Last 1-2 Years
- Initial setup: Last 2 Years, then run "All Time" overnight if needed
Entity Selector
Available entities:
| Entity | Description | Dependencies |
|---|---|---|
| Companies | Customer/vendor organizations | None |
| Resources | Autotask users/technicians | None |
| Statuses | Ticket/task statuses | None |
| Issue Types | Ticket categorization | None |
| Sub-Issue Types | Ticket sub-categories | None |
| Work Types | Time entry work types | None |
| Contacts | People at companies | Companies |
| Projects | Customer projects | Companies, Resources |
| Tickets | Support tickets | Companies, Resources, Contacts |
| Tasks | Project/ticket tasks | Resources, Projects, Tickets |
| Configuration Items | Assets/devices | Companies, Contacts |
| Contracts | Service agreements | Companies, Contacts |
| Billing Items | Billable items | Companies, Tasks, Tickets, Projects |
| Time Entries | Time tracking | Companies, Resources, Projects, Tasks, Tickets |
Selection tips:
- ✅ Select dependencies first - e.g., Companies before Contacts
- 🔄 Use "Select All" for full sync
- 🎯 Deselect unneeded - Skip entities you don't use
- ⚠️ Check order - Entities sync in dependency order automatically
Sync Progress & Monitoring
Real-time Progress
- Progress bars - Visual indication of sync status
- Record counts - Shows records added/updated/deleted
- Chunk tracking - For chunked syncs, shows current month
- Error alerts - Immediate notification of failures
Sync History Table
- Recent syncs - Last 50 sync operations
- Status indicators - ✅ Completed, ❌ Failed, ⏳ In Progress
- Timing data - Duration and timestamps
- Error messages - Detailed failure information
- Filter options - By entity, status, or date
Background Processing
- Syncs run in the background (server-side)
- UI remains responsive during sync
- Dashboard auto-refreshes every 30 seconds
- Can close browser - sync continues on server
Best Practices
Daily Operations
Morning: Incremental Sync (Last 7 Days)
→ Fast refresh of overnight changes
→ 2-5 minutes
Weekly Maintenance
Monday: Full Sync (Last 90 Days)
→ Ensure data consistency
→ Clean up deleted records
→ 10-15 minutes
Monthly Deep Sync
First of Month: Full Sync (Last 2 Years)
→ Comprehensive data refresh
→ Historical accuracy
→ 20-30 minutes
Initial Setup
Step 1: Full Sync (Last 2 Years)
→ Get recent operational data
→ 20-30 minutes
Step 2: Chunked Tickets (All Time) - Optional
→ Run overnight for complete history
→ 1-3 hours depending on volume
Troubleshooting
"Sync is taking too long"
Solution: Use Chunked Tickets for large date ranges
- Switch from "All Time" to "Last 2 Years"
- Use Chunked Tickets for historical data
- Run large syncs during off-hours
"Sync failed with timeout error"
Solution: Reduce scope
- Decrease date range (e.g., from 5 years to 1 year)
- Use Chunked Tickets instead of Full Sync
- Sync entities individually using Sync Selected
"Missing records in database"
Solution: Run Full Sync
- Full Sync will fetch all active records
- Check date range - records outside range won't sync
- Verify records exist and are active in Autotask
"Deleted records still showing"
Solution: Run Full Sync
- Only Full Sync performs soft-deletes
- Incremental and Entity syncs don't remove records
- Check
is_deletedflag in database
"Foreign key constraint errors"
Solution: Sync dependencies first
- Sync Companies before Contacts
- Sync Resources before Tickets
- Use Full Sync to handle dependencies automatically
"Some entities failed, others succeeded"
Check: Sync History table
- Review error messages for failed entities
- Re-sync failed entities individually
- Check Autotask API connectivity
- Review logs:
npx tsx scripts/analyze-sync-failures.ts
Understanding Sync Results
Record Counts
Records Added (+)
- New records inserted into database
- First time seeing this record from Autotask
Records Updated (~)
- Existing records modified
- Changes detected from Autotask
Records Deleted (-)
- Records soft-deleted (Full Sync only)
- Set
is_deleted = truewhen not found in Autotask - Only happens during Full Sync
Example Results
✅ Companies: +5 ~23 -2
→ 5 new companies
→ 23 companies updated
→ 2 companies soft-deleted (no longer in Autotask)
✅ Tickets: +142 ~67 -0
→ 142 new tickets
→ 67 tickets updated
→ 0 deleted (incremental sync doesn't delete)
Sync Timing Recommendations
Business Hours (9 AM - 5 PM)
- ✅ Incremental Sync (Last 7-30 Days)
- ✅ Sync Selected (specific entities)
- ⚠️ Avoid Full Sync with large date ranges
- ⚠️ Avoid Chunked Tickets for All Time
Off-Hours (Evening/Night)
- ✅ Full Sync (Last 2+ Years)
- ✅ Chunked Tickets (All Time)
- ✅ Large historical syncs
- ✅ Data recovery operations
Automated Schedule (Recommended)
Every 4 hours: Incremental Sync
→ Keeps data fresh throughout the day
Daily at 2 AM: Full Sync (Last 90 Days)
→ Maintains data consistency
Weekly Sunday 1 AM: Full Sync (Last 2 Years)
→ Deep refresh and cleanup
API Rate Limits & Performance
Autotask API Limits
- Rate limit: ~500 requests per hour per integration
- Timeout: 60 seconds per request
- Page size: 500 records maximum per page
Sync Performance Tips
- Use Incremental Sync for routine updates
- Limit date ranges to reduce API calls
- Avoid concurrent syncs - wait for one to finish
- Use Chunked Tickets for large datasets
- Schedule heavy syncs during off-hours
Estimated Sync Times
| Sync Type | Date Range | Estimated Time |
|---|---|---|
| Incremental | N/A | 2-5 minutes |
| Full Sync | Last 7 Days | 5-10 minutes |
| Full Sync | Last 90 Days | 10-15 minutes |
| Full Sync | Last 2 Years | 20-30 minutes |
| Chunked Tickets | Last 5 Years | 1-2 hours |
| Chunked Tickets | All Time | 2-4 hours |
Times vary based on data volume and API performance
Analyzing Sync Failures
Use the sync failure analysis script to investigate issues:
# Show failures from last 7 days
npx tsx scripts/analyze-sync-failures.ts
# Show all syncs from yesterday
npx tsx scripts/analyze-sync-failures.ts --days 1 --all
# Check specific entity failures
npx tsx scripts/analyze-sync-failures.ts --days 30 --entity tickets
# Show all completed syncs
npx tsx scripts/analyze-sync-failures.ts --status completed --all
The script provides:
- Failure summary by entity
- Error categorization (NETWORK_ERROR, DATABASE_ERROR, etc.)
- Success rate statistics
- Detailed error messages
- Timing information
Quick Reference
| Need | Use This | Time |
|---|---|---|
| Quick update | Incremental Sync | 2-5 min |
| Daily refresh | Incremental (Last 7 Days) | 2-5 min |
| Weekly cleanup | Full Sync (Last 90 Days) | 10-15 min |
| Monthly deep sync | Full Sync (Last 2 Years) | 20-30 min |
| Initial setup | Full Sync (Last 2 Years) | 20-30 min |
| Historical tickets | Chunked Tickets (All Time) | 1-3 hours |
| Single entity | Sync Selected | 1-10 min |
| After timeout | Chunked Tickets | Varies |
| Data recovery | Full Sync (appropriate range) | Varies |
Support & Additional Resources
- Sync Logging Documentation:
docs/SYNC_LOGGING_IMPROVEMENTS.md - Analysis Script:
scripts/analyze-sync-failures.ts - Sync History: Admin Dashboard → Sync History Table
- Error Logs: Check structured logs for detailed error information
Summary
For most users:
- Run Incremental Sync daily for routine updates
- Run Full Sync weekly/monthly for data consistency
- Use Chunked Tickets for large historical syncs
- Use Sync Selected for targeted entity updates
Remember:
- ✅ Incremental = Fast, additive only
- 🔄 Full = Complete, includes soft-deletes
- 📦 Chunked = Reliable for large datasets
- 🎯 Selected = Targeted, specific entities
Date ranges matter:
- Smaller ranges = Faster syncs
- Larger ranges = More complete data
- Balance based on your needs and available time