Skip to content

Sync Scheduling

Querri’s sync scheduling keeps your connected data sources up to date automatically. Set up recurring syncs on a schedule — hourly, daily, weekly, or custom cron — and Querri pulls the latest data from your connectors without manual intervention.

Without scheduling, connector data is a snapshot from the moment you first connected. Scheduling ensures your dashboards, reports, and AI analyses always reflect the current state of your source systems.

Common patterns:

  • Daily morning sync — fresh data ready when your team starts work
  • Hourly sync — near-real-time visibility into fast-moving data (sales pipelines, support tickets)
  • Weekly full refresh — clean baseline that catches schema changes and deleted records

Querri supports two sync types, and the recommended approach is to use both together.

A full sync re-downloads every record from the source. It replaces the existing dataset with a complete, current snapshot.

When to use full sync:

  • You need to catch deleted records (incremental sync can’t detect deletions)
  • The source schema has changed (new columns, renamed fields)
  • Data needs a clean baseline periodically
  • The data source is small enough that a full re-download is fast

Trade-offs:

  • Guarantees a complete, accurate dataset
  • Slower for large data sources
  • Uses more API calls and bandwidth
  • Overwrites the existing dataset entirely

Incremental sync fetches only records that have changed since the last sync. It uses a cursor-based high-water mark — a timestamp or sequential value that advances after each successful sync.

How it works:

  1. First sync — pulls all records (identical to a full sync) and records the highest cursor value (e.g., the most recent LastModifiedDate)
  2. Subsequent syncs — adds a filter (e.g., WHERE LastModifiedDate > '2026-03-07T15:30:00Z') so only new/modified records are fetched
  3. Append — new records are appended to the existing dataset, preserving full history

When to use incremental sync:

  • Large data sources where full re-download is slow or expensive
  • Data that grows continuously (transactions, events, logs)
  • API rate limits make full syncs impractical
  • You need frequent updates without the overhead of full re-reads

Trade-offs:

  • Much faster after the first sync
  • Uses fewer API calls
  • Cannot detect deleted records
  • Requires a reliable cursor column (timestamp or sequential ID)
AspectFull SyncIncremental Sync
What it fetchesEvery record, every timeOnly new/changed records
SpeedSlower for large datasetsMuch faster after first sync
API usageHigherLower
Handles deletesYesNo
Handles schema changesYesNo
Best forSmall datasets, weekly baselinesLarge datasets, frequent updates

The best approach is to combine both sync types:

ScheduleTypeExample CronPurpose
FrequentIncremental0 */1 * * * (hourly)Catch new and updated records quickly
PeriodicFull0 4 * * 0 (Sunday 4 AM)Clean slate — catches deletes, schema changes, missed records

This gives you near-real-time freshness during the week with a guaranteed-correct baseline on a regular cadence.

  1. Go to Settings → Connectors
  2. Select your connector
  3. Open the Schedule tab
  4. Click Add Schedule
  5. Choose the Sync Type — Full or Incremental
  6. Enter a Cron Expression (e.g., 0 8 * * * for daily at 8 AM)
  7. Select your Timezone
  8. Click Save
ExpressionMeaning
0 8 * * *Daily at 8:00 AM
0 */2 * * *Every 2 hours
0 */4 * * *Every 4 hours
30 6 * * 1-5Weekdays at 6:30 AM
0 3 * * 0Sundays at 3:00 AM
0 0 1 * *First day of each month at midnight

All times are in the timezone you select. Querri uses 5-field cron syntax (minute, hour, day-of-month, month, day-of-week).

A connector can have up to two schedules — one full and one incremental. To set up dual schedules:

  1. Create an incremental schedule (e.g., hourly)
  2. Create a full schedule (e.g., weekly)
  3. Optionally enable Skip sources with active incremental sync on the full schedule

When this option is enabled on a full-sync schedule, sources that are already covered by an incremental schedule will be skipped during the full sync. This is useful when you have a mix of sources — some with reliable cursor columns (use incremental) and some without (need full sync only).

These connectors have built-in cursor fields — no additional configuration required:

ConnectorCursor FieldWhat Supports Incremental
QuickBooksMetaData.LastUpdatedTimeQuery operations only (Invoices, Customers, Payments, etc.)
HubSpoths_lastmodifieddateAll CRM objects (Contacts, Companies, Deals, Tickets, custom objects)
SalesforceLastModifiedDateAll standard and custom objects

When you create an incremental schedule, these connectors automatically filter API requests using their built-in cursor field.

QuickBooks has two types of data sources:

  • Query operations (Invoices, Customers, Payments, Items, etc.) — support incremental sync via MetaData.LastUpdatedTime
  • Report operations (Profit & Loss, Balance Sheet, etc.) — do not support incremental sync because reports are computed snapshots without individual record timestamps

During an incremental sync, report sources are automatically skipped. They will sync only during full syncs.

Recommended QuickBooks setup:

  • Incremental schedule every 2–4 hours (keeps transactional data fresh)
  • Full schedule weekly or daily (refreshes reports and catches deletes)

All HubSpot CRM objects support incremental sync. The connector uses HubSpot’s Search API with lastmodifieddate filtering to fetch only changed records. Custom objects follow the same pattern.

Recommended HubSpot setup:

  • Incremental schedule every 1–2 hours
  • Full schedule weekly

All Salesforce standard and custom objects support incremental sync via SOQL WHERE LastModifiedDate > ... filtering. Incremental syncs automatically use the REST API instead of Bulk 2.0 for faster small-delta fetches.

Recommended Salesforce setup:

  • Incremental schedule every 1–4 hours depending on data volume
  • Full schedule weekly

Database connectors (PostgreSQL, MySQL, SQL Server, Redshift, BigQuery) require you to specify which column to use as the cursor.

Pick a column that reliably updates whenever a row is inserted or modified:

Column TypeGood ForExample
updated_at / modified_atTables with update trackingBest choice — catches both inserts and updates
created_atAppend-only tablesOnly catches new rows, not updates to existing rows
Auto-incrementing idAppend-only tablesOnly catches new rows; sequential guarantee
  1. In the schedule configuration, expand Cursor Configuration
  2. Enter the column name to use as the cursor (e.g., updated_at)
  3. Querri validates that the column exists on the selected tables before saving

Recommended database setup:

  • Incremental schedule every 1–4 hours on tables with good updated_at columns
  • Full schedule daily or weekly on all tables (catches schema changes and tables without cursors)
  • Enable “Skip sources with active incremental sync” on the full schedule so tables with cursors aren’t double-synced

Every sync run is logged in the connector’s Run History tab. Each entry shows:

  • Status — completed, failed, or skipped
  • Sync type — full or incremental
  • Per-source detail — which sources were synced, skipped, or errored
  • Duration — how long each source took
  • Rows fetched — number of records retrieved

When a source is skipped, the run history shows the reason:

  • “Source does not support incremental sync” — the source type doesn’t have a cursor field (e.g., QuickBooks reports)
  • “No cursor field configured” — database table without a cursor column specified
  • “Skipped by full-sync schedule” — the source has an active incremental schedule and was excluded from the full sync

You can trigger a sync outside the schedule at any time:

  1. Go to Settings → Connectors
  2. Select your connector
  3. Click Sync Now

Manual syncs always run a full sync by default.

Problem: The schedule was saved but syncs aren’t happening.

Check:

  • The schedule is enabled (not paused)
  • The cron expression is valid
  • The connector is still connected (check connection status)
  • The timezone is correct (a schedule set to 8 AM Pacific won’t run at 8 AM Eastern)

Problem: Some records appear in the source but not in Querri after an incremental sync.

Possible causes:

  • The record was modified before the cursor window
  • The cursor column doesn’t update on every type of change
  • Clock skew between the source system and Querri

Solution: Run a manual full sync. If this happens regularly, shorten the incremental interval or switch to full sync for that source.

Problem: The same records appear multiple times.

Cause: This is expected behavior for incremental append operations, particularly when cursor values have low precision (date-only instead of datetime).

Solution: Querri deduplicates at query time. Schedule periodic full syncs to reset the dataset if exact deduplication is important.

Problem: The sync keeps re-fetching the same records.

Check:

  • The run history for errors — a failed sync doesn’t advance the cursor
  • The cursor column for NULL values or non-monotonic values
  • Whether the source system’s clock is synchronized

”Source does not support incremental sync”

Section titled “”Source does not support incremental sync””

Problem: A source you expected to sync incrementally was skipped.

Solution: Check the per-connector details above to confirm whether that source type supports cursors. QuickBooks reports and database tables without timestamp columns cannot use incremental sync — they will sync on the full schedule instead.

  1. Start with full sync, then add incremental — get a complete baseline before switching to deltas
  2. Always keep a full-sync schedule — catches deletes, schema changes, and edge cases the cursor misses
  3. Choose timestamp over ID for database cursors — timestamps catch both inserts and updates; IDs only catch inserts
  4. Don’t over-sync — hourly incremental is usually sufficient; every-minute syncing creates unnecessary load
  5. Monitor run history — watch for increasing sync durations or growing numbers of skipped sources
  6. Use “skip incremental sources” on full schedules — avoids redundant work on sources that are already syncing incrementally