AI-assisted ESG reporting for real-estate funds, from raw portfolio data to filed disclosure in one governed workspace.
Meridian Capital'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.
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 clients 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 client'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.
Discovery interviews with reporting consultants, senior reviewers and Meridian'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 client (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?
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 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.

"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, Meridian Capital
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.


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.
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.

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.

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 client's lawyer asks to see when a number is questioned.
The board-level flows that turned a fragile spreadsheet process into a governed, auditable workspace.
Meridian'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.
From twelve consultant interviews + a journey-map workshop with Meridian's reporting team. Every wireframe had to earn its place against one of these.
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.
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.
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.
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.
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.
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.
Meridian's clients, 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.
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.
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.
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.
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.
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.
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.
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.
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. | Clients 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 Meridian'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 Meridian consultants in test. The integrations design was reshaped by what we learned in phase 2. |
Three things we'd front-load on the next engagement with the same shape of problem.
A walk through the four surfaces that did the heaviest lifting once Verde shipped, the report library, the lifecycle pipeline, the AI generation wizard, and the share-and-integrate flow.
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.