Back to portfolio

Customer Support X-ray v2 - From Broadcast to Sniper

Turns a viral AI teardown tool into a targeted lead machine: cheap tech-fingerprint qualification feeds a Claude-powered pipeline that finds, scores, and ranks the exact e-commerce stores most likely to buy - all surfaced in a team dashboard backed by live conversation listening.

Problem

v1 was a broadcast play: a free public tool that generates AI-powered support-page teardowns for any store and makes them shareable. It worked, but "going viral" is an unfocused strategy. The sharper question is which 200 stores to actually talk to this week, and what to say - and v1's Vercel KV storage couldn't support the querying, filtering, or multi-writer access needed to answer it. Two concrete gaps had to be closed. First, the Claude teardown is expensive; spending it on bad-fit stores wastes budget and time. Second, there was no way to listen for buying-intent signals across the web - unhappy customers venting on Reddit, HN threads about support tooling, or 1-star reviews of competitor helpdesk apps - and route those signals to a salesperson in one click. A third, structural problem: v1 had one writer (the web app) and KV as its store. v2 needs a Python collector fleet, batch jobs, and a team dashboard all reading and writing the same data with real SQL queries and row-level security. That meant migrating off KV entirely - carefully, against a live dataset, with a migration template that turned out to be wrong in two silent-failure ways.

Solution

The core architecture is two engines feeding one Postgres database. The distribution sniper starts from any CSV of candidate domains, runs cheap tech-fingerprint qualification (one HTTP GET per row, no LLM) to score ICP fit - stores running subscriptions and a helpdesk score highest - and only then fires the Claude teardown on the keepers. Two real-vertical runs produced 24 teardowns exclusively from score-9 stores, all good-fit, 60 - 72% automatable, with the dashboard's filter-and-sort view serving directly as the sales queue. Conversation listening adds a second intake channel. A Hacker News monitor runs on a daily GitHub Actions cron via the open Algolia API. A competitor-review scraper mines public Shopify App Store reviews for seven CS apps, keeps the painful ones, and records the reviewing store as a named, in-market lead - 59 leads on one run, 33 resolvable to live Shopify domains. A "Run X-ray" button on each dashboard review card turns "this store hates its helpdesk" into a personalized teardown in one click. A Reddit collector is written and compliant but parked behind a pending API access application, since Reddit's JSON and RSS endpoints block datacenter IPs and self-service Data API access closed in November 2025. Engineering robustness shaped the whole build: a schema-optional dashboard query gracefully degrades when a new column hasn't been migrated yet; all collectors support --dry-run to validate secrets before writing; a hand-written Supabase Database type restores real row/insert types the untyped client loses; and every known wall (Reddit 403s, Anthropic egress drops from shared GitHub runner IPs, the wrong App Store slug) is documented explicitly so no future engineer rediscovers them silently.

Tech Stack

Next.js 16App RouterTypeScriptTailwind v4shadcnAnthropic Claudeclaude-sonnet-4-6SupabasePostgresSupabase AuthRow-Level SecurityPythonGitHub ActionsVercelAlgolia APIPRAW

Ask about Julian Walder

Grounded in his real work

Hi! I'm Julian Walder's assistant. Ask me anything about his work, projects, or background in AI.