Real-time updates & data freshness
"How fresh is this number?" has a different answer per platform. Some of the 83 integrations push events to Ploxir the moment something happens; the rest are polled on a background schedule. This page tells you honestly which is which, how a dashboard you have open keeps itself fresh, and how updates reach your open browser tab without a reload.
The three freshness tiers
1. Push — set up automatically
For these ten platforms, Ploxir registers a webhook with the provider the moment you connect. No setup on your side — a new charge, order, or ticket appears on your dashboard within seconds of the provider sending it:
Stripe, Shopify, Patreon, Twitch, Paddle, Lemon Squeezy, PayPal, Beehiiv, Zendesk, Datadog.
If auto-registration fails (for example, the API key you pasted lacks webhook permissions), the source still works via polling — the source row shows webhook setup failedwith the provider's error, and Ploxir retries the registration on the next sync.
2. Push — paste a receiver URL once
Some platforms deliver events but don't let Ploxir register the webhook via API. For those, Ploxir gives you a dedicated receiver URL to paste into the provider's settings once — after that, they update live too. This group includes RevenueCat, Gumroad, App Store (Server Notifications Version 2) and Play Console (Real-time developer notifications via Pub/Sub). Step-by-step instructions for each are in Connecting sources.
Until you paste the URL, these sources behave like tier 3: polled on the background cadence, and re-pulled while you have a dashboard open.
3. Poll — background reconciliation
Everything else — GA4, Plausible, Google Ads, LinkedIn Ads, Mixpanel, Amplitude, PostHog, YouTube, AdSense, eBay, Square, crypto wallets, and most of the remaining catalog — has no push surface. Ploxir re-fetches these on a per-platform schedule (table below), and sooner whenever you are looking at them (next section).
Poll cadences
A background reconciliation loop scans every 30 minutes and re-syncs each source whose last sync is older than its platform's cadence:
| Cadence | Platforms | Why |
|---|---|---|
| 2 hours | Datadog, Sentry, crypto wallets | Datadog pushes alerts, but the metric bodies both platforms chart (APM, sessions, error counts) must be polled — a tighter cadence keeps those closer to live. Wallet balances have no webhook at all. |
| 6 hours | The default — every other platform | Also runs as a safety net for push platforms like Stripe and Shopify: a full re-poll heals any webhook the provider dropped, so a missed event can never leave wrong numbers standing indefinitely. |
| 24 hours | AdSense, AWS | Google finalizes AdSense earnings one to three days after the fact — polling more often would burn API quota re-reading unchanged estimates. AWS charges your account $0.01 for every Cost Explorer request, and a cloud bill does not move meaningfully within a day. |
Two details worth knowing: the scan runs every 30 minutes, so a source becomes due and then syncs at the next tick — expect up to ~30 minutes on top of the cadence. And sources whose credentials are terminally dead (the red Reconnect state) are skipped entirely — retrying a revoked key every cycle can't succeed. They re-enter the schedule the moment you reconnect.
While you're looking: automatic refresh
There is nothing to click. When you open the portfolio or a business page, when you come back to its tab, and every few minutes while it stays in view, Ploxir re-pulls every polled source on that page whose data is more than 15 minutes old:
- On the portfolio — every source in every business of the workspace.
- On a business page — that business's sources only.
The pulls run in the background and widgets update as each source finishes; you don't wait for the slowest one. Each source is pulled this way at most once every 15 minutes, however many tabs or people have it open. Push sources are skipped — they are already live — and AdSense and AWS keep their daily schedule for the reasons in the table above.
How updates reach your screen
Three pieces, whether the trigger is a webhook or a poll:
- New data lands — a provider webhook arrives at its per-source Ploxir URL (verified, deduplicated, written to the database), or a background sync finishes with a fresh snapshot.
- The server publishes a hint— Ploxir's internal event bus fires a "your data changed" hint scoped to the workspace that owns the source.
- Your browser refreshes silently — every open dashboard tab holds a Server-Sent Events connection to
/api/events/dashboard. The hint triggers a soft React Server Components refresh: widgets re-render with new data while scroll position, open dialogs, and selection state are preserved. Bursts of hints are coalesced, and only one refresh runs at a time — hints that arrive during it fold into a single follow-up — so a batch of events causes one or two refreshes, not ten.
Backgrounded tabs
To avoid burning work on tabs you aren't looking at, Ploxir pauses re-renders while a tab is hidden. The connection stays open — change hints are queued and applied the moment you switch back, so you see fresh data immediately on focus.
The reconnection supervisor
Ploxir doesn't rely on the browser's built-in EventSource retry — the browser gives up permanently on failures like a server restart mid-deploy, and machine sleep can kill the socket without ever firing an error. Instead, a supervisor owns the connection:
- If the stream dies, it reconnects with exponential backoff (1s → 30s, with jitter).
- It also retries immediately when you refocus the tab, your machine wakes from sleep, the network comes back online, or the page returns from the back/forward cache — and a watchdog detects long timer gaps (a frozen tab or a sleeping laptop) and checks the connection on recovery.
- Every successful reconnect triggers one catch-up refresh, so anything that happened while the connection was down shows up right away. Deploys are therefore invisible: the stream drops, reconnects, and catches up — no data is missed.
- If reconnection keeps failing, Ploxir probes your session once: if the server is merely unreachable it keeps retrying, but if your session has expired it stops instead of retrying a dead login forever — sign in again to resume live updates.
Reading the freshness chips
Each row on a business's Sources page shows synced <time> ago plus a real-time status chip. Hover any chip for the full explanation. The states:
| Chip | Meaning |
|---|---|
| live (pulsing green) | Credentials work, the webhook is registered with the provider, and events are arriving (or the webhook was registered within the last 24 hours and is still in its grace window). |
| webhook silent (amber) | The webhook is registered but no event has arrived in 7+ days. Either the account genuinely had no activity, or the provider silently stopped delivering. The Verifyaction on the row asks the provider directly whether the webhook still exists and is enabled — and if it's gone, flags it so the next sync re-registers it automatically. |
| api broken (red) | The most recent sync failed — the error text is shown on the row. Real-time can't work either until the credential issue is fixed. |
| webhook pending (amber) | Auto-registration hasn't run yet; it fires on the next sync. |
| webhook setup failed (red) | Auto-registration errored — the row shows "Real-time disabled:" with the provider's reason. The source keeps working via polling. |
| (no chip) | The platform has no auto-registered webhook to track — poll-only platforms and paste-a-URL receivers show no registration chip. |
Widgets never quietly show frozen data from a dead source: a source whose credentials have expired gets a red Reconnectchip on its widgets, and a deleted source's widgets are archived with it rather than rendering a stale snapshot.
What "real-time" honestly means per platform
The upstream pipeline matters as much as the delivery path:
- Stripe charge, Shopify order, custom webhook event — seconds. The event describes something that already happened; there is nothing to wait for.
- Analytics platforms (GA4, Mixpanel, Amplitude, PostHog, Plausible)— Ploxir pulls every 6 hours in the background and within 15 minutes while you're looking, but the number you get is whatever the provider's own reporting pipeline has processed. Pulling more often can't make a provider report data it hasn't finished computing.
- AdSense — earnings are estimates that Google finalizes one to three days later. Ploxir polls daily; more frequent syncing would not produce fresher truth.
- App Store— Server Notifications (if you wire them) deliver per-purchase updates live; the Sales & Trends report that backs historical charts is finalized by Apple roughly a day after each day closes.
- Datadog / Sentry— the metric bodies (APM, errors, sessions) refresh on the 2-hour poll, or within 15 minutes while you're looking; Datadog alert events additionally push instantly via its auto-registered webhook.
What if it stops working?
If updates seem to lag:
- Open DevTools → Network → filter
events. You should see/api/events/dashboardwith typeeventsource, staying open. - Click that row → EventStream tab. You should see
: pingcomments every ~25s. If you don't, a proxy between you and Ploxir is buffering the stream — let us know. - Check the source's chip on its business's Sources page. webhook silent or api broken explains a stale tile better than any network tab. Use Verify to re-check the webhook registration, or the event history on the row to confirm events are actually arriving.
- If the provider simply hasn't fired anything, nothing will arrive — an empty account is indistinguishable from a quiet one.
FAQ
How old can a GA4 / Plausible / ads number be?
On a dashboard you have open, about 15 minutes at most: those platforms have no push surface, so Ploxir re-pulls them whenever you're looking and the data is older than that. With nobody looking, they are re-fetched every 6 hours in the background. The provider's own reporting delay still applies on top.
Are Stripe and Shopify re-pulled while I'm looking too?
They don't need to be — their webhooks already update your dashboard within seconds, and a full re-poll every 6 hours heals any event a provider dropped.
My source shows "webhook silent" — is something broken?
Maybe, maybe not. It means the webhook is registered but no event has arrived in over 7 days. On a low-activity account that's normal. To be sure, click Verify on the source row: Ploxir asks the provider whether the webhook still exists and is enabled — and if it disappeared, schedules automatic re-registration on the next sync.
My credentials expired. Will the next poll pick things back up?
No — once a credential is confirmed dead (revoked key, expired OAuth grant), background reconciliation stops retrying that source, and its widgets show a red Reconnect chip. Reconnect the same account from the Sources page: credentials are swapped on the same source, and every widget and its history carry over.
Do I need to keep the tab open for data to stay current?
No. Syncing and webhook ingestion happen server-side regardless of open tabs. The SSE connection only affects what you see: an open tab updates live, a hidden tab queues updates and applies them on focus, and a freshly opened tab reads the latest state immediately.
Is my browser polling the server?
Not for data. The dashboard holds one Server-Sent Events connection and the server pushes "something changed" hints over it. On an idle dashboard the traffic is a keep-alive comment every 25 seconds, plus — while the tab is in view — one small request every five minutes asking the server to re-pull anything older than 15 minutes. It returns no data; the data arrives over the live connection when a pull finishes.
What happens during a Ploxir deploy — do I miss events?
No. The stream drops, the supervisor reconnects with backoff, and every reconnect triggers a catch-up refresh that re-reads the latest server state. Events that arrived while the connection was down are already in the database; the catch-up simply renders them.
Does it matter who has the dashboard open?
No. Any member's open dashboard keeps its sources fresh, Viewers included — there is nothing to click and no role required.
