Redesigning the entity model so every layer on top could finally be trusted, from data architecture to onboarding to the UI.
Lumina's asset platform was getting it wrong in a way no UI patch could fix, the data model itself misrepresented how a real portfolio is structured, so every screen built on top of it inherited the same blind spots. Funds, properties, buildings, spaces and meters were stored as a flat list with implicit relationships, and the onboarding flow that fed it asked questions in the wrong order.
My job was to rebuild the foundation, design the entity hierarchy, the relationships that bind it, the onboarding journey that populates it, and the platform UI that lets clients trust what they see, before any analytics layer (Kova) could be built on top.
Six interconnected problems, one broken foundation: a data model that didn't reflect how real portfolios are organised.
The platform held entities as a flat list with name-matched joins. A single misspelt building name would silently break a fund's reporting roll-up.
ESG managers spent days reconciling the same property across spreadsheets, the platform, and the client's actual portfolio. Asset owners stopped trusting the totals.
A data model the platform itself enforces, an onboarding flow that captures the right thing in the right order, and a UI that surfaces gaps before they become reporting incidents.
Onboarding interviews with ESG managers, asset owners and the consultants who picked up the slack, plus a session walking through the live data of two existing accounts.
What does a portfolio actually look like in our clients' heads, and where does our platform's mental model diverge?
Which onboarding steps cause the most rework after go-live, and why?
What proof do clients want from us that the numbers they see are the numbers they own?
The asset owner needs trust at a glance, the ESG manager needs to drill into the meter-level story, the data admin needs to keep both honest. Same hierarchy, three demands.

Five phases from "we signed a contract" to "the first monthly report is out the door". The cliff is between phases 3 and 4, where the meter-to-space mapping is captured in a spreadsheet the platform can't validate against.

"Every reporting cycle we email the data team three times. Once to confirm the property list, once to confirm the meters, once to ask why the totals are different from last month."ESG manager, Lumina Capital
The complaint wasn't really about volume of emails. It was about the platform never being the source of truth. Clients kept a parallel spreadsheet because they couldn't trust what they saw in-product.



Six interview themes affinity-mapped into four problem categories. Three principles came out the other side, every design decision downstream had to answer to them.
Funds contain properties, properties contain buildings, buildings contain spaces, spaces contain meters. The nav, the URL structure, the permissions model and the data quality roll-ups all derive from this one truth.

Entity model → onboarding flow → permissions → data quality surface → activity log → connection wizard. We shipped each in sequence so clients could feel the next step land on a foundation that already worked.

A storyboard for the property onboarding flow, a decision flow for the conflict-resolution path when two sources disagree, and a worked example of a sub-meter being added mid-quarter. Drawing them stopped us from designing screens for cases we hadn't thought through.

.png)
.png)
Same five phases, same three roles, but the platform now owns the validation, the resolution, and the save-draft state at every stage. The fragile spreadsheet is gone.

Five wireframe tracks, each resolving one of the problems research surfaced before any pixels were polished.
Clients paid for a service, logged in on day one, and saw nothing. A third of every onboarding was consultants translating spreadsheets into a three-level model that couldn't hold the shapes real estate actually comes in. Before any pixel got drawn, we had to figure out where the time was going.
From research across 7 roles, ~12 sessions in Dovetail. We taped these to the wall and used them to filter every later design call.
Three entity levels worked for vanilla offices. Solar farms, mixed-use, airports? Consultants made duplicates, and duplicates broke aggregation. Reports were quietly wrong.
Users described portfolios spatially, pointing, drawing in the air. The platform showed flat tables. People rebuilt the hierarchy in their heads (or in Excel) on every visit.
Everything had to land before anything went live. Different data owners on the client side waited weeks, then got chased all at once. Nothing visible until the end.
The original ask was “redesign onboarding screens”. After research it was clear no amount of screen polish would shave the six weeks, the time was in the translation, and the translation existed because the model couldn't represent what clients actually owned.
We re-scoped to a foundation rebuild. Slower to ship. Bigger payoff. Kova (the data-quality module that came next) literally couldn't exist without it.
To buy permission for the slower foundation work, I workshopped four design principles with engineering + CS + a senior consultant and got sign-off before any wireframes:
01 ONE HIERARCHY, ONE SOURCE OF TRUTH
02 EVERY LEVEL · VIEW · EDIT · EXPORT · AUDIT
03 THE CANVAS TEACHES THE MODEL
04 ONE UI, ROLE-BASED PERMISSIONS
Reviews dropped from 3–4 rounds per design to 1–2 because the answers were already on the wall.
The decision that everything downstream depended on. We card-sorted with 12 consultants, prototyped three model shapes, and tested them with real portfolios, including the awkward ones nobody wants to demo. Five levels won because nothing else could hold a solar farm and a mixed-use retail park in the same schema.
In 12 open card-sorts, the median participant grouped entities into 4.7 buckets. The platform was just one short. The new layer wasn't invention, it was matching what people already did in their heads.
One participant drew an arrow between "building" and "meter" and wrote "but what's the unit?" That was the brief for Space.
You can't really prototype "going back in time". What we did test was the need: showed users a portfolio where a Building had moved between Properties, then asked what they'd do. Every single one asked "can I see what it looked like before?"
Need validated. Mechanic unvalidated. We logged that risk and shipped the simplest version, append-only audit log per entity. Iterating now Kova has shipped.
Once the model was right, the surface had to teach it. Tables answered "what do I have?". Canvas answered "how is it connected?". The shipped version is both, same data, two windows, and the canvas was the moment a usability participant fixed their own mis-mapped meter in 30 seconds.
v3 was a designer's instinct to pick one paradigm. v4 came from watching users actually work: they used the table to filter, the canvas to verify, the table to bulk-edit, the canvas to spot orphans. They didn't want one, they wanted both, with state shared.
Pairing a focused list view with a spatial one is the move. Linear's issues + sub-issues graph is the closest cousin I can point to.
Engineering pushed back on a fund-level canvas because of React Flow's node budget. We agreed to scope canvas to Property and below, and surfaced fund-level relationships in a slimmer aggregated chart instead.
That constraint actually improved the design, at fund level users want totals, not topology. The limitation aligned with the job.
The fix wasn't a faster wizard, it was a different shape. Instead of demanding everything upfront and blocking the platform until complete, every entity got a save-as-draft escape hatch. Clients see something on day three. The right person gets pulled in at the right time, not in a single panic.
The mental shift: a half-filled entity isn't an error state waiting to be completed, it's a valid state with its own affordances. Drafts can be viewed, exported (with caveats), assigned, even reported on at portfolio aggregate level.
This unlocked the JIT prompt model: "the report needs this, ask the right person now" instead of "fill everything upfront just in case".
Internal QA flagged that without housekeeping, clients could end up with hundreds of half-filled entities and no clear path to completion.
Fixes shipped:
① Draft index per fund, single page listing all in-progress entities sorted by what's blocking them.
② Auto-expire empty drafts after 90 days.
③ Completion estimate per draft, computed from required-field coverage.
The old loop: meter fails silently, client notices in report, emails consultant, 2-4 days, consultant fixes in Excel. We replaced it with a live Actions panel surfacing failed and pending meters, in-line resolution, and a full audit log so the trust isn't "take our word for it", it's "here's every event going back twelve months".
When an auditor or investor asks "how do I know this number is right?" the old answer was essentially "trust us".
Now: every validation, every collection event, going back 12 months. Admin-only at launch. Consultant-led, but the rationale for opening it to clients is being built.
A foundation rebuild is a series of small "no"s in service of one big "yes". This page is the audit trail of those calls, what we kept, what we cut, what we deferred until the next release could carry it.
| Decision | What we did | Why | Status |
|---|---|---|---|
| Five entity levels, not three | Inserted Space as level 4 between Building and Meter. Re-wrote inheritance rules; aggregations roll up instead of being entered. | Three levels couldn't represent tenant attribution, common areas, solar/EV. Duplicates were silently breaking reports. | Shipped |
| Canvas + table, paired | Same data, two views. Toggle preserves state. Canvas opens at Property level (not Fund) for performance. | Users used both, table for filter/bulk, canvas for verify/relate. Choosing one would have lost half the job. | Shipped |
| Draft mode as first-class state | Every entity can be partial. Drafts show everywhere. Just-in-time prompts fire from real report needs. | Big-bang onboarding meant 5 weeks of client silence. Drafts collapsed that to 3 days to first view. | Shipped |
| Actions panel · self-serve | Retry / diagnostics / suggest / support. Failed-meter resolution moved from consultant ticket to client click. | ~70% of meter failures were credential or transient, solvable without a human. Saved the consultant for what only a consultant can do. | Shipped |
| Audit log · admin-only at launch | Full event log with timestamps, statuses, role attribution. Visible to consultants & R&A, not yet client-facing. | Provenance was the unblocker for the next conversation (Kova). Client-facing audit needs governance work we'll do next quarter. | Partial |
| Anomaly detection in Kova scope | Pushed to a follow-up release. Argued for sequencing: ship data quality first, train a model on real engagement, then layer predictions. | You can't put anomaly detection on data nobody trusts yet. A flagged anomaly on broken data sends users back to the consultant, exactly what we were removing. | Deferred |
| Fund-level canvas | Dropped. Canvas starts at Property. Fund-level view is a slimmer aggregated chart. | React Flow's node budget capped us at a few hundred. Real funds have thousands. And at fund level users want totals, not topology, the constraint matched the job. | Cut |
| Free-text entity tags | Killed in v1 of the model. Replaced by a controlled vocabulary tied to the Space level (internal / external / tenant / common). | Tags were unenforceable. Two consultants could code the same building three different ways. The model has to mean one thing. | Cut |
| Single mega-wizard | Killed in v1 of onboarding. Replaced by per-entity create with draft-by-default. | 0 / 6 testers finished a 6-step wizard. Required-field walls trapped users at step one. | Cut |
| Client-facing audit log | Deferred to next quarter. Governance work in progress. | Could surface confidential consultant actions. Needs a per-event visibility model first. | Deferred |
Arbor was slower to ship than the business wanted. Kova, the data quality story everyone wants to talk about, literally couldn't exist without the foundation work. Getting the structure right compounds.
The interface is the contract. When the IA is right, every downstream decision gets easier. Clients trusted numbers they could actually trace. That trust is the thing.
Append-only audit was the safest bet for v1 but it left the hardest interaction (rolling back a structural change) unsolved. I'd carve out a single-day prototype day with engineering earlier in the cycle to de-risk the "going back in time" mechanic.
Also: I'd run the anomaly-detection sequencing argument in writing from day one. We won the argument but it cost two weeks of standup time.
A walk through the four moments that did the heaviest lifting once Arbor shipped, the entity tree, the data health surface, the connection wizard, and the activity log.
The most useful signal was qualitative: clients stopped keeping a parallel spreadsheet of their portfolio. The platform's entity tree became the version of the world they trusted, which is what made the next layer (Kova) possible at all.