Apartment List~3 min read
Bulk updates took sixteen hours and mostly failed.
Four weeks, one engineer, and an API that the people who needed it could not use.
- Role: Product design and research
- Timeline: 4 weeks
- Team: 1 engineer, me
- Impact: 4k+ runs, 32k+ hours displaced
- Platform: Web
Flow runs
each replacing an 8–16 hour manual job
Daily updates
Returned to each user’s day
reported by users
Users said they were happy with it, and the time saved was 6 hours of their day. Who measured the 6 hours is not recorded. The run and update figures come from the portfolio deck. Each run stands in for a job that took 8 to 16 hours and nearly always failed at volume, which implies 32,000 to 64,000 hours displaced. That assumes no run re-does a failed one. The 4k+ counts runs, not configured flows. Read at three weeks, against Apartment List’s usual three months. The run and update figures are usage counts, sourced from what users ran on the platform. The actual failure rate on large uploads is not recorded.
Overview
Marketing and operations teams moved property data by hand because the API was too costly or too technical.
A bulk property update took 8 to 16 hours, and nearly all large uploads failed. The API existed but went mostly unused.
Worked with: 1 engineer; 10 property marketing and operations managers in research.
What I owned
I owned
- Research with 10 property marketing and operations managers, read against failure logs
- The split-panel structure, chosen over wizard steps and an infinite canvas
- Three navigation patterns built and tested; two failed
- The mapping model: raw fields to business entities, then how those entities update
Decided with the engineer
- What the preview could compute in real time, which set how much of the file it could display
- Which validation ran client-side and which needed the pipeline
Research
People did not need more speed. They needed to see whether an upload would work.
I interviewed 10 property marketing and operations managers at large property firms, then read the failure logs alongside what they said.
The dangerous outcome is an accepted file. A successful upload that maps the wrong column to the wrong entity puts bad data in front of renters, and nobody notices until someone complains.
Decision: split panel
Steps run down the left and a live preview of the result runs on the right.
I rejected wizard steps, which hid earlier context, and an infinite canvas, which was powerful and visually hostile to newcomers. A fast preview that was subtly wrong would create confidence rather than earn it, so it covers both mapping stages. Errors show where they are introduced.


A timeline and radio cards both looked better. Users read the chrome instead of the configuration. I shipped plain numbered cards with no status icons. Labels such as Source, Crawl, and Specify Selectors read as decisions, so nobody needed to understand the pipeline first. Twice I mistook an interesting element for a helpful one, and testing caught it.



Redesign
Transforms sit inline in the flow, because a modal covered the preview it was explaining.
A transform splits a column, trims whitespace, or maps a field. The overlay held its own copy of the preview, so the same work existed twice and users had to pick which to trust. Inline, a transform is another numbered step.
The cost: a long transform chain makes a long column, and nothing collapses it yet.

Scope
Ingestion, transformation with a real-time preview, and monitoring shipped.
Ingestion covers CRMs, spreadsheets, and third-party portals. Mapping resolves raw fields into business entities, then models determine how those entities update.

Results
Users were happy with the flow and got 6 hours of their day back, across over 4,000 runs.
Nobody challenged the split panel, so it was never stress-tested
Users caught the navigation failures, but I cannot show anyone disagreeing with the central structure. It probably deserved the same scrutiny and never got it.
