David Park
한국어Open to roles
All work
Case study 02 — Execution · Product judgement

The launch date was fixed. Half the platform wasn't connected.

As our launch date got close, the build had stalled. I took over the code, finished what was missing, and rebuilt promotions, which is the part brands use most.

Built solo: the work usually split across three roles
Product leadBrainstorming · User scenarios · Feature scope · Page flow
DesignerUX · Wireframes · UI design · Figma
DeveloperData structure · Relations with existing data · Front end (Next.js) · Back end (Node, MongoDB)
RoleCo-founder & CEO, leading product, design and build
TimelineJuly – October 2026
TeamMe, after replacing our only developer
ToolsFigma, Next.js, Node, MongoDB
The Carmate promotions page: a featured Hyundai Santa Fe offer with price, discount and days left, then promotions by brand
01  Context

A launch with holes in it

We had just moved Carmate to a lead-based model, so everything that brings in a lead had to work. The new platform had a launch date, and as it got closer the build stalled. Pages didn't link to each other, some of the logic was wrong or missing, and some pages hadn't been built at all.

Promotions is where it came to a head. I had designed the flow, but it had been built for one trim at a time. The developer said my version was too complex to finish in time. I knew brand staff wouldn't use a trim-only tool, because that's not how they run promotions.

02  The call

Fill the gaps myself

Arguing about it would have cost us the launch date. On a platform this size, changing one thing tends to break something else, and it needed someone who knew how all of it was meant to work. So I took over the build and worked directly in code I hadn't written. Before launch I fixed or built:

aPromotions, rebuilt from scratch
bPages that connect: model pages, model cards, listings, promotions and articles
cThe news section, on a block-based article system
dSign-in and phone verification
eMy Account: Manage Ads, Saved Cars and Settings
fSell Your Car
gDealership accounts with their staff
895My commits in August 2026, against a previous average of 194 a month
$36KSaved a year once I was running the code myself
03  Promotions

Promotions brands would actually use

Most decisions during the build had to be made quickly. Promotions was the one I slowed down for, because it's what brands judge us on.

A promotion tool nobody would use

I'd been collecting brands' promotion posters for a while, and none of them work trim by trim. It's a model name and “−$3,000”. Brand staff often don't know their exact trim names anyway.

Promotions matter. Brands already spend money on them and they bring in buyers. But they run as Facebook ads that disappear after a while, nobody tracks them, and a brand will drop any tool that makes them change how they work. So the tool had to fit the way their marketing teams already do things.

There was nothing in place for this. Promotion types were hard-coded, and the developer had turned down my design as too complex, with too many new cases. So I built it myself.

If brands were going to rely on our promotions, the normal price, the promo price and the dates had to be right on every page.

From promotion type to price

I redrew the flow in Figma and built it myself, starting from the data structure.

  1. 01

    Types managed in our CRM

    Promotion types used to be hard-coded. I moved them into a list in our admin CRM, so the team can add a new kind of offer without a release. Discount is the default and can't be removed.

    Admin CRM settings: the promotion type list, with discount, financing, benefits, after-sales, trade-in and cashback, and a field to add a new type
  2. 02

    Start from the type

    When a brand creates a promotion, Seller Central offers the types from that manager: discount, financing, benefits, after-sales, trade-in and cashback.

    Seller Central: New promotion, with the types discount, financing, benefits, after-sales, trade-in and cashback
  3. 03

    Choose what it covers

    Then what the promotion applies to. Discounts and cashback can't be brand-wide. They're set on a model or some of its trims.

    Seller Central: Promotion on, with Model / Trim as the only option for a discount
  4. 04

    Pick the model, or trims within it

    One model per promotion. The brand picks the whole model or only some of its trims.

    Seller Central: choosing models and trims, with Venue and its All-New trim selected
  5. 05

    Details, with a live preview

    Poster, title, dates and the offer, with the promo card shown exactly as buyers will see it.

    Seller Central: Edit Promotion, with the poster, model, title, dates and discount on the left and a live preview of the promo card on the right
  6. 06

    Confirm the prices

    Last, the prices. “−$3,000 on a model” lists every trim with its current price and promo price, which staff can still change before it goes live. A line underneath says when each trim goes back to its normal price.

    Seller Central, Prices step: $3,000 off from 3 September to 31 December, the All-New trim at $24,900 now and $21,900 on promotion, and a note that it returns to its current price on 31/12/2026

What about cars already in stock?

A promotion on a model also affects the cars of that model already in stock. Whether a particular car should be in the offer isn't always obvious, and it's the brand's decision to make.

Apply it automaticallyFor: Easiest to build, no extra work for staffAgainst: Every car of that model gets the promo price, including ones the brand never meant to includeRejected
Staff opt in per listingFor: The brand decides every priceAgainst: One optional field to fill inChosen

Each affected listing now has an optional promo price. The field only opens while a live promotion covers that car, and staff fill it in for the cars they want included. In practice, not every car in stock is part of a promotion, so staff choose car by car instead of the system applying it to all of them.

Seller Central listings table: two Sealion 6 cars in stock, one given a $36,000 promo price and the other left without one

Cards that don't shout

Official brands in Cambodia make their promotion posters for Facebook, so they're square or close to it, never landscape. I tried a few ways of putting the poster on our cards, first filling the card with it, then showing it whole above the text.

Promotion posters from official brands in Cambodia: square, made for Facebook

Both looked too loud. A row of posters looked like a wall of ads fighting each other, and it didn't fit with the rest of the site. In the end the card uses the model's gallery photo with simple text, and the poster goes on the promotion's own page, if the brand has one.

Three promo card versions: the poster filling the card, the poster shown whole, and the chosen one with the model photo and simple copy

A page that leads to the car

The poster sits at the top of the promotion page, with a countdown big enough to read at a glance. A side panel lets buyers call, message or send an enquiry, and the page links through to the model page for the full details.

Promotion page: the brand's poster, the special price with a countdown in days, hours, minutes and seconds, a monthly payment calculator, and the official brand's contact panel
04  Result

Launched on schedule

We launched on the planned date, with everything working.

05  In hindsight

What I'd do differently

I'd have shown the developer the posters on the first day, along with my designs. The designs showed what to build, but the posters explained why. Everything I knew about how brands advertise was there before the first version of the promotion tool was built.

Next — Case study 03Who will use this, and how?