Work Craft Archive Contact

Designer Strategist Analyst Skeptic

I design the surfaces that convert, ship them by directing AI coding tools, then audit the numbers that say whether they worked. Occasionally the numbers say no. I publish those too.

Oscar Fong

Product Designer
Windflower Florist · Singapore
Since Oct 2025

Scroll for the evidence

The Thesis

Design is nothing if nobody stops walking.

Five years across luxury hospitality, brand consultancy and e-commerce growth taught me the same lesson three times: the work is not finished when it looks right. It is finished when someone who was walking past stops, and when you can show it was the design that stopped them. So I set up the measurement too. And when the measurement says the work did nothing, that goes on the site as well.

  • 01

    Specs, not prompts

    A one-off prompt gets you an image today. A version-controlled spec can be re-run next season, diffed against the last one, and handed to someone else. That last one is the whole difference between making images and leaving behind a capability.

  • 02

    Distrust the dashboard

    Meta reports the same purchase under more than one name. Add the names together and a sale can count twice, so the dashboard takes one and never sums them. A number that flatters you is the first one to audit.

  • 03

    Emotion over product

    Nobody buys a gift because of the specification. The three highest-returning ads in the account were all warm or incentive plays, and hooks built on a moment, like an apology, a milestone or making someone smile, out-converted product copy.

  • 04

    Replicate faithfully, then vary

    If you cannot first reproduce a known reference exactly, you have no baseline and every variation after it is noise. Fidelity first is how you tell a working system from a lucky render.

Selected Work

The work, and what it changed.

04 / Case studies

All four are from my current role at Windflower Florist, covering design, storefront and growth.

By The Numbers

What actually moved.

5.3
Years in practice May 2021 to today. No rounding up.
S$23.2K
30-day revenue from rebuilt flows First full window, 75% of all flow revenue.
+36%
Revenue per recipient Like-for-like, same season, on 44% fewer sends.
2.4×
Click rate vs the old flows Same 30 days, against the legacy flows still running.

What Broke

What it cost to learn.

    Windflower Florist · 2026

    Ad Reporting Layer

    The ad numbers lived in a local file that only one person could open. I moved them into the team’s planner app as a live dashboard, so anyone on the team can check performance when they need it, and made sure it counts every purchase once.

    Role
    Product Designer
    Performance Marketing Analyst
    Tools
    Meta Ads, AI coding tools
    Worked with
    General Manager, Business Dev Manager, Business Dev 2IC

    Who could see the numbers before?

    It started as a canvas file on one machine. It now sits inside the planner app the team already works in and reads Meta live, so anyone on the team can open it. A range switch covers the last 7, 14, 30, 60 or 90 days, a refresh button pulls the latest numbers, results are cached for ten minutes, and the Meta access key never reaches the browser.

    The top of the dashboard: a title with the ad account, a last-30-days range switch, a refresh button, and six headline numbers for spend, attributed revenue, blended return, purchases, average order value and cost per purchase. Sample data.
    Top of the dashboard · shown with sample data

    How can one purchase count twice?

    Meta returns purchases under several aliased action types that carry the same value: purchase and omni_purchase are the same event. Add them together, which is the obvious thing to do, and purchases land twice.

    How does it count each purchase once?

    Take the first alias that exists and never add them up. It is a few lines of logic and a comment explaining why they have to stay that way, because the next person to touch that file will want to sum them.

    Why does counting twice cost money?

    Ad budgets get judged against a return target. Sum the aliases and the reported value climbs with the count, so ads that are losing money can look like they are paying for themselves, and the budget keeps flowing to them.

    What does the team see?

    It labels its figures as Meta-reported and not Shopify-verified. Under the headline numbers sit the daily trend, the return from each campaign, and every ad on its own row.

    The first version also flagged ads to scale, fix or watch by rule. The same day, I replaced those flags with a dated written review that sorts the ads into what to scale, hold, fix or cut, and what is too early to judge, with a playbook for the next ad. The numbers above it stay live.

    Two charts of daily revenue against spend and daily return, a bar chart of return by campaign against the account average, a donut of spend by campaign, and a campaign table with spend, revenue, return, purchases, click-through rate and cost per click. Sample data.
    Daily trend and campaign returns · shown with sample data
    Four cards sorting ads into scale winners, workhorses to hold, ads to fix or cut, and ads too early to judge, each with a one-line reason, above a note that the written analysis is dated while the charts refresh live. Sample data.
    The written review, sorted by what to do next · shown with sample data

    Windflower Florist · 2026

    Storefront Rebuild

    A florist’s storefront has one job: get someone from “I need flowers” to checkout before they give up. My part of the rebuild was the visual shell for the home, collection and product pages.

    Role
    Product Designer, E-commerce
    Tools
    Shopify, AI coding tools
    Worked with
    General Manager, Business Dev Manager, Business Dev 2IC

    Before and after

    The previous homepage: a dark green bar holding the navigation and a centred logo, above a peony hero with two buttons, Deliver Now and Get 10% Off.
    Before · previous theme, homepage
    The rebuilt homepage: a white header with the logo above a single row of navigation, and a hero that sets the headline and one call to action beside the bouquets.
    After · rebuilt theme, homepage
    The previous product row: a carousel of bouquets with arrow controls and a partly visible card at each end.
    Before · previous theme, product row
    The rebuilt product row: Bouquets, Vases and Wedding tabs over four full product cards, each with its name and price.
    After · rebuilt theme, product row

    The filter that got the count wrong

    Shoppers filtering by colour were told there were 9 pink products. There were 128. The colour and flower filters ran after the catalogue had already been split into pages, so a page showed a handful of matches, or none, and the count was wrong everywhere.

    They now use Shopify’s native tag URLs, so filtering happens first, on the server, and counts, pages and price sorting all agree. Along the way, four flower filters turned out to be pointing at tag names that didn’t exist.

    The performance pass

    A 68 MB hero video was sitting in the theme, referenced nowhere a shopper would ever load it. Predictive search never fired, because its key handler built the debounced search and then never called it. Product recommendations fetched 30 items to show at most 10; fetching only what is shown cut that payload by 50–70% on scroll.

    Checkout, 14 weeks before and after launch

    80.6% → 83.8%

    Checkout itself runs on Shopify’s own pages, so this is what happened after launch rather than a result the visual shell can claim on its own.

    Scope, honestly

    The rebuild was a team effort. My phase was the visual shell for the home, collection and product pages, and the team built the SEO and structured data, the cart form and the launch on top of it. I would rather you heard that here than in an interview.

    Windflower Florist · 2026

    Lifecycle Program

    The email flows were earning revenue, but the setup behind them was hard to measure. Alongside the rebuild, I audited what was already running.

    Role
    Product Designer
    Lifecycle & CRM Marketer
    Brand Strategist
    Tools
    Klaviyo, Shopify, Email Studio
    Worked with
    General Manager, Business Dev Manager, Business Dev 2IC

    What the audit found

    Tracking switched off on live emails that were earning revenue. Two flows still named “Draft” were sending. An A/B test was split 100/0, with identical subject lines on both arms, so it could not tell the team anything.

    And one that mattered more: the old recovery flow carried two identical “no email in the last 14 days” conditions. It was quietly keeping the most engaged buyers, the ones hearing from the brand most, out of the highest-intent flow. I removed it and moved frequency control to Smart Sending.

    The rebuild

    Four flows, from scratch. Abandoned cart reconnects after an hour with no discount, offers 10% a day later, then sends a last call two days after that, and stops the moment someone orders. Abandoned checkout moves faster: 30 minutes, then 12% the next day. The welcome series runs three emails. A returning customer gets an email the moment they order again, and a second ten days later unless they have already come back.

    What changed

    S$23.2Kin the first full 30 days, 75% of all flow revenue

    6.6×the revenue per recipient of the old flows running alongside, at 2.4× the click rate

    +36%revenue per recipient on the welcome flow, same season a year apart (S$11.13 → S$15.14), on 44% fewer sends

    The bigger finding

    A year-on-year analysis showed new-customer orders down 19.6% while repeat orders grew 3.5%. Revenue wasn’t falling because loyal customers were leaving. Fewer new ones were arriving. That reframed the decline as an acquisition problem and set the plan for the second half of the year.

    Windflower Florist · 2026

    Email Studio

    Email Studio is where an email gets made before it goes anywhere near Klaviyo. It is designed and edited in a browser, signed off there, then built into Klaviyo as a finished draft, so nothing is assembled by hand inside the sending platform.

    Role
    Product Designer, Internal Tools
    Tools
    Klaviyo, AI coding tools
    Worked with
    General Manager, Business Dev Manager

    How it works

    Open the file and the email renders the way it will send. Click any copy to edit it in place. When the edits are done, one button exports them for me to action. Reviewers never need access to Klaviyo.

    An email headline edited in place, then exported

    From studio to Klaviyo

    I used it to build the new abandoned cart and abandoned checkout flows. Once an email is signed off, the studio’s build step turns it into Klaviyo templates and creates the flow through Klaviyo’s API, with every email set to draft. A later copy change takes the same route: the template is updated and swapped into the flow, so nothing is rebuilt by hand. Nothing goes live until it has been approved and switched on manually.

    Why it exists

    Reviewing inside Klaviyo happens after the build, which is the most expensive moment to change your mind. With the studio, copy and layout are signed off first, and the email arrives in Klaviyo finished.