Naveen Jakad
05/07/2026, 4:14 PMkapa.ai
05/07/2026, 4:14 PMsource-appsflyer connector enforces a 90-day maximum start date for all streams, regardless of what you configure. In SourceAppsflyer.streams(), this line caps your start date: [source code]
earliest_date = pendulum.today(timezone) - timedelta(days=90)
config["start_date"] = self.is_start_date_before_earliest_date(start_date, earliest_date)
So your effective start date is always today - 90 days.
Why It Worked Yesterday But Fails Today The organic_in_app_events and in_app_events streams use RawDataMixin with intervals = 31, meaning they chunk requests into 31-day windows. [source code]
• Yesterday: start_date was 2026-02-04, end_date was 2026-05-06 → the 90-day window happened to fit within 31-day chunks cleanly enough to work.
• Today: start_date is 2026-02-05, end_date is 2026-05-07 → the span is now slightly over a boundary that causes a chunk to exceed 31 days, triggering the AppsFlyer API error: "reports are limited to 31 days per query".
This is a known bug — the connector caps all streams at 90 days even for endpoints that don't need it, and the chunking logic can produce slices that exceed the 31-day API limit for raw data streams. [GitHub issue]
What You Can Do 1. Set start_date to within the last 90 days in your connector config — the connector will ignore anything older anyway.
2. Set start_date to within the last 31 days to ensure raw data stream chunks stay within the API's 31-day limit for in_app_events / organic_in_app_events.
3. Monitor the open issue/PR for a fix: a community PR (#61520) was proposed to address the 90-day cap problem, though it was marked stale. [GitHub issue]
The safest workaround right now is to keep your configured start_date recent enough that the 31-day chunking never produces a slice wider than 31 days. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 4:18 PMkapa.ai
05/07/2026, 4:18 PMtoday - 90 days (≈ 2026-02-05), but only if your configured date is older than 90 days. Since 2026-05-01 is within the last 90 days, it will be used as-is. [source code]
• The window from 2026-05-01 to 2026-05-07 is only 6 days, well within the 31-day chunk limit for in_app_events / organic_in_app_events.
• You would avoid the API error: "reports are limited to 31 days per query".
Trade-off: You will only sync data from May 1st onward — any historical data before that date won't be pulled.
Recommendation Set start_date: 2026-05-01 (or any date within the last 31 days) to keep syncs stable. For ongoing incremental syncs, once the cursor advances, the sync windows will naturally stay small and within limits. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 4:22 PMkapa.ai
05/07/2026, 4:22 PMstart_date as the initial lower bound for fetching records. This is standard Airbyte behavior — start_date seeds the initial cursor. [incremental sync docs]
Subsequent Syncs Once the first sync completes, the cursor state is saved (e.g., the last synced date). On the next sync, the connector should use that saved cursor value instead of start_date.
The Problem With source-appsflyer Looking at the source code, the 90-day cap is applied before the stream even checks the cursor state — it overrides config["start_date"] globally in the streams() method: [source code]
earliest_date = pendulum.today(timezone) - timedelta(days=90)
config["start_date"] = self.is_start_date_before_earliest_date(start_date, earliest_date)
Then in IncrementalAppsflyerStream.stream_slices(), the cursor state is compared against this already-capped `start_date`: [source code]
start_date = self.get_date(parse_date(cursor_value, self.timezone), self.start_date, max)
So it takes the maximum of the cursor value and start_date. This means:
• If your cursor state is more recent than start_date → cursor state is used ✅ (normal incremental behavior)
• If your cursor state is older than the capped start_date, or doesn't exist yet → start_date is used ⚠️
What This Means For You If your sync has been running successfully before and has a valid recent cursor state, subsequent syncs should use the cursor and not be affected by the start_date issue. The error you're seeing today is most likely because:
1. It's your first sync (no cursor state yet), or
2. The cursor state was reset at some point
Setting start_date: 2026-05-01 is still the right fix for the initial sync. Once the cursor advances past that date, incremental syncs will use the cursor state and the start_date becomes irrelevant. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 6:51 PMkapa.ai
05/07/2026, 6:51 PM2026-05-01)
6. Click "Update state" to confirm [manage connection state]
> ⚠️ Warning: Updates to connection state should be handled with extreme care. Updates may break your syncs, requiring a full historical sync to fix. Make changes only as directed by the Airbyte team. [manage connection state]
What to Set the Cursor To For your failed streams (in_app_events, organic_in_app_events), you'd want to set the cursor to a recent date within the last 31 days, for example:
[
{
"streamDescriptor": {
"name": "organic_in_app_events"
},
"streamState": {
"date": "2026-05-01T00:00:00Z"
}
}
]
This way:
• The cursor starts from 2026-05-01
• The sync window to today is only ~6 days
• It stays well within the 31-day API limit
Important Consideration The knowledge sources do not explicitly confirm the exact state schema for AppsFlyer streams, so check your current connection state first before editing — the field names in the state JSON must match exactly what the connector expects, otherwise the sync may break further. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 6:52 PMkapa.ai
05/07/2026, 6:52 PMdocker exec -ti airbyte-db psql -U docker -d airbyte
[incremental sync tutorial]
Step 2: Check Current Cursor State SELECT * FROM state WHERE connection_id = '<your-connection-id>';
This will return something like:
connection_id | state | stream_name | type
--------------+-------+-------------+------
<uuid> | {"state": {"streams": [{"cursor": "2026-02-05T...", "stream_name": "organic_in_app_events", "cursor_field": ["date"]}]}} | | LEGACY
[state table docs]
You can find your connection_id from the Airbyte UI URL when you open your connection.
Step 3: Reset the Cursor for Failed Streams Once you've confirmed the current cursor value, update it to a recent date:
UPDATE state
SET state = jsonb_set(state, '{state, streams, 0, cursor}', '"2026-05-01T00:00:00.000000Z"', false)
WHERE connection_id = '<your-connection-id>';
[forum post]
> If you have multiple streams in the state, streams, 0 refers to the first stream. Change the index (0, 1, 2...) to target the correct failed stream.
If Running on Kubernetes You can port-forward the airbyte-db service and then connect using a UI client like DBeaver to make it easier to inspect and edit the state table visually. [forum post]
⚠️ Important Notes • Always run the SELECT query before the UPDATE to confirm the exact JSON structure of your state — the path ({state, streams, 0, cursor}) must match exactly.
• Make a note of the original value before changing it, in case you need to revert. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 6:57 PM{
"event_time": "2026-05-06 00:12:46"
}
this is the value for in_app_events in airbyte and I am using inncremental_append then why 90 days issues is comng? @kapa.aikapa.ai
05/07/2026, 6:57 PM{"event_time": "2026-05-06 00:12:46"} is very recent (yesterday), so the cursor itself is not the problem.
The issue is in how the connector code works. Looking at the stream_slices() method: [source code]
start_date = self.get_date(parse_date(cursor_value, self.timezone), self.start_date, max)
This takes the maximum of:
• Your cursor value: 2026-05-06
• `self.start_date`: which is the already 90-day-capped config start date (2026-02-05)
So 2026-05-06 wins here ✅ — the cursor is used correctly.
Then Why Is It Still Failing? The error you're seeing:
In app events reports: reports are limited to 31 days per query
is not coming from the cursor state. It's most likely coming from a different stream in the same sync job. Looking at your original log:
source ERROR Encountered an exception while reading stream organic_in_app_events
The organic_in_app_events stream may have a different or missing cursor state, causing it to fall back to the 90-day-capped start_date (2026-02-05), which creates a window larger than 31 days. [source code]
What to Check Run this query to see the cursor state for all streams in your connection:
SELECT state FROM state WHERE connection_id = '<your-connection-id>';
You likely have a recent cursor for in_app_events but a missing or old cursor for organic_in_app_events. Setting the cursor for organic_in_app_events to a recent date (e.g., 2026-05-01) via the UI or DB should fix the issue. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 7:00 PMkapa.ai
05/07/2026, 7:00 PMin_app_events stream, not organic_in_app_events as previously suspected. What the Logs Tell Us 1. These streams completed successfully: ◦ daily_report ✅ ◦ installs ✅ ◦ organic_in_app_events ✅ ◦ organic_installs ✅ ◦ retargeting_in_app_events ✅ ◦ retargeting_installs ✅ ◦ retargeting_partners_report ✅ 1. in_app_events failed with the 31-day limit error. Root Cause Since organic_in_app_events succeeded but in_app_events failed, it strongly suggests that in_app_events has a missing or outdated cursor state, causing it to fall back to the 90-day-capped start_date (2026-02-05), creating a window larger than 31 days. Fix: Check and Update the Cursor in DB First, check the current state: SELECT state FROM state WHERE connection_id = '<your-connection-id>'; Look for in_app_events in the JSON output. You likely see something like: {
"event_time": "2026-05-06 00:12:46"
} for organic_in_app_events but nothing or an old date for in_app_events. Then update it: UPDATE state SET state = jsonb_set( state, '{state, streams, 0, cursor}', '"2026-05-06T00:00:00.000000Z"', false ) WHERE connection_id = '<your-connection-id>'; > ⚠️ Make sure to check the exact JSON path for in_app_events in your state before updating — the index (0, 1, 2...) must point to the correct stream entry. [forum post] Alternatively, use the Airbyte UI under Connection → Settings → Advanced → Connection State to edit it visually, which is safer as you can see the full JSON structure before editing. [manage connection state] 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 7:03 PMkapa.ai
05/07/2026, 7:03 PMin_app_events cursor is already 2026-05-06 00:12:46, then:
• The connector should use 2026-05-06 as start date (max of cursor vs capped start_date)
• The window from 2026-05-06 to 2026-05-07 is only 1 day
• This is well within the 31-day limit
So resetting the cursor is not the solution here.
What Could Actually Be Causing the Failure The error occurs during check_availability, which happens before the cursor state is even applied:
File "/usr/local/lib/python3.11/site-packages/airbyte_cdk/sources/streams/http/availability_strategy.py", line 56, in check_availability
is_available, reason = self.handle_http_error(stream, logger, source, error)
The check_availability method makes a test request to validate the stream is accessible, and this test request may be using the 90-day-capped start_date directly from config, completely ignoring the cursor state.
What I'd Recommend The knowledge sources do not contain enough detail about the exact check_availability implementation in source-appsflyer to confirm this with certainty. However, I'd suggest:
1. Check your configured start_date in the AppsFlyer source settings — if it's older than 90 days (e.g., 2020-01-01), the availability check likely uses the capped date (2026-02-05) and creates a >31 day window
2. Change the configured start_date to 2026-05-01 in the source settings — this would fix the availability check without needing to touch the cursor state
3. The cursor state will still take over for actual data syncing since 2026-05-06 > 2026-05-01 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 7:04 PMstart_date is coming into picture @kapa.ai in this casekapa.ai
05/07/2026, 7:05 PMstart_date is involved even when you have a valid cursor state.
The check_availability Call From your traceback:
File "airbyte_cdk/sources/abstract_source.py", line 130, in read
stream_is_available, reason = stream_instance.check_availability(logger, self)
This check_availability is called before any cursor state is applied. It makes a test API request to verify the stream is accessible.
How start_date Gets Into the Test Request Looking at the SourceAppsflyer.streams() method, the start_date is set globally at connector startup: [source code]
earliest_date = pendulum.today(timezone) - timedelta(days=90)
start_date = parse_date(config.get("start_date") or pendulum.today(timezone), timezone)
config["start_date"] = self.is_start_date_before_earliest_date(start_date, earliest_date)
And then request_params uses it directly: [source code]
def request_params(self, stream_state, stream_slice=None, next_page_token=None):
params = {
"from": pendulum.yesterday(self.timezone).to_date_string(),
"to": pendulum.today(self.timezone).to_date_string(),
...
}
The Key Sequence 1. Connector starts
2. config["start_date"] gets capped to 90 days (2026-02-05)
3. check_availability() fires → makes test API request using start_date (2026-02-05)
4. Window = 2026-02-05 to 2026-05-07 = ~90 days → EXCEEDS 31-day limit
5. API returns error → stream marked as unavailable
6. Cursor state is NEVER even checked
So the cursor state {"event_time": "2026-05-06 00:12:46"} is completely bypassed because the failure happens at the availability check stage, before incremental logic kicks in.
The Real Fix The only reliable fix given the current connector code is to set start_date to a recent date (e.g., 2026-05-01) in your AppsFlyer source configuration. This ensures:
• The availability check uses a recent date ✅
• The window stays within 31 days ✅
• Your cursor state (2026-05-06) still takes over for actual data syncing since it's more recent ✅ 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 7:06 PMkapa.ai
05/07/2026, 7:06 PMstart_date is not saved per stream in the database. It is part of the source connector configuration, not the state table.
It is stored in the actor table in the Airbyte database, which holds connector configurations: [data catalog docs]
SELECT id, name, configuration
FROM actor
WHERE actor_type = 'source'
AND name LIKE '%appsflyer%';
The configuration column is a JSONB field that contains your source settings including `start_date`:
{
"app_id": "...",
"api_token": "...",
"start_date": "2020-01-01",
"timezone": "UTC"
}
How to Update It UPDATE actor
SET configuration = jsonb_set(configuration, '{start_date}', '"2026-05-01"', false)
WHERE id = '<your-source-id>';
Important Distinction So start_date applies globally to all streams — you cannot set it differently per stream. That's why changing it to 2026-05-01 in the source config is the cleanest fix for your issue.
> ⚠️ I must note that the knowledge sources do not explicitly confirm the actor table name and structure — please verify this before making any changes to avoid breaking your connector configuration. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help., with interactive elementsNaveen Jakad
05/07/2026, 7:08 PMSELECT id, name, configuration
FROM actor
WHERE actor_type = 'source'
AND name LIKE '%onevoneme_appsflyer%';
this giving start _data like {
"app_id": "id1522405338",
"timezone": "US/Pacific",
"api_token": {
"_secret": "airbyte_workspace_047d1871-35a1-4c41-ae8e-dd66bae22c5d_secret_7a014453-4be3-40e4-80a1-bf2a5c1d0c42_v3"
},
"start_date": "2024-01-01"
} but where this start_date is getting saved? where its picking 2026-02-04 then? @kapa.aikapa.ai
05/07/2026, 7:08 PMstart_date in the config is 2024-01-01, which is correctly saved in the actor table. However, the connector overrides it at runtime — it never actually uses 2024-01-01. Here is exactly where it happens in the connector code: [source code] earliest_date = pendulum.today(timezone) - timedelta(days=90) start_date = parse_date(config.get("start_date") or pendulum.today(timezone), timezone) config["start_date"] = self.is_start_date_before_earliest_date(start_date, earliest_date) The Runtime Override Logic 1. Your config start_date = "2024-01-01" ← stored in actor table 2. earliest_date = today - 90 days = 2026-02-05 3. is_start_date_before_earliest_date("2024-01-01", "2026-02-05") → "2024-01-01" is older than 90 days → returns "2026-02-05" 4. config["start_date"] is overridden to "2026-02-05" IN MEMORY 5. Connector uses "2026-02-05" for all requests So: • actor table stores 2024-01-01 ← what you configured • Runtime memory overrides it to 2026-02-05 ← what connector actually uses • Nothing is saved back to DB — this override happens purely in memory every time the sync runs The Fix Since the override happens in code at runtime, changing the DB value alone won't help. The only effective fix is to set start_date to a value within the last 90 days so the override doesn't trigger: UPDATE actor SET configuration = jsonb_set(configuration, '{start_date}', '"2026-05-01"', false) WHERE id = '<your-source-id>'; Or simply update it via the Airbyte UI → Sources → AppsFlyer → Edit → start_date → 2026-05-01. This way: • 2026-05-01 is within 90 days → no override happens ✅ • Availability check uses 2026-05-01 → window is ~6 days → within 31-day limit ✅ • Your cursor state 2026-05-06 is more recent → cursor takes over for actual sync ✅ 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 7:09 PMkapa.ai
05/07/2026, 7:10 PMdef streams(self, config: Mapping[str, Any]) -> List[Stream]:
config["timezone"] = config.get("timezone", "UTC")
timezone = pendulum.timezone(config.get("timezone", "UTC"))
earliest_date = pendulum.today(timezone) - timedelta(days=90)
start_date = parse_date(config.get("start_date") or pendulum.today(timezone), timezone)
config["start_date"] = self.is_start_date_before_earliest_date(start_date, earliest_date)
The config object here is just a Python dictionary passed in memory during the sync job. When it does config["start_date"] = ..., it is:
• ✅ Overriding the value in the in-memory Python dict
• ❌ NOT writing back to the actor table
• ❌ NOT saving to the state table
• ❌ NOT persisted anywhere
Lifecycle of the Override Sync starts
→ actor table config loaded into memory (start_date = "2024-01-01")
→ streams() method overrides in-memory config (start_date = "2026-02-05")
→ Sync runs using "2026-02-05"
Sync ends
→ Memory cleared
→ actor table still has "2024-01-01" unchanged
Next sync starts
→ Same override happens again from scratch
So every single sync recalculates and re-applies the 90-day cap fresh from today - 90 days. That's why you'll always see a different capped date each day in your logs. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 7:11 PMkapa.ai
05/07/2026, 7:11 PMearliest_date = pendulum.today(timezone) - timedelta(days=90)
That's it — it is literally today's date minus 90 days, calculated fresh every time a sync runs.
Your Specific Case Today = 2026-05-07
2026-05-07 - 90 days = 2026-02-05
So 2026-02-05 is the in-memory override value.
Why It Was 2026-02-04 Yesterday Yesterday = 2026-05-06
2026-05-06 - 90 days = 2026-02-04
That's exactly why your logs showed:
# Yesterday's log
Using start_date: 2026-02-04T23:00:00-08:00
# Today's log
Using start_date: 2026-02-05T23:00:00-08:00
The date shifts by 1 day every day because it is always recalculated as today - 90 days at sync runtime. There is no stored value anywhere — it is purely a mathematical calculation based on the current date when the sync executes. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 7:14 PM1. Your config start_date = "2024-01-01" ← stored in actor table
2. earliest_date = today - 90 days = 2026-02-05
3. is_start_date_before_earliest_date("2024-01-01", "2026-02-05")
→ "2024-01-01" is older than 90 days → returns "2026-02-05"
4. config["start_date"] is overridden to "2026-02-05" IN MEMORY
5. Connector uses "2026-02-05" for all requests
this is all fine when Airbyte itself calculating this 90 days back date then how come getting --- 2026-05-07 124553 source ERROR In app events reports: reports are limited to 31 days per query. Select a narrower date range and submit your query again.
2026-05-07 124553 source ERROR Encountered an exception while reading stream in_app_events @kapa.ai is it because of day light savier? has anyone else reported this issue @kapa.aikapa.ai
05/07/2026, 7:14 PMstart_date to 90 days, but the in_app_events stream (a raw data stream) chunks requests using `intervals = 60`: [source code] class IncrementalAppsflyerStream(AppsflyerStream, ABC): intervals = 60 So it creates 60-day chunks from the 90-day window, and the AppsFlyer API rejects any chunk larger than 31 days for raw data streams. Regarding Daylight Saving Time The knowledge sources do not explicitly mention DST as a contributing factor. However, looking at your logs: # Yesterday worked: start_date: 2026-02-04T23:00:00-08:00 # Today failed: start_date: 2026-02-05T23:00:00-08:00 The -08:00 offset suggests your timezone is US/Pacific. The time component 23:00:00 instead of 00:00:00 is indeed a timezone/DST conversion artifact — but the knowledge sources do not contain enough information to confirm whether DST specifically caused today's failure vs yesterday's success. Has Anyone Reported This? Yes — this is a known bug reported in GitHub issue #60994, where all streams are capped at 90 days even for endpoints that don't need it, and the fix was never merged. [GitHub issue] Bottom Line The safest fix remains setting start_date to 2026-05-01 in your source config so: • No 90-day override triggers • No 60-day chunk exceeds the 31-day API limit • Your cursor state 2026-05-06 takes over for actual syncing 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help., with interactive elementsNaveen Jakad
05/07/2026, 7:15 PMkapa.ai
05/07/2026, 7:15 PMstart_date config.
Here's why — every day the calculation shifts:
Tomorrow = 2026-05-08
earliest_date = 2026-05-08 - 90 days = 2026-02-06
And the connector will still use intervals = 60 to chunk requests: [source code]
class IncrementalAppsflyerStream(AppsflyerStream, ABC):
intervals = 60
So the chunk size (60 days) will always exceed the AppsFlyer API's 31-day limit for raw data streams, regardless of what day you run it.
The Pattern Will Repeat Daily Today: start_date = 2026-02-05, chunk = 60 days → FAILS ❌
Tomorrow: start_date = 2026-02-06, chunk = 60 days → FAILS ❌
Day after: start_date = 2026-02-07, chunk = 60 days → FAILS ❌
Permanent Fix Simply update start_date to 2026-05-01 in your source configuration via the Airbyte UI. This is a one-time change that will:
• Keep the sync window small (~6 days) ✅
• Stay within the 31-day API limit ✅
• Let your cursor state take over for subsequent syncs ✅
Without this change, the pipeline will fail every single day. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 7:17 PMstart_date at connection level it means Airbyte might create duplicate data and I need to dedup it in downstreams @kapa.aikapa.ai
05/07/2026, 7:17 PMin_app_events is 2026-05-06 00:12:46, the connector will use the maximum of cursor vs start_date: [source code]
start_date = self.get_date(parse_date(cursor_value, self.timezone), self.start_date, max)
So if you set `start_date = 2026-05-01`:
cursor_value = 2026-05-06
start_date = 2026-05-01
max(2026-05-06, 2026-05-01) = 2026-05-06 ← cursor wins
No historical re-sync, no duplicates ✅
When Duplicates WOULD Occur Duplicates would only happen if you: [incremental append docs]
• Reset the connection state entirely → cursor cleared → full re-sync from start_date
• Manually set cursor to an older date → re-syncs already synced data
Summary So simply changing start_date to 2026-05-01 without touching the cursor state is safe and should not cause any duplicate data. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help., with interactive elementsNaveen Jakad
05/07/2026, 7:18 PMkapa.ai
05/07/2026, 7:18 PMdef stream_slices(self, *, sync_mode, cursor_field, stream_state):
stream_state = stream_state or {}
cursor_value = stream_state.get(self.cursor_field)
start_date = self.get_date(parse_date(cursor_value, self.timezone), self.start_date, max)
The max comparator ensures:
cursor_value = 2026-05-06 ← from saved state
start_date = 2026-05-01 ← your new config value
max(2026-05-06, 2026-05-01) = 2026-05-06 ← cursor wins ✅
What This Means Practically • Sync will start from 2026-05-06 ✅
• No data before 2026-05-06 will be re-synced ✅
• No duplicates ✅
• Window from 2026-05-06 to today is only 1 day ✅
• Well within the 31-day API limit ✅
One Thing to Note However, I must be transparent — the knowledge sources confirm this logic for the actual data sync part. But as we discussed earlier, the check_availability call happens before this cursor logic kicks in. Setting start_date = 2026-05-01 fixes that too since it keeps the availability check window small and within the 31-day limit.
So changing start_date = 2026-05-01 in your source config is the safe and correct fix. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Naveen Jakad
05/07/2026, 7:21 PMkapa.ai
05/07/2026, 7:21 PM_datadog_extracted_at or the exact metadata columns AppsFlyer connector writes. However, based on general Airbyte knowledge:
I Would NOT Recommend Creating a New Pipeline Here's why:
• You already have a working pipeline with cursor state 2026-05-06
• Simply changing start_date = 2026-05-01 on the existing source config fixes the issue
• The cursor state 2026-05-06 will still win → no duplicates, no new pipeline needed
If You Still Want a New Pipeline Yes, you would get duplicates for the overlapping period (2026-05-01 to 2026-05-06). You could use Airbyte's metadata column _airbyte_extracted_at (not _datadog_extracted_at) for dedup: [incremental append docs]
SELECT * FROM in_app_events
QUALIFY ROW_NUMBER() OVER (
PARTITION BY <primary_key>
ORDER BY _airbyte_extracted_at DESC
) = 1
But this adds unnecessary complexity when the simpler fix is:
Recommended Approach 1. Keep existing pipeline
2. Just update start_date = "2026-05-01" on existing source config
3. Cursor state 2026-05-06 wins → no duplicates
4. No new pipeline needed
> ⚠️ I must note the knowledge sources do not explicitly confirm the exact metadata column name for AppsFlyer — please verify whether it is _airbyte_extracted_at or _airbyte_emitted_at in your destination table before using it in dedup logic. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.