Solo — Product, Design, Frontend, Backend, Deploy
Astro · React 19 · TypeScript · DuckDB-WASM · 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 · 149K+ rows analyzed in <2s · 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
149K+
Rows processed in <2s
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
  • DuckDB-WASM — in-browser SQL engine
  • SheetJS (xlsx) for bulk-file export
  • 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
DuckDB-WASM (SQL)
Rules Engine
Aggregators
Visualizers
Storage
D1: users · sessions · upload quota
A key design call

The actual ads data never leaves the browser. Parsing, aggregating, and rule-evaluation all run client-side through DuckDB-WASM in a Web Worker — full SQL over your files, on your machine. 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:

📊

60-Day Bulk File Summary

Rolls a single 60-day bulk-operations export into clean campaign, ad-group, target, search-term, and placement metrics — the whole account at a glance.

📈

4-Month Time-Series

Weekly trend lines, Pareto (80/20) analysis, and month-over-month comparisons built from daily report data — spot the drift before it becomes a problem.

🔍

Audit Insights

Automatically detects match-type conflicts, missing exact-match keywords, and structural gaps across the account — the manual audit, done for you.

🧮

Custom Analysis Studio

Drag-and-drop pivot tables, formula columns, custom rules, and charts on any CSV or Excel file — your own ad-hoc analysis, no spreadsheet gymnastics, no code.

⚖️

Compare Periods

Side-by-side analysis of two date ranges that auto-flags the improvements and regressions — answer "did last month's changes actually work?" in seconds.

🎯

Rule-Based Optimization

Build custom bid rules, pause bleeding terms, and negate wasteful keywords — then export a ready-to-upload Amazon bulk file. Insight becomes action in one click.

🌳

Ads Structure Analysis

Interactive tree map of Portfolio → Campaign → Ad Group → Target with live status indicators on every node — the account architecture 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.

⚡ What's new in the latest release

The analytical engine moved to DuckDB-WASM — full SQL running entirely in the browser — so the dashboard now chews through 149K+ rows in under two seconds. Two new modules shipped alongside it: a Custom Analysis Studio for drag-and-drop pivots, formula columns, and charts on any file, and Compare Periods for instant period-over-period diffing of wins and regressions.

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