wulf-pulse/docs/SYNC_INTERFACE_GUIDE.md
root a14a03140b docs: add comprehensive sync interface user guide
- 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.
2026-01-23 08:32:11 -05:00

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 = true for 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):

  1. Companies
  2. Resources (Users)
  3. Statuses
  4. Issue Types
  5. Sub-Issue Types
  6. Work Types
  7. Contacts
  8. Projects
  9. Tickets (within date range)
  10. Tasks (within date range)
  11. Configuration Items
  12. Contracts
  13. Billing Items
  14. Time Entries (within date range)

2. Incremental Sync

What it does:

  • Syncs only records modified since the last sync
  • Uses Autotask's lastModifiedDate field 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:

  1. Checks sync_history table for last successful sync of each entity
  2. Queries Autotask for records where lastModifiedDate > last_sync_time
  3. Updates existing records or inserts new ones
  4. 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:

  1. Calculates monthly chunks based on selected date range
  2. Processes each month sequentially (e.g., "Jan 2024", "Feb 2024", etc.)
  3. Shows progress: "Processing chunk 15/60: Mar 2023"
  4. Continues even if some months fail (logs failures)
  5. 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:

  1. Click entity checkboxes to select (e.g., Companies, Contacts)
  2. Set date range if syncing time-based entities
  3. Click "Sync Selected (2)" button
  4. 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?

  1. Performance - Fewer records = faster sync
  2. API limits - Autotask has rate limits and timeout thresholds
  3. Relevance - Most reporting focuses on recent data
  4. 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_deleted flag 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 = true when 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
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

  1. Use Incremental Sync for routine updates
  2. Limit date ranges to reduce API calls
  3. Avoid concurrent syncs - wait for one to finish
  4. Use Chunked Tickets for large datasets
  5. 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