Hyundai · 2022—2023
Same brand, same domain objects. The stages exist in all three markets — but the order they run in, and the conditions gating each transition, do not. It still could not be one codebase — the reason sat below the interface, in the legal and operational layer the system has to conform to. This is a system-boundary decision, not a UI decision.
Read the caseThree Hyundai national sales companies (NSCs) needed operational software behind their vehicle sales. The plan everyone started from — build once, configure per country — did not survive contact with local law.
Each market runs both a dealer network and an online shop. The programme covered a different surface of the sales-operations system in each: an operator back-office behind Singapore’s online shop, and dealer point-of-sale systems for Thailand and the Philippines. All three own the same domain objects — configuration, quotation, order, contract, financing — and all three integrate with pre-existing systems of record (ERP, CRM) as upstream and downstream dependencies through documented integration contracts.
What made them three system builds rather than one was the sales process itself — locally determined, legally binding, outside a product team’s negotiation surface. They ended up sharing a domain model, not a runtime. I owned all three as Product Owner across the full system lifecycle — requirements analysis, system design, functional specification, UAT, deployment, hand-over to operations, and in-market user training.
Each NSC sells through two routes at once: a dealer network on the ground, and an online shop. Both routes converge on the same domain objects — a configured vehicle, a signed contract, a financing arrangement, a delivery — and both need software behind them.
The programme covered a different slice of that stack per market. In Singapore, the operator system behind the online shop: catalogue, quotation, order, contract and third-party loan product linkage, integrated with ERP. In Thailand and the Philippines, the dealer point-of-sale apps and their admin back-office, with an existing CRM carrying the customer record.
The scale is worth stating plainly, because it sets what a bad release costs. The Philippine track alone covered a dealer network of around 40 passenger-car dealerships. Those are the people who quote, order and close on whatever the system does or does not let them do.
I joined as Product Owner with ownership across requirements analysis, functional specification, UI/UX design, prototyping, QA/UAT, rollout and stakeholder governance.
Every stakeholder started from the same assumption. Same brand, same portfolio of vehicles, similar catalogue shape — so one product with three configurations, and localisation is language, currency and tax rate.
The domain objects really are the same everywhere. A quotation is a quotation in all three markets. What is not the same is the sequence that turns one object into the next: which step has to happen before which, who has to sign, what must be presented before a deposit can be taken, how financing attaches to the order. Those rules are set locally and they are not negotiable by a product team.
A feature flag can change a label. It cannot change the moment a sale becomes a sale.
Once the sequence differs, the order state machine differs. Once the state machine differs, the screens that move an order between states differ. The divergence propagates upward from the legal layer, through the business logic, into the UI — and no amount of theming hides it.
Rather than force a single-tenant deployment absorbing the divergence in conditional logic, I mapped where the three markets genuinely agreed and placed the system boundary at exactly that seam — not above it, not below it.
What held across all three was the domain vocabulary (ubiquitous language): what a vehicle configuration is, what a quotation is, what a contract is, how they relate. What did not hold was the workflow transitioning between those objects — the order state machine itself.
Fig. 01
The fork sits below the sales process, not above it. Everything left of the node was specified once. Everything right of it was specified three times — deliberately.
Front-end and back-office. Catalogue, payment and order services, integrated with the CRM of record. Figma prototype for stakeholder sign-off, then on-site dealer training.
Front-end and back-office. Same surface as the Thai track, re-specified from the ground up against the local sales process.
The administration system behind the market's online shop. Catalogue, quotation, order, contract and third-party loan linkage, with ERP integration. Axure prototype, storyboards, local training.
Abstractly, "the sales process differs by market" is easy to nod along to and easy to under-budget. Here is what each market actually did, itemised.
None of these are UX preferences. Each item is either a hard legal requirement or an entrenched local practice, and each one mutates the order state machine rather than sitting beside it.
I inherited Thailand mid-programme from another product manager — a scope handover that meant re-deriving decisions already made once, without the original discovery notes. The market itself diverged on four counts.
Singapore diverged less on payment mechanics and more on who sells what — a market-structure problem rather than a paperwork one.
Model and trim line-ups differed market by market. Establishing what was actually sold where — and how each specification maps onto the shared catalogue structure — took its own research pass in all three markets.
Three tracks meant three sets of specifications, three UAT cycles and three training programmes. It also meant that when one market’s rules moved, nothing in the other two had to be regression-tested.
The alternative — one product with market flags — would have concentrated the entire regional risk into a single release train. For a network where a broken order flow means a sale cannot legally close that day, that concentration was the more expensive option.
Across the three tracks I owned requirements analysis, functional specification, information architecture, user flows, screen specifications, UI/UX design and prototypes, unit and integration test scenarios, UAT scripts, quality review, and in-market user training. Collaboration ran through Jira and Confluence with distributed engineering and design teams under a weekly stakeholder cadence.
Two of the three tracks came with their own delivery conditions. Thailand was handed to me mid-programme from another product manager, so part of the work was reconstructing decisions I had not made. Across markets I ran weekly sessions with the local business leads — reporting progress, resolving conflicting requirements, and getting the financial-integration standards confirmed by the people accountable for them.
Training was done in person, not by document. In Manila that meant three days visiting two of the larger dealerships a day and running a session of ten to twenty staff at each. It is the cheapest requirements review you will ever get: people tell you what the system cannot do within about four minutes of touching it.
Before build we ran weekly working sessions with each market — system detail, direction, which local rules and working practices had been encoded, what we had assumed on their behalf. Every session went out again as a follow-up email so both sides had the same written record. By the time scope froze, everyone believed payment was settled.
It was not. At UAT in-market, new requirements surfaced and several things we thought were agreed turned out to have been understood differently on each side. Not through carelessness. Local payment practice is largely tacit: the people who do it daily do not think to state it, and the people reading a specification do not know what to ask.
Fixing it late was expensive in a specific way. The build sat on established integrations with narrow tolerance for change, so this was never a matter of adding a field. Every change had to be checked against an architecture that could not flex much and still had to hold. I spent the UAT period taking feedback in the room during the day and working through the nights with the development PL in the Korea office, reconciling what the market needed against what the integration would actually permit.
It shipped. But the conclusion is not that we should have communicated more — we communicated a great deal, in writing, on a schedule. It is that tacit local practice does not survive the trip through a written specification. The only reliable way to surface it is to put a clickable prototype in front of the people who will use it, in their own environment — continuous discovery, not delayed validation. On this programme that happened at UAT. It needed to happen at the requirements stage, before scope freeze.
All three systems were delivered and deployed. They are internal business tools rather than public applications, so none of them appears in an app store.
Post-launch service metrics sat outside the programme scope, and my access ended at handover. What I can speak to is delivery: scope, sequence, and the state of each system at hand-over to operations.
I specified screens without specifying measurement or an event taxonomy. The deliverables defined what each screen did, who could reach it and what happened on error — but not a single tracked event, not one funnel metric. When the systems went live, nobody could answer which parts of the order flow people actually struggled with.
That gap was invisible to me at the time because the contract ended at handover. It is not invisible now. Instrumentation and an analytics contract belong in the functional specification, next to the error states — cheaper there than anywhere downstream.
The second thing follows from the payment episode. I treated requirements as something that could be gathered remotely and confirmed in writing, with the market visit reserved for UAT and training. That order is backwards for anything governed by local practice rather than local law. Law you can read; practice you have to watch. A two-day visit before scope freeze would have cost a fraction of what the late changes cost.
The third: I treated the system boundary as a one-time architectural decision. It is really a standing governance question — a boundary owner, not a milestone. A market that diverges on financing today may converge after a regulatory change, and nothing in the programme owned the signal to detect that and pull the shared/local seam back to the shared side.
That is one case, end to end. There are ten more products behind it — and the person who owned them.
Notice — Any screen shown here as a recreation was rebuilt from scratch for this portfolio using fictional data. No client-owned screens, source files or confidential material were used. Publicly published material is credited on the card that shows it. Recreations produced 19 Aug 2026; working files retained.
© 2026 Jiwon Nam · South Korea