We wrote the CRM integration into the product as a hard requirement on day one, and for months nobody opened an API to check whether we needed it. That wasn’t carelessness — it was the normal shape of the job. Designers specify, engineers build, and the gap between them is filled with assumptions nobody is positioned to test. So the roadmap carried a dependency that would cost every customer a six-month procurement cycle, we designed around it, deferred it, designed around it again, and the whole time the data we actually needed was sitting in our own database, one query away from anyone who could open the repo. Nothing about that was going to surface on its own. It would just have kept being true, sprint after sprint, until the runway ran out.

A designer who can’t open the API is designing around a rumor.

On the eighteen months this project ran

That’s the gap this project closed for me personally. From late 2024 to Q4 2025 I led design on the Customer Value Agent at Thought Industries — an AI product that scored how the market actually perceived a company’s value and turned that signal into work a team could ship. I earned GitHub access mid-project, moved from designing screens to committing into the codebase, and put it in front of four paying beta customers before the direction wound down.

This is the whole arc, including the parts that didn’t work. Read it as a forward deployment: an audit that proved my own instinct wrong, integrations that stalled in real IT departments, and a rebuild on the data customers were already emitting. It’s also the project where I stopped handing off specs and started shipping into the codebase.

Late 2024 – Q4 2025Specs became commits

The distance between “I think the data supports this” and “I checked” is the whole job.

The pivot
6 MOWhat a CRM integration cost each enterprise customer — and why the product was rebuilt on data we already held.
The outcome
4Paying beta customers before the direction wound down — and a title that stuck.

What I owned

What I owned was the architecture — how the system should work. Here’s the cut, rather than a flattering one:

MineThe architecture: what signals fed the Weekly Customer Value Score, where the human stayed in the loop, how an insight became a draft, and how that draft moved out to the tools a team already used.
Mine, once I had the repoDesign decisions bounded by real API constraints — what the LMS actually emitted at the data layer, checked rather than assumed. Working prototypes, vibe-coded in Subframe and Claude.
Not mineThe production front end, the model implementation, and go-to-market. Claiming those would fail the interview test.

And I didn’t hand off a spec and hope. A prototype you can actually use surfaces the decisions a static wireframe hides: where the score needs competitive context, where activation has to be an explicit human call, what’s missing between an insight and a publishable draft.

That shift is the whole story of this project, and it has a shape:

1
2
3
4
Earn repo accessMid-project, on the strength of the prototypes
Open the APISee what the platform actually emits
Design against what's thereReal constraints, not assumed ones
Prototype in codeClick it before committing to it
📋
Spec and HopeDesigning around a rumor
Design EngineerDecisions bounded by the real system
  1. 📋Spec and HopeDesigning around a rumor
    1. 1Earn repo accessMid-project, on the strength of the prototypes
    2. 2Open the APISee what the platform actually emits
    3. 3Design against what's thereReal constraints, not assumed ones
    4. 4Prototype in codeClick it before committing to it
  2. Design EngineerDecisions bounded by the real system

The loop only closes because of step two. Everything upstream of “open the API” is a guess wearing a spec’s clothing.

The metric itself — what fed the Weekly Score, what a movement was allowed to claim — is its own story, told in a companion piece. This one is about the arc, and about what changed in how I work.

The bet: a new market, not our own customers

Thought Industries runs learning platforms for B2B companies that train their external audiences. This product wasn’t for them. It was a bet on a new buyer entirely — customer-education leaders who own an LMS but can’t articulate its business case internally. People who ran training programs and struggled to connect that work to revenue, retention, or competitive positioning.

The thesis: give them one weekly synthesis of how the market perceived them — reviews, job postings, competitor content, social signals — and they could finally tie training to the numbers their VP cared about. That new ICP shaped everything about how we’d test and what we’d ship.

Proof

Three bets we tested over eighteen months, and what each one actually told us.

01Concept testing · the new ICP

Dense beat simple

Problem
My first wireframe stripped the score to one clean number — minimal decisions per screen, usually the right call. Leadership wanted the opposite: surface the data, all of it.
Fix
Built both directions out far enough to be judged fairly rather than strawmanned, then concept-tested them with externally-recruited users in the new ICP.
Result
The dense version won, and not narrowly. These users weren't asking for less — they were asking to be trusted with more. The problem changed shape from complexity reduction to activation.
2directions testedthe one I argued against won
02The swipe · forcing a decision

The gesture that worked anyway

Problem
Users spent twenty minutes in the finished dashboard and left with a lot of understanding and no next action.
Fix
Shrank the decision space to one insight at a time — a card, a binary prompt, act or skip. A Tinder-style UI to force the choice.
Result
They moved through six or eight cards and closed the tab. The gesture was fine; the product had no view into what the user was measured on, so no card could answer 'what does this mean for my renewal?'
20 minno next actionunderstanding isn't activation
03Four beta customers · every path blocked

The integration we already had

Problem
Every path to Salesforce hit a wall — a security review, an admin buried under a hiring freeze, legal sign-off on what we'd read. None of it unreasonable, and four customers in, not one had closed the loop.
Fix
Opened the API instead. Thought Industries was the LMS: completions, feature adoption, engagement and certification pass rates were already there, in a database we owned.
Result
The score stopped being a market opinion and became a sentence about the customer's own learners — and we controlled both sides of it.
6 moper CRMwhat we stopped waiting for
01 / 03

The first bet is the one that changed how I work. My instinct to simplify had been wrong, and being wrong in front of recruited users is cheap — being wrong in production is not. Users looked at the information-rich screen and said something I didn’t expect: finally, something that sees the full picture. They’d been stitching fragments together by hand, or not at all.

That reframe planted a question I carried for the next eighteen months: when you’re building a system powered by decisions the user never sees — a model, a framework operating under the surface — what do you owe them? What should be visible, and what should stay hidden?

I didn’t have an answer. But the wireframes had proven the concept was real, and leadership wanted it to feel real. Mid-summer, they handed me GitHub access.

The dense Market Intelligence Dashboard — eight signal categories, a competitor breakdown, and the Weekly Index Score in a single view.
Where we landed with the Market Intelligence Dashboard — dense, complete, and impossible to act on.

The swipe wasn’t the problem, and neither was the scoring. The product had no view into the user’s business. It could tell you what the market thought; it couldn’t tell you what that was worth in terms the user tracked. That gap had a name — the CRM integration we’d been planning since day one and deferring since day one.

/prototypes/decision-making
Open ↗
Prototype

The pivot — deploy on the data we already had

The CRM integration was never a late addition. Without it, the Weekly Score was just a number. With it, you could say: your market perception improved twelve points the quarter your renewal rate went up eight. That’s a product people pay for. We just kept pushing it out.

This is where codebase access mattered in a way I hadn’t expected. Thought Industries was the LMS. Every customer was already emitting data we could query — course completions, feature adoption, engagement, certification pass rates. I could open the API, see what was actually there, and design around it instead of around a Salesforce connection we couldn’t close. We didn’t write a spec and wait; we checked, then designed. Instead of a generic market signal, the product could now say:

Learners in your advanced certification track are churning at onboarding — and your competitor is positioning heavily on that exact job.

Tighter story, and we controlled both sides of it. The pivot changed the shape of what we were shipping: we split into a monorepo with two products — the Customer Value Agent (market perception, now tied to LMS engagement) and a Learning Value Agent (native AI inside the learner experience, running on data every customer already had). LVA was the foot in the door; CVA was the upsell once Salesforce finally connected.

The honest tension: power users felt the product got dumber when we cut the raw signal grid and the full JTBD breakdown. New users finally understood what to do. Both were true.

The interface we were proud of

The architecture work came to a head at a team offsite where we redesigned the whole app from the ground up. Most of what shipped traces back to that whiteboard.

Whiteboard wireframe from the offsite redesign: a kanban of proposal states — In progress, To do, Done, Rejected — alongside dashboard and distribution panels, including a HubSpot-to-blog flow.
The offsite whiteboard — proposal states as a kanban, the dashboard, and the path out to HubSpot.

By the approved prototype, the product had settled into something I was genuinely proud of. The dashboard was clean. The Weekly Index Score had a clear treatment — week-over-week trend, a brief contextual explanation, and a direct line to the LMS data driving the movement. Content generation had matured to one click from an insight to a draft aimed at closing the exact gap a market signal had surfaced.

The Weekly Customer Value Score dashboard: a headline score with a week-over-week trend line, annotated with what was published, drawn from LMS data.
The dashboard’s cleanest state — the Weekly Score, its trend, and the LMS data behind the movement.

The proudest call was an architecture one: the Weekly Score could be computed from what the LMS already emitted. We’d written CRM integration in as a hard requirement before I understood the external data was a story we’d talked ourselves into — not a dependency.

Four paying customers, and why that wasn’t enough

Four beta customers used it, getting real weekly signal they weren’t getting anywhere else. The plan had assumed more.

The bet on a new ICP had a hidden cost: chasing new buyers takes attention, and that attention wasn’t going to the customers already on the platform. The roadmap tilted. The internal narrative shifted toward what this could become rather than what our customers need today — and existing customers felt it. Meanwhile the new buyers weren’t converting from beta to paid at the scale we expected. We were between two markets, and neither was winning. The right move at the two-customer mark was a genuine reassessment; instead we kept building, and the assumption held longer than the evidence supported.

A new CEO joined at the end of Q3 2025. Within weeks the direction was clear: Thought Industries would become an agentic LMS platform — AI native to the learning experience, built for the customers already there. When it came time to move beta customers to paid, the numbers weren’t there. The Customer Value Agent program ended.

The idea isn’t dead. Its core logic — using outside signals to inform what a learner or education program should do next — is being absorbed into that larger agentic-LMS foundation, currently in active testing. I’m still part of that work.

What the project taught me

The question I left the first wireframe with was whether you can design a system whose most important decisions are invisible to the people using it. Eighteen months gave me the honest answer: invisibility alone isn’t enough.

The JTBD algorithm behind the score was invisible and the score it produced was real — but neither was connected to anything the user already measured in their working life, not until the LMS pivot, and by then the clock had run out. When the most important decisions are hidden, the user needs to feel the output, not just see it: “this changed something I own” — a number, a behavior, a result. Without that, invisible just means opaque. AI systems that hide their reasoning have to surface their consequence.

CVA didn’t ship at scale, but it’s the forward deployed job end to end: getting into the codebase to see what the LMS emitted at the data layer, designing within real API and IT constraints, deciding where the human stays in the loop, and proving the system with working software instead of a spec. It also taught me the lesson every forward deployed engineer learns eventually: being able to build it doesn’t mean you’re building the right thing for the right market. Both are true.