BLOG
/
Engineering
Why we rebuilt our query engine around a single live graph
For two years we shipped answers from nightly snapshots. They were fast, wrong by morning, and quietly eroding trust. Here's how we moved to one continuously-updated graph, and what it taught us about latency, freshness, and the cost of "good enough."

Marcus Hale

The first version of Veeta was a beautiful lie. Every dashboard loaded in under a second because none of the data was actually live; we precomputed everything overnight and served it from a cache. It demoed perfectly. It also told a sales leader on a Tuesday morning that a deal had closed when it had quietly slipped three hours earlier.
That gap between "what the screen says" and "what is true right now" is the entire problem we set out to solve. So in late 2025 we did the unreasonable thing: we tore out the snapshot pipeline and rebuilt the query engine around a single, continuously-updated graph. This is the story of why, and what broke along the way.
Snapshots were never the product
Nightly batch jobs are seductive. They're simple to reason about, cheap to run, and they make read latency somebody else's problem. But they encode an assumption that turns out to be false for most teams: that yesterday's answer is close enough to today's.
It isn't. The questions people actually ask Veeta, which accounts are at risk, what changed since standup, who needs a response in the next hour, are all questions about the present tense. A snapshot answers them in the past tense and hopes you won't notice.
If the answer can be wrong by the time someone reads it, you haven't built an intelligence layer. You've built a very expensive screenshot.
The shape of the new engine
We replaced the warehouse-of-record model with three moving parts that work together:
Connectors that stream, not poll. Wherever a source supports change data capture or webhooks, we consume events directly. Polling is a fallback, not the default.
A resolution layer that builds identity on the fly. The same company shows up as a Cloudwave account, a Ledgerly customer, and forty support tickets. The graph stitches those into one node the moment a new event arrives.
An incremental query planner. Instead of recomputing a result set from scratch, the planner knows which nodes a saved question depends on and only re-evaluates the ones that moved.
That last piece is the one that made the whole thing viable. Freshness is easy if you're willing to be slow; speed is easy if you're willing to be stale. The interesting engineering is refusing both.

Streaming ingestion meant rethinking everything downstream of the connector layer.
What broke (and what we learned)
Moving to live data surfaced a class of bugs that snapshots had been politely hiding. Two stand out.
Ordering is a feature, not a detail
When events arrive out of order (and across dozens of sources, they always do), a naive graph will briefly show a customer as both churned and active. We added per-entity logical clocks so the graph converges on the correct state regardless of arrival order. Users never see the flicker.
Permissions have to live in the graph
A live graph that leaks is worse than a stale one. We moved authorization out of the application layer and into the graph itself, so every node carries the policy that governs it. A query can only ever traverse edges the asker is allowed to see.
The rule we landed on: the system should never return an answer it can't also explain: which source it came from, how fresh it is, and why you were allowed to see it.
Was it worth it?
Median query latency landed at 312ms against data that is, in the worst case, a few seconds old. More importantly, the questions changed. Once people trusted that the number on the screen was the number right now, they stopped exporting to spreadsheets to "double-check," and started asking the kind of in-the-moment questions the product was always meant to answer.
We're not done. Sub-second is good; we want the graph to feel like it's reading your mind by the time you finish typing. But we'll never go back to serving yesterday with a smile.
Keep reading

Customer Stories
Jun 2026
How Northwind cut reporting time by 70% with one question box
The ops team at Northwind used to spend Mondays assembling a status report no one fully trusted. Six dashboards and a wall of spreadsheets later, they replaced the whole ritual with a single question box, and got their week back.

Sofia Reyes

Product
Jun 2026
Introducing Live Graph: query your entire stack in real time
Today we're shipping the feature the whole platform was built toward. Live Graph connects every tool you run into one continuously-updated, permission-aware model, and lets anyone on your team question it in plain language, with every answer sourced.

Priya Nair

Engineering
Jun 2026
Why we rebuilt our query engine around a single live graph
For two years we shipped answers from nightly snapshots. They were fast, wrong by morning, and quietly eroding trust. Here's how we moved to one continuously-updated graph, and what it taught us about latency, freshness, and the cost of "good enough."

Marcus Hale
GET STARTED
Bring every system into focus.
See your whole company in one place. Spin up a guided pilot on your real data in under a week.
No credit card · 14-day pilot · SOC 2 Type II