SKBook a call
← Selected work

Case study · 2025

Perk: a mobile form redesign, then the domain reference through a rewrite

I led the mobile form redesign before the acquisition, then held the domain decisions through the React rewrite that followed.

Role
Senior Software Engineer
Team
Cross-functional product team
Stack
Angular, React, TypeScript, Datadog
ROLLOUT GATING 4 flags flag flag flag flag migration 1 3 flags flag flag flag migration 2 2 flags flag flag migration 3 1 flag rollout flag rollback path intact at every stage
One flag out per migration, and a way back from each of them.

Context

Perk sells expense management to finance teams. The form in this project is the one an employee opens to log an expense. That usually happens mid-workday, under mild time pressure—on a phone, on their feet, with a receipt in one hand. It is judged on one thing: whether it gets out of the way. A regression in it is felt immediately.

I led the mobile redesign of that form, before the acquisition. The original architecture was not mine—the engineer who built it left partway through, and the work landed on me. I carried it through delivery and became the person on the team who understood it best.

Afterwards, the product moved onto Perk’s own frontend stack, and the form got rebuilt in React. Someone else led that rewrite. My job in it was different: I knew the domain better than the team doing the rebuild, so the rules, the edge cases, the things that look like bugs and are not, came through me.

Knowing why is a different job from deciding what. Your influence is only as good as your ability to explain a constraint to someone who never lived through the reason for it—early enough that honouring it is cheaper than discovering it the hard way.

Decisions

  1. Decision 1

    Retired the flags one migration at a time

    Four feature flags gated the rollout. That is sixteen notional combinations, and nobody could say with confidence which of them were actually live. Pulling all four at once would have been one release, and a frightening one. So each flag came out behind its own migration, with a rollback path still live underneath it. The intermediate states were awkward to reason about and the whole thing took longer than a single release would have. But at no point did the team hold a change it could not undo.

  2. Decision 2

    Measured the new path before anyone claimed it was faster

    Nobody could say whether the new implementation was actually faster, because nobody had instrumented the question. Designing that measurement with Product and Data surfaced something bigger than the answer: analytics events were getting lost during navigation, so part of what the business believed about the product was wrong. I did not fix that myself; other people did. Without their fix, the speed comparison would have rested on a false baseline.