Harel Trabelsi
04/16/2026, 1:01 PMkapa.ai
04/16/2026, 1:04 PMnull, the sync will behave like a full refresh. [Fetching Updated Data] 3. Records Updated Without Updating the Cursor Field If records in the source are modified but the cursor field (e.g., updated_at) is not updated, those records won't be picked up by incremental sync. The underlying query used is:
SELECT * FROM table WHERE cursor_field >= 'last_sync_max_cursor_field_value'
If the cursor value doesn't change, the record is invisible to the next sync. [Incremental Sync - Append] 4. Connector-Specific Bugs Several connectors have had known bugs where incremental sync was broken:
⢠Klaviyo: Incremental streams were behaving as full refresh. [Klaviyo Incremental Issue]
⢠HubSpot Contacts: Moving to a low-code approach broke incremental syncing, causing all contacts to be pulled instead of only updated ones. [HubSpot Issue]
⢠Gong: Streams like extensiveCalls and callTranscripts had hardcoded start dates, causing full re-fetches on every sync. [Gong Issue]
⢠Postgres (CTID cursor): When a sync returns 0 records for a stream, the cursor resets to (0,0), causing a full table re-read on the next sync. [Postgres CTID Issue] 5. Source Schema Changes If a column is added, renamed, or deleted in the source, incremental sync cannot handle this automatically. A Full Refresh - Overwrite is recommended in this case. [Incremental Sync - Append] Recommended troubleshooting steps:
1. Check the Connection State in the Airbyte UI to confirm a cursor value is being saved after each sync.
2. Verify the cursor field is correctly configured and is being updated in the source data.
3. Check your connector version and update it, as many incremental sync bugs have been fixed in newer versions.
4. Review the sync logs for clues such as a null cursor or missing state. š 0 button š 0 button ā¹ļø Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Harel Trabelsi
04/16/2026, 1:08 PMkapa.ai
04/16/2026, 1:08 PMnull in the logs, the incremental sync won't work correctly and will behave like a full refresh. [Incremental Sync Issue] 3. Connector-Specific Bug Some connectors have known bugs where the state is not properly preserved between syncs. For example, with Postgres CTID-based incremental syncs, when a sync returns 0 new records, the cursor was resetting to (0,0), causing a full table re-read on the next sync. [Postgres CTID Fix]
For custom connectors, a "doubled up" or corrupted state object can cause subsequent syncs to fail or behave unexpectedly. [Connector State Issue] Recommended Next Steps 1. Check the Connection State in the UI ā is a cursor value actually being saved after each sync?
2. Review the sync logs for any null cursor values or state-related errors.
3. Update your connector to the latest version, as incremental sync bugs are frequently patched.
4. If using a custom connector, verify that get_updated_state() is returning the correct state structure and that the cursor field value is a plain string/timestamp, not a nested dictionary. š 0 button š 0 button ā¹ļø Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.