Verde
AI-assisted ESG reporting for real-estate funds, from raw portfolio data to filed disclosure in one governed workspace.
The brief
A customer's ESG reporting workflow was entirely manual, reports drafted in PowerPoint, signed off in email, shared as PDFs that immediately drifted out of sync with the live data. The team produced GRESB, EPRA, INREV and SFDR disclosures across dozens of funds, with the entire workflow living outside the platform in Excel, PowerPoint, email threads and Slack.
My job was to design a single governed workspace where every report has a state, a named reviewer, an audit trail and a defined path from raw portfolio data to filed disclosure. The visible UI was the easy part. The hard part was modelling the workflow underneath it.
Reports were uploaded files, not living workflow objects
Six interconnected problems with one shared root: the platform hosted ESG data but had no opinion on the workflow that turned data into a filed report.
Reports were drafted in PowerPoint from Excel exports, signed off in email, and shared as PDFs that immediately drifted out of sync with the live data. Cross-framework inconsistencies reached customers regularly.
Reporting consultants ran 20+ active reports across multiple frameworks with no shared status, no named reviewer, and no way to trace a figure back to source when a customer's lawyer asked.
A platform where reports are first-class objects with state, ownership and audit, with AI drafting the narrative from validated data and consultants owning the final word.
Twelve consultants, seven roles, one report that touched every one of them
Discovery interviews with reporting consultants, senior reviewers and the customer's data team, plus shadow sessions on three live report cycles, end to end, from brief to disclosure.
What is a consultant actually trying to do when they open the platform on a Monday morning?
Where in the report lifecycle does trust break down, and what makes a customer (or a regulator) ask the next question?
Which framework-specific behaviour belongs in the platform, and which is the consultant's professional judgement that we mustn't automate away?
The reporting consultant journey, mapped from request to delivery
Five stages, four handoffs, and a quiet spreadsheet at the centre of all of them. The visible workflow was a sequence of meetings. The real workflow was a chain of files going dark every time they crossed a tool boundary.

The reporting analyst journey, where source data became report data
The hidden second journey: the analyst pulling numbers from Siera, Deepki and the legacy platform into a shared spreadsheet, with no audit trail on the way in and no provenance on the way out. Every cross-framework inconsistency started here.

What we heard, on the workflow itself
"I have to ping three people on Slack to find out if this report shipped. And then I still have to open the PDF to check the version."Reporting Consultant, customer fund
The complaint wasn't about volume of work. It was about the platform never being the source of truth for the report's own status. Every consultant kept a private tracker. Every senior consultant kept a parallel one.


A report is an object, not a file, every screen had to honour that
Twelve interview themes affinity-mapped onto three "how might we" questions, two weeks of lifecycle modelling before any UI, and four iteration cycles per surface.
The redesigned reporting flow, drawn as a state machine before any wireframe
Draft becomes Under Review becomes Approved or Rejected, and every transition names a reviewer and writes an audit entry. The lifecycle state machine was the contract that every downstream screen had to honour.

One repository, four frameworks, no re-entry
GRESB, EPRA, INREV and SFDR each ask for the same underlying numbers in different shapes. The instinct was to build a report type per framework, but that would have rebuilt the spreadsheet problem inside the platform, four copies of the truth quietly drifting apart. Instead I defined the metric set once and let each framework read from it, so a figure entered for one disclosure was the same figure every other disclosure cited.

AI drafts, the consultant decides
Research drew a hard line: the platform automates the framework mechanics, the consultant owns the professional judgement. Every AI-drafted section is editable and every edit is logged, so the audit trail covers the human decision, not just the machine output, which is exactly what a customer's lawyer asks to see when a number is questioned.
- Writes a first-pass narrative for each ESG metric, pulling the validated numbers straight from the shared data layer.
- Drafts the boilerplate commentary every framework expects, in the right shape for GRESB, EPRA, INREV or SFDR.
- Flags gaps and missing inputs before a report can move forward, so nothing ships half-sourced.
- Proposes the structure of the disclosure so the consultant starts from a draft, not a blank page.
- Makes the materiality judgement, deciding what matters and what gets said about it.
- Holds final sign-off, the one transition that moves a report to Approved.
- Owns anything filed under their name, every figure and sentence that reaches a customer or regulator.
- Leaves the audit-trailed decision, a named reviewer on every approval, traceable back to source.
Wireframing the disclosure workspace
The board-level flows that turned a fragile spreadsheet process into a governed, auditable workspace.
Spreadsheets, email chains and hope
A customer's consultants were building GRESB, EPRA, INREV and SFDR reports in Excel, sending PDFs over email, and tracking sign-off in Slack. The platform "had" reporting, it just had no place to do reporting. Before pushing pixels we mapped the people, the frameworks, and the failure points.
GRI · 15 Apr
GHG · 5 Feb
NZC · 23 Aug
BESP · 8 Nov
Three questions that framed everything that came after.
From twelve consultant interviews + a journey-map workshop with the customer's reporting team. Every wireframe had to earn its place against one of these.
Give every consultant one place -
to see every report they own, what state it's in, and what's blocking it. No more Slack archaeology.Make governance a first-class object -
reviewers, approvers and lifecycle states live inside the report, not in email threads next to it.Cut the drafting time, not the rigour -
AI-assisted first drafts from validated data sources, so consultants spend time on analysis, not formatting.DecisionThe report is the object. Everything else attaches to it.
The platform had treated reports as uploaded files. Every red box above was a workflow event that should have been part of the report itself, a comment, a state change, an approval, a data version.
That re-shaped the data model: a Report became a first-class object with status, reviewers, approvers, source bindings and a history. Everything we designed downstream attaches to it.
TradeoffTwo weeks of data-model work before any final pixels.
Pushing back on "let's just style the existing screens" was unpopular but necessary. The original schema had no concept of state, adding it after styling would have meant redesigning every screen twice.
The compromise: lo-fi wireframes shipped fast, in parallel, so stakeholders could see the new model take shape while engineering was still aligning.
From "find your file" to "what needs me today"
Four passes. The first kept the table because it was familiar. The second tried to fix the table. The third threw the table out and over-pivoted into a feed. The fourth landed on a card-deck-over-table that worked for both the consultant scanning their queue and the manager hunting a specific file.
The pivotStop showing a file list. Start showing the queue.
Between v2 and v3 we re-wrote the brief for the home screen: what is the consultant actually trying to do when they open the platform on Monday?
The answer was always "find what needs me today", not "look up a file from 2022". The card deck makes the queue the headline; the table moves below as the reference store.
TradeoffCards are heavier to build than rows.
Each framework needs a different chart shape (GRESB line, EPRA stacked bars, CSRD gauge). Engineering pushed to start with status-only cards. We held the line on charts-from-day-one because the test was specifically recognition speed.
Comp: framework cards share a single chart component with a "render as" prop, keeps the visual variety without forking the implementation.
Three states the platform had been calling none
The inherited platform had no concept of approval. We introduced a lifecycle, Draft → Under Review → Approved | Rejected, with named reviewers and an audit trail. The fight was over how much of it to surface in normal views vs. tuck behind an "audit" tab.
nobody knows
Why this matteredState was the UX rewrite of a compliance posture.
The customer's stakeholders, and their lawyers, were asking who signed off and when. The platform's answer was "check email". We made the answer a real timeline, attached to a real state machine, with named approvers.
The wireframe was the contract: every screen with a report on it had to show the state pill and the named reviewer. No exceptions.
TradeoffInline actions vs. a confirmation step.
One-click approve from the queue is fast, and risky. We added a "are you sure" only on Reject (which kicks the report back to Draft) and on Approve when the report is missing required data.
The principle: friction proportional to consequence. Approving a clean report should be one click.
Three framework families. One generator. Real editing after
GRESB, EPRA, INREV and SFDR ask for different parameters, different time ranges, different unit conventions. The original idea was one giant form. The shipped flow is a 4-step wizard with framework-aware steps, an AI-drafted output, and an editor that keeps the consultant in control of the final word.
DecisionThe AI draft is not the finish line.
We resisted "press button → ship report". The AI produces the draft; the consultant edits it; the senior approves it. That kept Verde the same governed system at the end of generation as it was at the start.
Visually: AI-drafted content is marked with a subtle dotted underline until a human edits or approves it.
TradeoffOne wizard for eight frameworks is more engineering.
Eight discrete generators would be simpler. We took the wizard hit so the AI draft component, the audit log, and the parameter schema were all shared across frameworks.
Onboarding a new framework now means writing a parameter schema file. Not a whole new flow.
Where do reports actually live after approval?
Half the consumers of Verde reports work in Power BI. The other half want a PDF. The shipped sharing flow makes both first-class, and adds shared-link governance so the platform can revoke access without re-issuing the file.
Principle in actionThe report stays in Verde.
Pre-Verde, a PDF download was the moment the report became un-governable. Post-Verde, the PDF is one of several modes, and the canonical version always lives inside the platform with its audit trail attached.
TradeoffSix integrations is more surface than launch needed.
We could have shipped Power BI only. We built the integrations grid (Power BI, Looker, Tableau, Alteryx, Qlik, Zoho) but ship Power BI + Alteryx as live in v1, the others ghosted in to communicate the roadmap without overpromising.
The decisions that shaped the rest
Where we held the line, where we bent, and what we cut from scope. Every row here represents a debate that's still defensible today.
| Decision | What we picked | What we gave up | Why |
|---|---|---|---|
| Home screen | kept Card deck of in-flight reports + table below for the long tail. | cut Pure table (familiar but didn't answer "what needs me today"); pure feed (broke "find that 2022 file"). | Two jobs, two surfaces, the queue lives on cards, the archive lives in the table. |
| Lifecycle states | kept Five states (Draft → Review → Approved | Rejected → Disclosed) with named reviewers per transition. | cut The simple "uploaded / not uploaded" model that the legacy schema used. | Customers and auditors were asking who signed what. A real state machine is the only honest answer. |
| Status surfacing | kept Status pill is the first thing on every card, in every list, on every report header. | cut Hiding status behind an "Audit" tab to keep the main view clean. | If status changes how you act on the report, it can't be one tab away. |
| Generation flow | kept Framework cards + 4-step wizard + AI draft preview. | cut Monolithic form with conditional fields; one generator per framework. | One mental model, framework-aware steps. Shared AI draft + audit component across all eight frameworks. |
| AI-generated content | kept AI drafts narrative + tables; consultant must edit/approve before sign-off. | deferred One-click "generate and publish" workflows. | SFDR / CSRD content reaches lawyers and regulators. Human-in-the-loop is non-negotiable for v1. |
| Sharing model | kept Three modes, named people, integrations, signed link, gated by approval state. | cut Anonymous shareable URL. | ESG reports name funds, assets and individuals. Anonymous links were a compliance liability. |
| Integrations | kept Power BI + Alteryx live; UI surface for Looker, Tableau, Qlik, Zoho. | deferred Live OAuth for non-Microsoft integrations to v1.2. | 80% of the customer's BI work is in Power BI. Ship that solid, signal the rest. |
| Pinned / favourites | kept Heart icon on each card, user-scoped favourites. | cut Org-level pinning ("important reports"), confused with status pills. | Two pin systems was one too many. Status is the org signal; favourites are personal. |
| Audit timeline | kept Visible by default in report header (collapsible). | cut A standalone "Audit" page that nobody opened. | The audit trail is part of the report's story. Hiding it implied it was extra; surfacing it implies "this is who has approved this". |
| Phased delivery | kept Four phases: library → governance → AI generation → integrations. | cut Big-bang launch. | Each phase ran with customer consultants in test. The integrations design was reshaped by what we learned in phase 2. |
If we did it again.
Three things we'd front-load on the next engagement with the same shape of problem.
Model the workflow before the UI.
The lifecycle state machine saved redesigns. We'd write that on day one next time, not week three.Show the governance, don't bury it.
"Audit" tabs are where compliance posture goes to die. We'd put the audit trail in the primary view from the first wireframe.AI is a first draft, not a release.
The hardest argument was holding the line on human-in-the-loop. We'd write that as a principle before scoping the AI flow next time.Where the platform stopped being a passive file-store and started running the workflow
A walk through the surfaces that did the heaviest lifting once Verde shipped, drafting and editing a report, governing it, sharing it, and seeing the whole portfolio at a glance.
From fragmented and manual to structured and governed.
The most useful signal was qualitative: consultants stopped keeping private trackers. The platform's status pill became the version of the truth the whole team referred to, which is what made the legal-review conversations stop being a scramble.
Other Work
The rest of the work, from greenfield builds to systemic redesigns.





