Solo — Product, Design, Frontend, Backend, Deploy
Astro · React 19 · TypeScript · Cloudflare Pages + D1
Full-Stack SaaS Dashboard
🟢 Live in Production

Every week I'd spend 4+ hours pivoting Amazon Ads bulk files in Excel just to answer "which campaigns are wasting money?" So I built the tool I wished existed — one upload, 90 seconds, every answer.

AdInsight Pro — Dashboard
60-day audit · 1,284 keywords analyzed · Last upload 2m ago
₹4.2LAd Spend
18.4%ACoS
324Wasted KWs
12Rule Hits

↗ Visit the live dashboard preview at the bottom of this page.

4h → 90s
Audit time
7
Analysis modules
15k+
Rows processed
100%
Solo-built & shipped

The Problem

As the person running Amazon PPC at ATHIBAN Ecommerce, my Monday morning looked like this: download the Sponsored Products bulk file, open Excel, build pivot tables by match type, by placement, by campaign — hunt for negative-keyword candidates, flag wasted spend, screenshot findings into a slide for the weekly review. Every. Single. Week.

The workflow had three real problems:

  • It was slow. A proper audit across search-term, keyword, placement, and campaign dimensions took 3–4 hours before I could even start recommending changes.
  • It was error-prone. One misaligned pivot range and the ACoS numbers were off — enough to recommend the wrong optimization.
  • It didn't scale. More SKUs, more campaigns, more countries → the pivot-table approach collapses. I'd already hit that wall.
The insight that started it

90% of what I was doing manually was pattern recognition on tabular data. Computers are good at that. I was the bottleneck.

What I Set Out to Build

A single-page web dashboard where I (or any ads manager) could:

  • Upload a bulk file and a 60-day search-term report — that's it. No config, no account linking.
  • Get every audit I used to do manually, plus a few I couldn't do in Excel at all — in under two minutes.
  • See the campaign structure visually, not as a flat table — campaign → ad group → keyword hierarchy as a real graph.
  • Apply custom rules ("flag any keyword spending > ₹500 with zero sales") and download a bulk-upload-ready negative list.
  • Work on my phone — I do half my reviewing on the way to work.
  • Ship it myself — with a proper auth flow, upload quotas, and a public demo so I could actually share the link on my portfolio.

How I Built It

I picked the stack to keep it edge-fast, free-tier friendly, and single-developer-maintainable. No Docker, no Kubernetes, no AWS console — just Git push.

🎨 Frontend

  • Astro 5 (SSR on the edge)
  • React 19 islands
  • TypeScript, strict mode
  • CSS design tokens + dark/light
  • @xyflow/react for the structure graph
  • Recharts for time-series
  • Lucide-react icons

⚙️ Backend

  • Cloudflare Pages Functions
  • Astro API routes (edge runtime)
  • Middleware-based auth
  • Session cookies + CSRF
  • SheetJS (xlsx) on the client for parsing
  • Custom rules engine (TS)

🗄️ Data & Infra

  • Cloudflare D1 (SQLite at the edge)
  • Cloudflare Pages for hosting
  • Wrangler CLI for deploy
  • GitHub for source control
  • Hostinger for the portfolio shell
  • Zero-config HTTPS + global CDN

Architecture at a Glance

User
📁 Bulk File Upload
📊 Search-Term Report
Edge (CF)
Astro SSR + React Islands
Middleware Auth
Client
SheetJS Parser
Rules Engine
Aggregators
Visualizers
Storage
D1: users · sessions · upload quota
A key design call

The actual ads data never leaves the browser. Parsing, aggregating, rule-evaluation — all run client-side in Web Workers. The server only stores auth + quota metadata. That decision made compliance, cost, and performance all easier at once.

The 7 Modules

Each module replaces one specific pivot-table or Excel workflow I used to run manually:

📊

Overview KPIs

Spend, ACoS, ROAS, impressions, clicks, orders — at a glance, with period-over-period deltas.

🌳

Ads Structure Explorer

Interactive React Flow graph of campaign → ad group → keyword. Click any node to isolate its metrics.

🎯

Keyword Performance

Winners, losers, zero-converters. Sort by ACoS, spend, orders — export any slice.

🔍

Search-Term Harvester

Surfaces converting search terms that aren't yet keywords, plus wasteful terms ready to negative-match.

⚙️

Rule-Based Optimization Studio

Build your own "if-this-then-that" rules. Output: a downloadable bulk upload of bid changes and negatives.

📈

Time-Series Trends

Daily/weekly spend and ACoS curves with anomaly shading — catch a spike the same day it happens.

🧩

Placement Mix Analyzer

Top-of-search vs. rest-of-search vs. product-pages — the placement breakdown Amazon buries three clicks deep.

Demo Mode + Public Landing

One-click /demo route loads 60 days of sample data. Shareable, zero friction, zero sign-up.

Before vs. After

Weekly audit time
Before
~4 hrs
After
~90 sec
Negative keywords found
Before
~30 / week
After
~140 / week
Audit cadence
Before
Weekly
After
On demand
Reach
Before
My laptop only
After
Phone / anywhere

The first time I uploaded a real bulk file on a Sunday evening from my phone and had my Monday recommendations ready before my coffee was done, I realized I'd never go back to pivots.

— Field-testing AdInsight Pro, v0.4

How It Came Together

Built in focused evening + weekend blocks over two weeks. Here's the honest timeline:

Day 1 · Foundation
Astro + Cloudflare skeleton, auth, D1 schema

Set up the Astro project with the Cloudflare adapter, wired up D1 for users/sessions/quota, built the login flow and middleware. Nothing visible yet, but the plumbing was production-grade from day one.

Day 2 · Parsing
SheetJS parser, type-safe row schemas, Web Worker offload

Bulk files hit 10–15 MB easily. Parsing them on the main thread froze the UI. Moved the whole parse into a Web Worker and typed every column — the moment row-count hit 20k and the UI stayed buttery, I knew the architecture was right.

Day 3 · KPIs + Keyword Module
First real insight on screen

Aggregators for spend/orders/ACoS, first working keyword table with sorting & filtering. This was the first moment where I could upload a real bulk file and see something Excel couldn't show me at a glance.

Day 4 · Structure Graph
React Flow canvas — the "wow" moment

Hooked up @xyflow/react to render the campaign → ad group → keyword hierarchy as a real graph. Spent an afternoon tuning auto-layout so it didn't look like spaghetti. Worth it.

Day 5 · Rules Engine
"If this, then that" for ads

Designed a small DSL-ish rule format (field + operator + value + action), wrote the evaluator, built the rule-builder UI. Output: a downloadable bulk upload ready for Seller Central. This is the module that closes the loop — insight becomes action.

Day 6 · Polish + Theme System
Dark/light toggle, design tokens, no-flash init

Killed all hard-coded colors, moved to CSS design tokens, added a no-flash theme init script, fixed React Flow's canvas for light mode using a MutationObserver hook to re-read CSS variables when the theme changes.

Day 7 · Landing + Demo
Public marketing page + zero-friction demo

Built the marketing / route and a /demo route that auto-loads 60 days of sample data with a dismissible banner. Anyone can try the full dashboard in one click — no signup, no data required.

Hard-Won Lessons

  • Client-side compute is underrated. Pushing the parse + aggregation into a Web Worker on the user's machine eliminated a whole class of backend scaling problems — and made the tool free to run.
  • Design tokens save you once, then every day after. Adding dark mode late hurt; it would have been an afternoon's work if I'd started with a token system from day one.
  • Demo mode should ship with v1. The single biggest uplift to conversion on a project like this is letting someone see it work with real data they don't have to provide.
  • Middleware auth beats per-route checks. A single PUBLIC_ROUTES allowlist is ten times safer than remembering to add if (!user) redirect() at the top of every page.
  • Edge runtimes are real now. Cloudflare Pages + D1 + Wrangler gave me global, HTTPS, auto-deploying-from-git infra for effectively zero ops cost. In 2026 there's no excuse for a side project to live on a paid VPS.

See It in Action

The demo route loads the full dashboard with 60 days of realistic sample data — no sign-up, no data required. Toggle dark/light, explore all 7 modules, even download a mock negative-keyword list.

Want this kind of audit tool for your own brand? I build custom dashboards like this for e-commerce teams. Get in touch →

Need an analyst who can ship the tools, not just use them?

AdInsight Pro is one of several automations I've built to replace manual e-com workflows. I'd love to hear what you're stuck on.

Let's Talk → See Other Projects