processed_first_seen¶
SQL type: SimpleAggregateFunction(anyLast, Nullable(Date))
Table: keywords.keywords_data_local
Last validated: 2026-05-21
What it is¶
The earliest date this keyword was observed by any of our sources — used to compute keyword "age". Customer UI surfaces this as "First seen" / "Age".
How it's computed¶
In processing.py around L1916–L1921:
- Take
js_first_seenfromjumpshot.keyword_first_seen(if present). - Take
gsc_first_seenfrom the GSC pull (if present). processed_first_seen = min(js_first_seen, gsc_first_seen)— the earlier of the two.
If both are None, the keyword is flagged is_js_garbage = True upstream and typically fails approval.
Edge cases¶
- JS-only keywords (no GSC history) —
processed_first_seen = js_first_seen. Since JS hasn't refreshed since 2020, the date is at most early-2020. - GSC-only keywords (no JS record) —
processed_first_seen = gsc_first_seen. Reflects when GSC first saw a click/impression for that keyword in our data. - Both missing —
null. Typically these keywords also haveprocessed_ke_approved = 0. - Pre-2014 first-seen — rare but possible from JS; the customer UI may not gracefully render dates that old.
Downstream¶
- Customer UI age display.
- ES +
keywords_metrics_localupload paths. - Internal: helps the refresh-detection logic decide whether to prioritise newer keywords.
See also¶
- Jumpshot source —
js_first_seen - GSC source —
gsc_first_seen - Central hub table
- processing.py — producer