§ 01Context
Our client is an iGaming operator whose finance team lives inside settlement reports. Every day, more than 100 million transactions move between the operator and its contractor network — game providers, payment partners, affiliates, B2B counterparties. Those transactions have to be sorted, netted, and turned into accurate settlement positions the business can sign off on.
§ 02Challenge
The team already had a Bubble.io dashboard that worked — until the dataset caught up with it. Aggregating 100M+ rows of transaction data inside a low-code app is not what low-code apps are built for. Reports slowed to a crawl. Filters timed out. Financial workers started running numbers in spreadsheets on the side, which is exactly what a financial system is supposed to prevent.
The brief was narrow and uncompromising:
- Keep the Bubble frontend — the team liked it, it was already shaped around their workflow.
- Make it fast — sub-10-second reports on arbitrary date ranges and contractor combinations.
- Make it right — settlements computed on the full dataset, not a sample.
100M+ rows, a date picker, a contractor dropdown, and an answer in seconds. That's the whole product.— Engagement kickoff
§ 03Solution
We shifted the platform to a headless architecture. The Bubble.io app stays — it's the finance team's interface and we didn't want to break what was working. Behind it, we stood up a Directus CMS instance as a dedicated aggregation engine: API-first, schema-aware, tuned for batch.
The flow is simple by design:
- A financial worker opens the dashboard in Bubble, picks a date range, selects one or more contractors, and hits Run.
- Bubble sends a single aggregation request to Directus with those parameters — it doesn't touch a transaction itself.
- Directus runs the heavy work on the full dataset, returns a structured result, and Bubble renders the report.
That split — Bubble owns the surface, Directus owns the data — is what keeps the frontend responsive no matter how much volume the backend is crunching.
§ 04Stack
Two components doing exactly what each is best at.
Dashboard UI, date-range and contractor pickers, filters, report views, user management — kept deliberately thin so it never becomes the bottleneck.
API-first data layer aggregating 100M+ transaction rows. Parameterised queries, fast indexes, and a clean data contract for Bubble to call.
A date range, a contractor, and a report in seconds — on a hundred million rows.
— What the finance team asked for
§ 05Result
The dashboard does what it needs to do:
- Fast reporting. Settlement reports on 100M+ transaction rows return in seconds — the team stopped running spreadsheets on the side.
- Accurate settlements. Calculations run on the full dataset every time, so the signed-off numbers match the ledger numbers.
- Clean separation. Bubble handles UI only; Directus handles data only. Either side can be evolved without breaking the other.
- Room to grow. New contractors, currencies, and report types plug into Directus first and surface in Bubble second.
— End of case. Heavy data on a low-code app? Let's split the stack.