Back to Portfolio

CASE STUDY

How weekly reporting across two markets went from manual compilation to a real-time dashboard

Managing performance for an e-commerce beauty brand across Singapore and Malaysia meant pulling data from multiple spreadsheet tabs each week, computing blended ROAS manually, and reformatting it before every team meeting. This dashboard replaced the entire prep process with a live, auto-refreshing view built directly on top of the existing reporting sheet.

ReactGoogle Sheets APIViteSVG ChartsMulti-marketE-commerce
2
Markets covered (SG + MY)
5+
Platforms tracked per market
30s
Auto-refresh interval
0
Spreadsheet logins needed
Weekly + Monthly
Views in one dashboard
Auto-flagged
Performance vs. per-market targets

Live Demo Available

Populated with realistic but fictional data. No client information is exposed.

Open Demo Dashboard

THE PROBLEM

Every Monday started with 30+ minutes of spreadsheet work before any meeting could happen

The brand ran separate Google Sheets for SG and MY, each with multiple tabs: weekly KPIs, platform breakdowns, Watsons revenue, TikTok GMV, Meta CPAS. Getting to a single blended number required opening tabs across two sheets, manually summing platform spend, and applying ROAS guards to filter out data entry errors.

There was no single view showing both markets at once. Comparison had to happen in your head. Flags like "TikTok is underperforming vs. target" didn't exist — someone had to remember to check.

HOW IT WORKS

Reads the existing sheet. Computes everything. Flags what needs attention.

01

Reads two Google Sheets tabs via Sheets API

Pulls KPIs SG and KPIs My from the existing weekly results sheet. No new data entry — the sheet the team already fills in is the source of truth.

02

Parses platform rows and cleans currency artifacts

Each tab has per-platform rows with inconsistent formatting (RM prefix, empty cells for non-ad channels). The parser handles currency cleanup, empty spend rows, and implausible ROAS values (e.g. 900x caused by data entry errors).

03

Computes blended ROAS with a Watsons guard

Watsons is a retail channel with no ad spend — including it in the denominator inflates blended ROAS. The dashboard excludes Watsons from spend but includes its revenue, matching how the team actually tracks performance.

04

Auto-flags performance against per-market targets

SG target is 8x blended ROAS. MY bar is 11x+. Flags surface automatically — green when on target, amber when close, red when below. No manual check needed.

05

Auto-refreshes every 30 seconds

Built for live use during team calls. The sheet updates mid-meeting as data comes in and the dashboard catches up without a page reload.

WHAT IT SHOWS

Both markets. All platforms. One screen.

Revenue

Total weekly revenue per market with WoW comparison

Blended ROAS

Computed across all ad-spend channels, vs. the per-market target

Channel Mix

Shopee, TikTok Shop, Watsons, DTC — revenue breakdown per market

Platform ROAS

Per-platform ad spend and return, sorted for quick scanning

Flags

Auto-generated performance alerts: pacing, ROAS misses, spend anomalies

Monthly View

Switch to monthly for cumulative revenue and trend by channel

STACK

React 18ViteGoogle Sheets API v4SVG (native charts)Vercel

No charting library. Donuts and ROAS bars are raw SVG so the bundle stays small and the layout stays exact. The Sheets API call is a single fetch per tab — no backend, no database, no infrastructure beyond a static Vite build on Vercel.

Want something like this for your brand?

If your reporting lives in a spreadsheet and you're spending time on prep instead of decisions, I can build a live dashboard on top of your existing data. One call is enough to scope it.

Book a Call