Data freshness — how often analytics update

Sync layers: 15-min platform cron / 10-min Redis cache / 24h demographics cache / 24-72h postback lag for purchases & ROAS.

Written By Salvatore Sinigaglia

Last updated About 4 hours ago

Sync layers: 15-min platform cron / 10-min Redis cache / 24h demographics cache / 24-72h postback lag for purchases & ROAS.

Data freshness — how often analytics update

Wevion's analytics aren't real-time. 4 freshness layers stack: platform sync every 15 min, Cross-Channel cache 10 min, audience demographics cache 24h, postback conversions lag 24-72h. Combined: numbers shown can be up to 25 min behind platform reality (per CLAUDE.md cron cadence); conversion / ROAS / CPA values can lag 24-72h. Use last_7d minimum for ROAS / CPA decisions.

Who is this for

Anyone wondering "why doesn't Wevion show what the Meta UI shows right now?" or "why does my ROAS keep changing for yesterday?".

The 4 freshness layers

Layer 1: Platform sync (every 15 min)

Wevion's backend syncs insights from each platform via a cron job:

  • Cadence: every 15 minutes (per CLAUDE.md cron cadence)
  • Workers: insight-collector.service.ts + per-platform variants (google-, tiktok-, taboola-, snapchat-insight-collector)
  • Stores into campaign_daily_insight table + related tables

Implication: data shown in Wevion is at most 15 min behind what the platform reports natively.

Layer 2: Cross-Channel Redis cache (10 min)

Cross-Channel queries are computationally expensive (joining multiple platforms with currency conversion). To keep the dashboard fast:

  • Redis cache TTL: 10 minutes
  • Cache prefix: cca:v2:
  • Cache key: includes date range + platforms + target_currency

Implication: Cross-Channel data may be up to 10 min behind Single Platform data (which doesn't use this cache layer).

Layer 3: Audience demographics cache (24h)

Demographic breakdowns (age / gender / geo / device) cached for 24 hours:

  • Cache TTL: 24 hours
  • Service: audience-insights.service.ts
  • Endpoint: GET /api/v1/audience-hub/insights/demographics

Implication: demographic numbers refresh once daily, not in real-time.

Layer 4: Postback conversion lag (24-72h)

The slowest layer. Conversion events (purchases, leads, registrations) take time to flow through:

  • Meta API postback: 24-72 hours typical
  • Commerce / tracker integration (e.g. Postback from Keitaro / Voluum): seconds to minutes
  • Server-side conversions API (CAPI): fast (depends on your implementation)

Implication: purchases, purchaseValue, revenue, ROAS, CPA (purchase-based) are incomplete for the last 24-72h.

Combined freshness

For a typical Cross-Channel ROAS view:

Platform sync (15 min) + Redis cache (10 min) + Postback lag (24-72h)= up to ~73h lag on ROAS for the most recent data

For non-postback metrics (spend, impressions, clicks):

Platform sync (15 min) + Redis cache (10 min, Cross-Channel) = up to 25 min lag

Implications for decisions

DecisionDate range to use
ROAS / CPA scale-or-pauselast_7d minimum (let postback settle)
Spend pacing checklast_3d (faster signal)
CTR / creative fatiguelast_3d (faster signal)
Daily budget burntoday is fine (no postback dependency)
Executive monthlylast_30d (smooth + settled)

For Rules Engine (PRD-17): set time_range on ROAS / CPA rules to last_7d minimum (see rul-116).

Why each layer exists

15-min platform sync

Platform APIs have rate limits. Wevion's 15-min cycle is a compromise between freshness + API quota. Faster polling would risk rate-limit errors + extra API cost.

10-min Redis cache

Cross-Channel queries (joining platforms, converting currencies, aggregating) are expensive. Without cache: every page load runs full SQL aggregation. 10-min cache keeps dashboards fast for repeat views.

24h audience demographics cache

Demographics don't change rapidly. Daily refresh is enough granularity for most decisions. Refreshing more often = excess API + DB load with no decision value gain.

24-72h postback lag

This isn't Wevion's choice — it's how Meta's postback delivery works. Platforms claim conversions asynchronously after the user's purchase event, with reconciliation across attribution windows.

What to look for in numbers

"Yesterday's ROAS just went up"

Postback settling. Conversions from clicks 24-72h ago are still flowing in. Wait for the 7-day window to stabilize.

"Dashboard shows older value than Meta UI"

Single Platform: up to 15 min lag (sync). Acceptable.Cross-Channel: up to 25 min lag (sync + Redis). Acceptable.

If > 30 min lag: check service status.

"Demographic split changed between yesterday and today"

24h cache refresh happened. New data set. Expected behavior.

"Cross-Channel and Single Platform show different ROAS for same campaign"

  • Currency conversion (Cross-Channel applies target_currency)
  • Attribution unification (Cross-Channel tries to harmonize across platforms)
  • Small variance expected; large variance = investigate

How to force fresh data

You can't force a hard refresh from the UI (no "refresh now" button). What you can do:

  • Adjust date range slightly: bypasses Redis cache hit (different cache key)
  • Switch from Cross-Channel to Single Platform: skips the Redis cache layer
  • Wait the cycle: 15 min for sync, 10 min for Redis

For sync issues (data missing entirely): check /status (if available) or contact admin.

Endpoint reference

EndpointCacheLag from platform
/api/v1/analytics/kpi (single platform)None15 min max
/api/v1/analytics/unified (cross-channel)Redis 10 min25 min max
/api/v1/analytics/channel-mixRedis 10 min25 min max
/api/v1/audience-hub/insights/demographics24hup to 1 day

Postback metrics (ROAS, CPA, purchases) carry an additional 24-72h lag on top of these layers.

Common mistakes

  • Acting on today's ROAS: postback incomplete; use 7-day window
  • Comparing Wevion to platform UI 1:1 in real-time: sync + cache lag explains small discrepancies
  • Refreshing the page expecting fresh data: same cache served; adjust date range to bypass
  • Expecting demographic data to update during the day: 24h cache; refreshes overnight
  • Setting Rules Engine on today time_range for ROAS: too noisy; use last_7d

Common issues

  • Data missing entirely > 1 hour: sync issue; check status; contact admin
  • Data older than expected for one platform: that platform's sync failed; retry or check provider status
  • Demographics empty: cache miss on first load of day; refresh in a few seconds
  • Cross-Channel slower than Single Platform: 90-day aggregation on large workspace; reduce date range

FAQ

How often does Wevion analytics data update?

Wevion isn't real-time; four freshness layers stack. Platform sync runs every 15 minutes via a cron job, the Cross-Channel Redis cache holds 10 minutes, audience demographics cache 24 hours, and postback conversions lag 24-72 hours. For non-postback metrics like spend, impressions, and clicks, numbers can be up to 25 minutes behind platform reality.

Why doesn't Wevion match the Meta UI in real time?

Because of sync and cache lag. Single Platform data can be up to 15 minutes behind due to the sync cron, and Cross-Channel up to 25 minutes because it adds the 10-minute Redis cache. Small discrepancies are expected and acceptable; only investigate a service issue if the lag exceeds about 30 minutes.

Why does yesterday's ROAS keep going up?

Postback is settling. Conversion events like purchases, leads, and registrations take 24-72 hours to flow through Meta's postback delivery, so purchaseValue, revenue, ROAS, and CPA stay incomplete for the most recent days. That's how Meta's asynchronous attribution works, not a Wevion choice. Wait for the 7-day window to stabilize.

Can I force fresh data in Wevion?

There's no hard refresh button in the UI. You can adjust the date range slightly to bypass a Redis cache hit with a different cache key, switch from Cross-Channel to Single Platform to skip the Redis layer, or simply wait the cycle (15 minutes for sync, 10 for Redis). For missing data, check status or contact an admin.

Which date range should I use for decisions?

Match the range to the decision. Wevion recommends last_7d minimum for ROAS or CPA scale-or-pause so postback can settle, last_3d for spend pacing and creative-fatigue signals, today for daily budget burn since it has no postback dependency, and last_30d for smooth, settled executive monthly reporting.